본문으로 건너뛰기
Advertisement

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: 모든 컨트롤러에서 발생하는 예외를 전역적으로 처리합니다.

🎯 핵심 요점

  • 애너테이션은 설정의 생산성 을 높이고 코드를 간결하게 만듭니다.
  • 스테레오타입 애너테이션 을 통해 계층별 역할을 명확히 구분하는 것이 좋습니다.
  • 각 애너테이션이 컴파일 시점 에 작용하는지, 런타임 시점 에 리플렉션을 통해 작용하는지 이해하면 깊이 있는 학습이 가능합니다.
Advertisement