본문 바로가기
개발/Web

[Spring] Bean 등록 방법 : @Bean vs @Component 차이

by ynzu🤍 2022. 2. 3.
반응형

 

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이 달라서 바꿔서 사용할 수 없다! 

 

 

728x90
반응형

댓글