개발하면서 Component와 Configuration 어노테이션은 많이 만났었지만 이 글을 작성하기 전에는
- @Configuration 은 설정 클래스에 사용하는 어노테이션
- @Component는 Bean 클래스에 사용하는 어노테이션
정도로만 알고 있었습니다. 하지만 공부하다 보니 모호하게 알고 있던 부분을 좀 더 알게 되었고, 이 내용을 기록해 봅니다.
# 비교
@Component
- @ComponentScan 을 통해 검색됩니다.
- @SpringBootApplication에 래핑 되어 있기에 일반적으로는 신경 쓰지 않아도 됩니다.
- 용도에 맞춘 스테레오 타입의 어노테이션을 가지고 있습니다.
- @Controller @Service @Repository @Configuration
- 가능하면 스테레오 타입을 사용합니다.
- @Bean 과는 차이점이 있습니다.
- 둘다 Bean을 생성한다는 것에서는 같지만 @Component는 class level에서, @Bean 은 method level에서의 어노테이션입니다.
- @Component는 Bean의 클래스 소스가 편집 가능할 때, @Bean 은 인스턴스 화할 코드가 수동으로 작성됨으로 외부 라이브러리나 써드파티 클래스도 Bean으로 등록이 가능합니다.
@Configuration
- @ComponentScan 을 통해 검색됩니다.
- @Configuration 도 @Component의 한 종류이기 때문입니다.
- 각종 스프링 인터페이스의 구현에 함께 활용됩니다.
여기까지만 보면 잘 모르고 혼용해서 써도 애플리케이션이 돌아는 갑니다.
하지만 Bean 을 생성하는 방법에서는 차이가 있습니다.
# Bean을 생성하는 방법
1. @Component
@Component
public class SimpleComponent {
}
2. @Bean (in @Configuration)
@Configuration
public class SimpleConfigBean {
@Bean
public SimpleClass1 simpleComponent1() {
return new SimpleClass1();
}
}
3. @Bean (in @Component): Lite Mode
@Component
public class SimpleComponentBean {
@Bean
public SimpleClass2 simpleComponent2() {
return new SimpleClass2();
}
}
Spring에서는 기본적으로 Bean을 등록할 때 proxy를 사용합니다.
하지만 Lite Mode 는 실제 인스턴스를 생성하기에 proxy 가 필요한 Spring 기능들을 사용할 수 없습니다. (AOP 등)
따라서 이 차이를 알고 필요한 곳에서만 특정 목적으로 사용해야 합니다.
'Study' 카테고리의 다른 글
'수십억건에서 QUERYDSL 사용하기' 를 보고.. (2) | 2021.12.19 |
---|---|
String 을 잘 써보자 (0) | 2021.10.16 |
mongoDB tutorials (0) | 2021.05.18 |
API Versioning 전략 (0) | 2021.04.14 |
토끼책을 읽고 - 메시지를 믿을 수 있을까? (2) (0) | 2021.03.08 |