궁금증 ❓
둘 다 Spring Bean으로 등록해 주는 어노테이션이지만 무엇이 다를까라는 의문점이 생겼다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
Application.java 클래스안에 @SpringBootApplication 이 클래스 위에 선언되어있을 것이고, 위에 코드는 @SpringBootApplication 내부를 살펴본것이다.
빨간색 밑줄 친 @ComponentScan을 통해 스프링은 애플리케이션 실행 시 모든 하위 패키지 안에서 스프링 빈으로 등록할 객체들을 스캔해준다.
스프링 빈으로 객체를 어떻게 등록하는지?
@Component어노테이션을 활용@Bean어노테이션을 활용
@Component
- 클래스 위에만 선언 가능하다.
- 내가 직접 만든 클래스를 빈으로 등록해줄 수 있다.
@Controller, @Service, @Repository등등 어노테이션 내부 안@Component가 존재
//컨트롤러
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
//서비스
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
}
//레포지토리
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
}
@Bean
- 클래스 위에 선언 불가
@Bean사용하는 클래스는 해당 클래스에@Configuration을 클래스 위에 명시해주어야 한다. (@Configuration도 결국@Component로 구성되어 있다.)@Bean은 메서드 위에 선언 가능 하다.@Configuration이 명시되어있다면 클래스 안에 여러@Bean을 만들 수 있다.
@Component // Component 클래스를 스프링 빈으로 등록해줘!
public class Component{
}
@Configuration // 명시해주면 여러개 Bean을 등록 가능
public class Component{
@Bean // MyBean 클래스를 스프링 빈으로 등록해줘!
public void MyBean(){
return new MyBean();
}
@Bean // MyBean2 클래스를 스프링 빈으로 등록해줘!
public void MyBean2(){
return new MyBean2();
}
정리
[ @Bean, @Configuration ]
- 개발자가 직접 제어가 불가능한 외부 라이브러리 또는 설정을 위한 클래스를 Bean으로 등록할 때 @Bean 어노테이션을 활용
- 1개 이상의 @Bean을 제공하는 클래스의 경우 반드시 @Configuration을 명시해 주어야 함
[ @Component ]
- 개발자가 직접 개발한 클래스를 Bean으로 등록하고자 하는 경우 @Component 어노테이션을 활용
'SpringBoot' 카테고리의 다른 글
| @EventListener을 통해 객체 간 결합도 낮추기 (0) | 2023.04.04 |
|---|---|
| SpringBoot + S3 연동하여 이미지 올리기 (2) | 2023.04.04 |
| 스프링 예외 처리 Guide (0) | 2023.04.04 |
| SpringBoot + STOMP 웹소켓 고도화 (0) | 2023.04.03 |
| SpringBoot + STOMP 웹소켓 구현 (0) | 2023.04.03 |