
패스트캠퍼스 김은호 강사님께서 @Component와 @Configuration의 사용 용도를 정확히 알아두는 것이 좋다고 하셔서, 강의 내용을 이해한대로 정리해 보도록 하겠습니다.
"이 클래스는 커스텀 빈이다."
컴포넌트는 클래스에 붙어서 클래스를 커스텀 빈으로 만들어주는 어노테이션입니다. 컴포넌트 스캔으로 컴포넌트들이 빈으로 등록될 때, 필요한 의존성 등이 모두 주입되거나 하는 내용은 모두 배웠습니다. 그리고 빈으로 등록할 때 @Component, @Bean 어노테이션이 쓰이는 것도 정리 했었습니다. 아래 코드를 우선 살펴 보겠습니다.
@Component
public class BubbleSort<T extends Comparable> {
...
}
@Comfiguration
public class Config {
@Bean
public Sort<String> bubbleSort() {
...
}
}
@Component
public class Config {
@Bean
public Sort<String> bubbleSort() {
...
}
}
Lite Mode로 등록한 빈은 Proxy Bean으로 만들지 않고 그대로 new를 하는 특성이 있습니다. 그대로 new를 하기 때문에 Lite Mode Bean은 주입될 때마다 새로운 객체가 생성된다는 것입니다. 이름이 Lite(가벼운)인 이유는 일반적으로 Proxy Bean을 만드는 것이 Lite Mode로 만드는 것보다 느리기 때문입니다. 생성은 빠르지만 Proxy Bean이 가진 기능들을 사용하지는 못합니다.
Proxy Bean을 사용해야 Spring의 기능을 온전히 사용할 수 있기 때문에 일반적으로는 Proxy Bean을 사용해야 합니다. 하지만 해당 Bean이 어디에 사용될지를 정확히 알고 있고, Proxy의 기능이 사용되지 않아도 됨이 보장된다면 일종의 튜닝 개념으로 Lite Mode를 사용할 수 있습니다.
Component와 Bean을 우선 비교해 보겠습니다.
둘의 가장 큰 차이점 : Bean으로 등록하려는 소스 코드가 내 것이냐, 아니냐
Component는 내 소스에 직접 붙임 Bean은 내가 짠 코드에도 붙일 수는 있지만 그럴 이유는 없고, 서드 파티 라이브러리에 주로 붙여 사용
"이 클래스는 각종 빈 설정을 담고 있다."
@Configuration도 @Component의 하나의 스테레오 타입이라고 볼 수 있습니다(@Controller, @Service 같은). 설정용으로 만든 빈이기 때문입니다.
"어노테이션이 의도에 맞게 사용되었는지 잘 봐주자"
Spring은 의도에 맞는 @Component 스테레오 타입을 많이 제공해 주고 있습니다. @Configuration을 @Component로 교체하여도 Spring이 빈으로 이해하여 동작하지만, 의도를 특정하지는 못하게 됩니다.