이전 포스팅에서 스프링에서 DI 와 IoC를 사용하기 위해서는 스프링에 Bean을 등록해줘야하고 그에 대한 내용은 아래 참고포스팅에서 알아볼수 있다.
하지만 스프링을 다루기 위해서는 가장 중요한 부분이라서 다시 한번 정리를 할겸 포스팅을 또 한번 다뤄보게 되었다.
수동으로 등록을 할수도 있고, 자동으로 등록해줄수 있다.
수동 방법은 다음과 같다.
@Configuration public class ResourceConfig { @Bean public class classname() { return new NiceResource(); } } |
이렇게 @Bean을 통해서 수동으로 넣어줄수 있고,
Bean이 있는 class에는 Configuration annotation을 달아줘야한다.
물론 Configuration 안에 Component 가 들어있어서 같은 기능이 되긴 하겠지만 configuraion annotation안에서 해줘야만 한다.
그 이유는 CGLib으로 프록시 패턴을 적용해 수동으로 등록하는 스프링 빈이 반드시 싱글톤으로 생성됨을 보장하기 위해서이다.
무슨 뜻이냐면 실수로 같은 Bean을 호출하게 될 경우 Component 는 불필요하게 여러개의 객체를 생성하는데
Configuration에서는 CGLib 라이브러리를 사용하여 프록시 패턴을 적용시킨다.
패턴 관련해서는 아래 참고 포스팅을 확인하길 바란다.
만약에 경우에따라 여러개의 빈을 생성해줘야할경우 싱글톤을 꺼줘야하는데 그럴 경우엔 Configuration의 설정중 ProxyBeanMethods를 false로설정을 해주면 된다.
자동 방법은 다음과같다.
@Component annotation을 사용하는것이다.
해당 annotation을 사용하면 다른 class에서 annotation이 사용되고 있는 곳을 찾아서(@Service, @Repository, @RestController 등) 해당 클래스를 Bean으로 등록해준다.
특정 패키지에서 찾고 싶으면 ComponentScan을 main 메서드에 선언을 해주면 되고 springboot에서는
@SpringBootApplication annotation이 componentScan기능을 내장하고 있다.
두 방법의 비교 차이 요약은 다음과 같다.
- @Bean, @Configuration
- 수동으로 스프링 컨테이너에 빈을 등록하는 방법
- 개발자가 직접 제어가 불가능한 라이브러리를 빈으로 등록할 때 불가피하게 사용
- 유지보수성을 높이기 위해 애플리케이션 전범위적으로 사용되는 클래스나 다형성을 활용하여 여러 구현체를 빈으로 등록 할 때 사용
- 1개 이상의 @Bean을 제공하는 클래스의 경우 반드시 @Configuration을 명시해 주어야 싱글톤이 보장됨
- @Component
- 자동으로 스프링 컨테이너에 빈을 등록하는 방법
- 스프링의 컴포넌트 스캔 기능이 @Component 어노테이션이 있는 클래스를 자동으로 찾아서 빈으로 등록함
- 대부분의 경우 @Component를 이용한 자동 등록 방식을 사용하는 것이 좋음
- @Component 하위 어노테이션으로 @Configuration, @Controller, @Service, @Repository 등이 있음
참고 포스팅
https://thenicesj.tistory.com/269
https://thenicesj.tistory.com/147
'IT > Java' 카테고리의 다른 글
enum 이란 (36) | 2022.09.17 |
---|---|
Spring REST Docs (33) | 2022.09.09 |
javadoc 관련 (33) | 2022.09.03 |
Mybatis 3.0 이상 적용하기 (43) | 2022.09.02 |
Spring Batch (part 1. 소개) (40) | 2022.08.25 |
댓글