Spring으로 개발을 하다보면 @Bean과 @Component를 언제 써야할지 헷갈릴때가 있다.
위 코드를 보면 알수있는데 @Bean의 경우 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용된다.
(예를 들면 ObjectMapper의 경우 ObjectMapper Class에 @Component를 선언할수는 없으니 ObjectMapper의 인스턴스를 생성하는 메소드를 만들고 해당 메소드에 @Bean을 선언하여 Bean으로 등록한다.)
반대로 개발자가 직접 컨트롤이 가능한 Class들의 경우엔 @Component를 사용한다.
그럼 개발자가 생성한 Class에 @Bean은 선언이 가능할까?
정답은 No 이다.
@Bean과 @Component는 각자 선언할 수 있는 타입이 정해져있어 해당 용도외에는 컴파일 에러를 발생시킨다.
(@Target이 METHOD로 지정되어 있지만, TYPE은 없다)
(@Target이 TYPE로 지정되어 Class위에서만 선언될수 있음을 알수 있다.)
정리하기
Component와 @Bean은 전혀 다르다.
@Component를 스캔하여 Class를 Bean으로 등록함에도, @Bean과는 다르다.
@Component는 Class Level에서, @Bean은 Method Level에서 적용된다.
@Component는 Class와 Bean이 One to One 관계를 갖는 반면 메소드는 그렇지 않다.
@Bean은 사용자가 컨트롤 하지 못하는 Class나, 좀 더 유연하게 객체를 생성해서 넘기고 싶을 때,
@Component는 Class 자체를 빈으로 등록하고 싶을 때, 사용하면 된다고 이해했다.
@Component
public class MyClass {}
@Configuration
public class ApplicationConfig{
@Bean
public MyClass myClass(String param){
return new MyClass(param);
}
}
@SpringBootApplication
마법이 일어나는 것 같지만, 사실 @SpringBootApplication이 @Configuration, @ComponentScan을 상속받고 있다.
덕분에 스프링이었으면 신경써야했던 설정 파일을, 부트에서는 신경 안쓰고도 @Bean, @Component를 사용할 수 있다.
사실 Application 하위 전체가 다 Configuration이었던 것이다.
참조 사이트 : jojoldu.tistory.com/27
참조 사이트 : ecsimsw.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88
'SPRING > 기본 상식' 카테고리의 다른 글
[SPRING] 빈 스코프 (싱글 스코프, 프로토타입 스코프) (0) | 2021.04.28 |
---|---|
[SPRING] 조회 빈이 2개 이상 일 때 해결 방법 (0) | 2021.04.27 |
[SPRING] SPRING AOP (0) | 2021.04.14 |
[SPRING] 스프링 컨테이너 (싱글톤 패턴 개선) (0) | 2021.04.13 |
[SPRING] EJB(Enterprise Java Bean) (0) | 2021.04.13 |