Spring Boot 🌼 어노테이션
Annotation
Annotation은 사전적 의미로는 주석이라는 뜻이다.
자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다.
예약어 앞에 @를 붙여 사용한다.
SpringBoot Annotation
Spring에서는 다양한 어노테이션을 제공한다. 이러한 어노테이션은 필드, 메서드, 클래스에 적용되며 Bean 등록, 의존성주입, urlMapping, MVC 패턴 적용등의 역할을 한다.
주요 Annotation
@SpringBootApplication : SpringBoot 어플리케이션을 시작하는 main 클래스에 적용하는 어노테이션@ComponentScan, @EnableAutoConfiguration, @SpringBootConfiguration 등을 포함하고 있다.
해당 어노테이션으로 인해 main Class 이하 패키지에 포함된 컴포넌트 또는 클래스들을 자동으로 Bean 으로 등록 시켜준다.@SpringBootApplication public class ApiTestApplication { public static void main(String[] args) { SpringApplication.run(ApiTestApplication.class, args); } }
@Configuration : @Configuration 어노테이션이 적용된 설정 클래스를 스캔하여 빈 구성을 로드하고 애플리케이션 컨텍스트에 등록한다.
@Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); } }
@Autowired : DI(Dependency Injection) 대상으로 지정, 필드, 생성자, setter 메서드에 적용하여 DI를 할 수 있다.
@Service public class RestApiServiceLogic implements RestApiService { private final RestApiRepository apiRepository; @Autowired public RestApiServiceLogic(RestApiRepository apiRepository) { this.apiRepository = apiRepository; }
@Bean : @Configuration 내부에서 사용되며, 메소드 단위로 사용한다. 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용된다. 사용시 해당 객체를 반환하는 getter와 비슷한 메소드를 만들고 리턴에 new를 붙여 생성과 리턴한다. Bean id를 지정하지 않을 경우 메서드의 이름을 camelCase로 변경한것이 bean id로 지정된다.
@Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); } }
@Component : 클래스를 @ComponentScan의 대상으로 지정한다. 해당 클래스를 스캔되면 자동으로 Bean 등록이 된다.
@Component public class comTest { }
@ComponentScan : 스캔에 대한 범위를 지정하고 해당 패키지를 스캔하여 @Component 어노테이션이 붙은 Class들을 Bean 등록하거나 제외 시킨다.
@Configuration @ComponentScan("com.api.") public class comScaner { }
@RequestMapping : 요청 URL과 메핑되는 메서드를 지정하는 어노테이션
@RequestMapping("/logout") public void logout(){ }
만약 클래스 레벨에 적용시킬 경우 공통 URL 경로를 지정할 수 있다.
@RestController @RequestMapping("/member") public class RestApiController { @RequestMapping("/logout") // "/member/logout" public void logout(){ }
@GetMapping : RequestMapping과 유사하지만 Post, Put, Patch등 메서드에 따라 구체적으로 지정할 수 있다.
@GetMapping("/request") public String postmanTest(){ return ""; }
@Controller : URL mapping 관련 어노테이션 및 모델 및 뷰에 데이터를 반환하는 ModelAndView 등 View와 Model을 잇는 MVC패턴중 Controller 클래스에 사용된다.
@Controller public class RestApiController { ... }
@ResponseBody : 메서드의 반환값을 JSON, XML로 할때 사용한다. HTTP 응답 body에 직접 쓰기위해 사용됨.
@GetMapping("/request") @ResponseBody public String postmanTest(){ return "asd"; }
@RestController : @ResponseBody와 @Controller가 결합된 형태, RESTful 웹 서비스 컨트롤러 클래스를 정의함. 메서드가 반환하는 데이터를 HTTP body에 쓰기 위해 사용된다. 데이터를 View로 응답하지 않기때문에 API 구현시 사용하며, 모든 메서드에 @ResponseBody를 적용한다.
@RestController public class RestApiController { ... }
@Service : streotype 중 하나, 비즈니스 로직을 담당하는 Service 클래스를 나타냄. Bean 등록, DI, @Transactional 어노테이션을 이용한 트랜잭션을 관리할 수 있다.
@Service public class RestApiServiceLogic { ... }
@Repository : streotype 중 하나, 데이터 액세스 클래스로 사용되며 데이터베이스와 상호작용 기능을 제공한다. DataAccessException 를 사용하여 예외처리 및 로깅을 보다 쉽게 할 수 있다.
@Repository public class RestApiRepositoryLogic{ ... }
@Slf4j : Logger 객체 생성 없이 바로 log.debug()로 로그를 찍어볼 수 있다.
@Slf4j public class apiTest{ public void testMethod(String msg){ log.debug("msg : " + msg); } }
AOP에서 사용하는 Annotation
AOP에서 사용되는 Annotation
@Aspect : AOP 클래스를 정의하는 어노테이션@Aspect class A{ }
@Before : 메서드를 실행하기 이전에 작동될 함수로 지정한다.
@Before("b()") public void test2(){ }
@After : 메서드를 실행한 이후에 작동될 함수로 지정한다.
@After Returning("b()") public void test3(){ }
@Around : 타겟 메서드 실행 전후로 적용될 함수를 지정한다.
@Around("b()") public void test(){ }
@Pointcut : AOP를 적용시킬 지점을 설정해주는 함수
@Pointcut("execution(* com.test)") public void serviceMethods() { }
@AfterReturning : 메서드 호출 성공시 적용될 함수를 지정한다.
@After Returning("b()") public void test3(){ }
@AfterThrowing : 메소드 호출시 예외발생시 실행할 함수를 지정한다.
@After Throwing("b()") public void test4(){ }
Lombok에서 사용하는 Annotation
Lombok은 반복되는 Getter, Setter, 생성자, toString, builder 등 여러 메소드를 어노테이션으로 처리해주는 라이브러리다.
주로 Model 클래스에서 사용하게 되는데, 해당 어노테이션을 붙이면 Getter, Setter와 같은 메서드가 자동생성된다.
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int userNo;
private String userId;
private String userPw;
}
@Getter : 필드 변수들의 Getter를 자동으로 생성한다.
@Setter : 필드 변수들의 Setter를 자동으로 생성한다.
@AllArgsConstructor : 모든 필드 변수들이 포함된 생성자를 생성한다.
@NoArgsConstructor : 기본 생성자를 자동으로 생성한다.
@Builder : Builder 패턴을 사용하기 위한 어노테이션. 메서드체이닝을 사용한 가독성 있는 객체 생성가능
-※ @AllArgsConstructor와 충돌이 발생할 수 있기때문에 사용시 기본생성자를 생성하거나 해당 어노테이션을 사용하지 말아야한다.
이처럼 필드에 메소드를 작성하지 않더라도 라이브러리로 인해 Getter, Setter등 어노테이션이 있다면 자동으로 작성된다.