1.4 스프링 주요 애너테이션(Annotation) 총정리
스프링 프레임워크는 설정의 상당 부분을 애너테이션을 통해 처리합니다. 각 용도별 주요 애너테이션들을 한눈에 보기 쉽게 정리했습니다.
@RestController // 1. 컨트롤러 선언
@RequiredArgsConstructor // 2. 생성자 자동 생성 (DI)
public class HelloController {
private final HelloService helloService; // 3. 의존성 주입 대상
@GetMapping("/hello") // 4. HTTP GET 매핑
public String hello() { return helloService.greet(); }
}
1. 스테레오타입 (Bean 등록 관련)
스프링 컨테이너가 해당 클래스를 관리할 Bean으로 인식하게 만드는 애너테이션들입니다.
- @Component: 기본적인 스프링 관리 컴포넌트입니다. (
@Component public class MyTool { ... }) - @Service: 비즈니스 로직을 담당하는 클래스에 사용합니다. (
@Service public class OrderService { ... }) - @Repository: 데이터 계층(DAO) 클래스에 사용하며, DB 예외를 스프링 예외로 변환해줍니다. (
@Repository public interface MemberRepository { ... }) - @Controller: 전통적인 MVC의 View를 반환하는 컨트롤러에 사용합니다.
- @RestController: JSON/XML 등 데이터를 반환하는 REST API용 컨트롤러에 사용합니다. (
@RestController = @Controller + @ResponseBody)
2. 의존성 주입 (DI) 관련
- @Autowired: 스프링 컨테이너에 등록된 빈을 의존 관계에 따라 자동으로 주입합니다. (
@Autowired private MyService service;) - @Qualifier: 같은 타입의 빈이 여러 개 있을 때, 주입할 빈의 이름을 지정합니다. (
@Qualifier("kakaoPayService")) - @Bean: 메서드가 반환하는 객체를 스프링 빈으로 등록합니다.
- 언제 쓰나요?: 직접 제어할 수 없는 ** 외부 라이브러리를 빈으로 만들 때, 또는 ** 복잡한 초기화 로직이 필요할 때 사용합니다.
- @Configuration: 스프링 설정 클래스임을 명시하며, 이 안에서 하나 이상의
@Bean을 정의합니다.
@Configuration
public class AppConfig {
@Bean // 일반적인 객체 등록
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean // 함수형 인터페이스(함수형 빈) 등록 예시
public Function<String, String> upperCaseFunction() {
return (input) -> input.toUpperCase();
}
}
🔍 @Component vs @Bean 차이점
| 구분 | @Component | @Bean |
|---|---|---|
| 대상 | 클래스 (Class) | 메서드 (Method) |
| 사용처 | 내가 직접 만든 클래스 | 외부 라이브러리, 설정 클래스 내부 |
| 자동 등록 | 컴포넌트 스캔에 의해 자동 등록 | 개발자가 코드로 직접 인스턴스 반환 |
3. 스프링 MVC (웹 요청 처리) 관련
- @GetMapping, @PostMapping: 특정 HTTP 메서드 요청을 매핑합니다. (
@GetMapping("/list")) - @PathVariable: URL 경로에 포함된 변수 값을 추출합니다. (
/users/{id}->@PathVariable Long id) - @RequestParam: 쿼리 파라미터나 폼 파라미터 값을 추출합니다. (
?name=abc->@RequestParam String name) - @RequestBody: HTTP 요청 본문(JSON 등)을 자바 객체로 변환합니다. (
@RequestBody UserDto dto) - @ResponseBody: 자바 객체를 HTTP 응답 본문에 담아 전송합니다.
4. 라이프사이클 및 설정 관련
- @PostConstruct: 의존성 주입이 완료된 후 실행될 초기화 메서드에 설정합니다. (
@PostConstruct public void init() { ... }) - @PreDestroy: Bean이 소멸되기 직전(컨테이너 종료 전)에 실행될 메서드에 설정합니다. (
@PreDestroy public void close() { ... }) - @Value: 설정 파일(
application.yml)에서 값을 읽어 필드에 주입합니다. (@Value("${api.key}") private String key;) - @PropertySource: 외부 설정 파일(.properties)을 로드하여 사용합니다. (
@PropertySource("classpath:db.properties")) - @Lazy: Bean의 초기화 시점을 실제 사용할 때까지 지연시킵니다. (
@Lazy @Component class HeavyObj { ... }) - @Scope: 빈의 생명주기 범위를 지정합니다. (
@Scope("prototype") @Bean ...)
5. 스프링 부트 전용
- @SpringBootApplication: 스프링 부트 애플리케이션의 시작점임을 명시하며, 자동 설정과 컴포넌트 스캔을 활성화합니다.
- @ConfigurationProperties: 설정 파일의 값들을 필드에 계층적으로 바인딩할 때 사용합니다. (
@ConfigurationProperties(prefix = "mail") class MailProp { ... })
6. 기타 중요 애너테이션
- @Transactional: 데이터베이스 트랜잭션의 유지 범위를 지정합니다. (
@Transactional(rollbackFor = Exception.class)) - @Valid / @Validated: 제약 조건 애너테이션을 검증하도록 트리거합니다. (
@Valid UserDto dto) - @ExceptionHandler: 특정 컨트롤러 내에서 발생하는 예외를 개별 처리합니다. (
@ExceptionHandler(UserException.class)) - @RestControllerAdvice: 모든 컨트롤러에서 발생하는 예외를 전역적으로 처리합니다.
🎯 핵심 요점
- 애너테이션은 설정의 생산성 을 높이고 코드를 간결하게 만듭니다.
- 스테레오타입 애너테이션 을 통해 계층별 역할을 명확히 구분하는 것이 좋습니다.
- 각 애너테이션이 컴파일 시점 에 작용하는지, 런타임 시점 에 리플렉션을 통해 작용하는지 이해하면 깊이 있는 학습이 가능합니다.