Spring Framework를 사용할 때, 다양한 애노테이션을 통해 애플리케이션을 효율적으로 구성하기 때문에 자주 사용하는 애노테이션들을 정리해봤다.
1. @Configuration
- @Bean 애노테이션을 통해 메서드에서 반환되는 객체를 Spring Bean으로 등록한다.
- Java 기반 설정 파일을 활용하면 애플리케이션 구성을 유연하게 관리할 수 있다.
2. @ComponentScan
- 역할: 애노테이션을 사용해 특정 패키지에서 컴포넌트를 스캔한다.
- 기능: 지정된 패키지와 하위 패키지에 있는 @Component, @Service, @Controller, @Repository 애노테이션이 붙은 클래스를 스캔한다.
@Configuration
@ComponentScan(basePackages = "com.example.movieapp")
public class MovieAppConfig {
}
- 패키지를 명시하지 않으면 현재 클래스의 패키지를 기준으로 스캔한다.
- 하위 패키지도 자동으로 포함되기 때문에 전체 구조를 한 번에 스캔할 수 있다.
3. @Component
- 역할: Spring Bean으로 등록할 때 사용함
- 특징:
1) @Component는 가장 일반적인 컴포넌트 애노테이션으로, 클래스가 Spring Bean임을 나타낸다.
2) @Service, @Repository, @Controller는 @Component를 역할별로 확장한 애노테이션이다.
4. @Service
- 역할: 비즈니스 로직을 처리하는 클래스에 사용
- 특징:
1) 주로 서비스 계층에서 사용하는 컴포넌트를 정의할 때 쓴다.
2) 실제로 @Component와 동일하게 동작하지만, 비즈니스 로직임을 명시적으로 나타내기 위해 사용한다.
5. @Controller
- 역할: HTTP 요청을 처리하는 컨트롤러 클래스에 사용, 웹 애플리케이션과 REST API에 컨트롤러를 정의하는 데 사용
- 특징:
1) MVC 패턴에서 컨트롤러 역할을 한다.
2) REST API를 정의할 때는 @RestController를 사용한다.
6. @Repository
- 역할: 데이터베이스 접근 계층을 정의할 때 사용
- 특징: DAO(Data Access Object) 클래스를 나타내며 DB 예외를 Spring의 예외로 변환하는 데 도움을 준다.
7. @Primary
- 역할: 동일한 타입의 여러 Bean 중 기본으로 선택될 Bean을 지정한다.
@Primary
@Bean
public Movie horrorMovie() {
return new HorrorMovie();
}
8. @Qualifier
- 역할: 특정 Bean을 선택해서 의존성을 주입할 때 사용
- 특징:
@Primary는 기본 Bean을 지정하지만, @Qualifier는 더 세부적으로 특정 Bean을 명시할 수 있다.
@Bean
public Movie horrorMovie() {
return new HorrorMovie();
}
@Bean
public Movie actionMovie() {
return new ActionMovie();
}
@Autowired
public void setMovie(@Qualifier("actionMovie") Movie movie) {
this.movie = movie;
}
9. @Lazy
- 역할: 초기화를 지연시키고 싶을 때 사용함
- 특징:
Spring Bean은 기본적으로 애플리케이션 컨텍스트가 시작될 때 초기화되지만, @Lazy를 붙이면 필요할 때 초기화한다. 클래스 또는 메서드 단에서 사용가능하다.
@Lazy
@Component
public class ExpensiveMovieProcessor {
}
10. @Scope
- 역할: Bean의 생명 주기를 지정하고 싶을 때 사용,
참고로 기본은 싱글톤 사용
- 종류:
1) singleton: 하나의 인스턴스를 공유.
2) prototype: 요청 시마다 새 인스턴스를 생성.
@Scope("prototype")
@Component
public class MovieSession {
}
11. @PostConstruct
- 역할: 의존성 주입 후 초기화 작업을 수행할 메서드를 지정함.
@Component
public class MovieDataLoader {
@PostConstruct
public void loadInitialMovies() {
}
}
12. @PreDestroy
- 역할: 컨테이너가 종료되기 전에 실행할 메서드를 지정할때 사용.
@Component
public class MovieResourceCleaner {
@PreDestroy
public void cleanUp() {
}
}
13. @Named
- 역할: CDI(Contexts and Dependency Injection)를 사용할 때 주로 사용함
- 특징: @Component와 비슷한 역할을 하지만, 표준 Java 애노테이션이다.
14. @Inject
- 역할: 의존성 주입을 할 때 이 CDI 애노테이션을 사용함
- 특징:
@Autowired와 거의 동일하게 동작한다.