Spring이 객체를 제어하기 위해서는 객체들이 Bean으로 등록되어 있어야 한다.
기존엔 xml을 통해 bean으로 등록했는데 Spring MVC에서는 @Controller, @Service, @Repository 등의 어노테이션을 통해 Spring Container에 Bean으로 등록할 수 있다.
그리고 Configuration 관련 객체는 @Bean과 @Component 어노테이션을 통해 Bean으로 등록할 수 있다.
여기서 @Bean과 @Component의 차이는 무엇일까?
@Bean
직접 컨트롤할 수 없는 외부 라이브러리를 Bean으로 등록하고 싶은 경우에 사용한다.
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
//생략
}
@Bean의 Target을 살펴보면 Method로 지정되어 있으며, Method Level에서 적용할 수 있다.
@Configuration을 선언한 클래스 내부에서 사용할 수 있는데, 개발자가 작성한 메소드를 통해 반환되는 객체를 Bean으로 등록해준다.
예를 들어 Session time out listener라던지 Lucy xss 필터를 적용할 경우 아래와 같이 @Bean 어노테이션을 선언해주면 된다. 해당 class는 개발자가 작성한 코드가 아니기때문에 class에 @Component 어노테이션을 붙일 수 없어서 메소드를 통해 객체를 반환시키고 반환된 객체가 Spring Bean에 등록되도록 한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public ServletListenerRegistrationBean<MySessionListener> listenerRegistrationBean() {
ServletListenerRegistrationBean<MySessionListener> bean = new ServletListenerRegistrationBean<>();
bean.setListener(new MySessionListener());
return bean;
}
@Bean
public FilterRegistrationBean<XssEscapeServletFilter> filterRegistrationBean() {
FilterRegistrationBean<XssEscapeServletFilter> filterRegistration = new FilterRegistrationBean<>();
filterRegistration.setFilter(new XssEscapeServletFilter());
filterRegistration.setOrder(1);
filterRegistration.addUrlPatterns("/*");
return filterRegistration;
}
}
@Component
직접 컨트롤가능한 class를 Bean으로 등록하고자 할 때 사용한다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
//생략
}
@Bean의 Target을 살펴보면 Type으로 지정되어 있으며 Class Level에서 적용할 수 있고, 스프링이 런타임시 컴포넌트스캔을 통해 자동으로 bean을 찾아 등록하게 된다.
이렇게 @Bean과 @Component는 Target이 달라서 바꿔서 사용할 수 없다!
'개발 > Web' 카테고리의 다른 글
[Web] Received fatal alert: handshake_failure 에러 (0) | 2022.03.08 |
---|---|
[Web] Restful API란? (1) | 2022.02.21 |
[Maven] 메이븐 repository에 없는 라이브러리 추가하기 (0) | 2022.02.03 |
[Spring] Spring Boot Admin 사용하기 - Log, Login 적용 (0) | 2022.01.25 |
[Web] XFF - Load balancers 혹은 Proxy 환경에서 Client IP 가져오기 (0) | 2022.01.20 |
댓글