스프링을 공부하다 문득 @Bean 과 @Component 의 차이에대해 궁금증이 생겨 알아보았고 그 내용을 정리해보고자 한다.
스프링 컨테이너에의해 생성, 관리되는 자바 객체(POJO(Plain Old Java Object))이며 기본적으로 싱글톤 형태로 생성, 관리 된다.
이 스프링 빈을 등록하는 방법에는 2가지가 있다.
1. 스프링 부팅 과정에서 스캔되어 바로 등록
@Component 어노테이션 사용.
대부분의 경우 @Component 를 사용하여 스프링 빈으로 등록하며 특별한 경우가 아니면 이 방법을 사용할 것이다.
ex) @Controller, @Service, @Repository ... (@Component 를 갖고 있는 어노테이션들)
스프링 DI 관련하여 문서에선 일반적으로 이 방법을 추천 함.
You are free to use any of the standard Spring Framework techniques to define your beans and their injected dependencies. We generally recommend using constructor injection to wire up dependencies and @ComponentScan to find beans.
If you structure your code as suggested above (locating your application class in a top package), you can add @ComponentScan without any arguments or use the @SpringBootApplication annotation which implicitly includes it. All of your application components (@Component, @Service, @Repository, @Controller, and others) are automatically registered as Spring Beans.
The following example shows a @Service Bean that uses constructor injection to obtain a required RiskAssessor bean:
2. 개발자가 처리하여 따로 등록
그럼 위에서 말한 @Component 어노테이션을 쓰지 않고 개발자가 따로 처리하여 등록하는 경우는 어떤 경우 일까?
1. 외부 라이브러리를 등록하여 사용할때
2. 객체의 property 값을 변경하여 등록하고 싶을때
등등..
부팅시 자동으로 컨테이너에 빈을 등록하지 않고 개발자가 따로 처리를 하여 등록하고 싶을때 이 방법을 사용한다.
그리고 @Bean 을 사용하기 위해선 @Configuration 과 같이 사용하여야 한다. 그래야 프록시 패턴이 적용돼 빈들이 싱글톤으로 관리될수 있기 때문이다. Cglib 를 활용해 Configuration 을 상속받은 프록시 객체가 따로 생성된다고 한다.
p.s 만약에 싱글톤으로 관리하고 싶지않은 경우엔 proxyBeanMethods 옵션을 사용하면 된다.
@Configuration(proxyBeanMethods = false)
public class ConfigBean{
...
}
참고자료
- https://mangkyu.tistory.com/75
- https://mangkyu.tistory.com/234
- https://jaeano.tistory.com/76
- https://tecoble.techcourse.co.kr/post/2023-05-22-configuration/
- https://cnu-jinseop.tistory.com/36
- https://sol-devlog.tistory.com/5
'IT > 스프링' 카테고리의 다른 글
[Spring] 스프링부트 AOP 구현 및 예제 (0) | 2023.10.20 |
---|---|
[Springboot] 스프링 AOP (Aspect Oriented Programming) 에 대해서 (0) | 2023.10.10 |
[java] JPA (Java Persistence API) 란? (0) | 2023.02.06 |