@Component와 @Bean의 차이

2021. 10. 5. 02:10 Spring Framework/Spring 입문 - 개념 및 핵심
  • Spring Annotation인 @Component @Bean의 차이에 대해 알아보자.

차이점

@Bean
public ObjectMapper objectMapper(){
    return new ObjectMapper();
}
@Component
public class CustomMapper{
    ...
}
  • @Bean의 경우
  • 개발자가 컨트롤이 불가능한 외부 라이브러리들을
  • Bean으로 등록하고 싶은 경우에 사용된다.

 

  • 예를 들면 ObjectMapper의 경우
  • ObjectMapper Class에 @Component를 선언할 수 없으니
  • ObjectMapper의 인스턴스를 생성하는 메소드를 만들고
  • 해당 메소드에 @Bean을 선언하여 Bean으로 등록한다.

 

  • 반면 개발자가 직접 컨트롤이 가능한 Class들의 경우엔
  • @Component를 사용한다.

질문

Q. 개발자가 생성한 Class에 @Bean은 선언이 가능할까?

  • No !

 

  • @Bean과 @Component는
  • 각각 선언할 수 있는 타입이 정해져있어
  • 해당 용도외에 선언에는 컴파일 에러가 발생한다.

 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {
   /**
    * The value may indicate a suggestion for a logical component name,
    * to be turned into a Spring bean in case of an autodetected component.
    * @return the suggested component name, if any (or empty String otherwise)
    */
   String value() default "";
}
  • @Target이 TYPE로 지정되어 Class에만 사용이 가능하다.

 

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
   /**
    * Alias for {@link #name}.
    * <p>Intended to be used when no other attributes are needed, for example:
    * {@code @Bean("customBeanName")}.
    * @since 4.3.3
    * @see #name
    */
   @AliasFor("name")
   String[] value() default {};
  • 사용할 수 있는 타입은
  • ElementType.METHOD, ElementType.ANNOTATION_TYPE 이다.

Summary

  • @Component는
  • 선언된 클래스를 Bean으로 만드는거고
  • @Bean은 반환하는 객체를 Bean으로 만드는 것이다.

 

@Bean

  • @Bean은
  • setter나 builder 등을 통해서
  • 사용자가 프로퍼티를 변경해서 생성한 인스턴스를
  • Spring에게 관리하라고 맡기는 것이다.

 

@Component

  • @Component는
  • 클래스를 Spring에게 알아서
  • 인스턴스 생성  Bean 등록 하는 과정을 맡기는 것이다.

 

출처 : https://goodgid.github.io/Spring-Component-vs-Bean/