프로그래밍 공부/Spring

[Spring] @Component vs @Bean

저번 포스팅 ([Spring] Java Bean vs Spring Bean) 에 이어서 빈과 관련된 두번째 포스팅을 진행한다.

 

스프링 MVC에서는 @Controller, @Service, @Repository 등으로 빈으로 등록할 수 있으며, configuration 관련 객체들은 @Bean과 @Component 으로 스프링 컨테이너에 객체를 빈으로 등록할 수 있다.

 

그럼 @Bean 과 @Component의 차이는 무엇일까?

두 어노테이션은 혼용해도 될까?

 

정답은 No다.

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

각각의 어노테이션에 대해서 알아보도록 하자.

 

 

@Component

개발자가 직접 컨트롤이 가능한 Class들의 경우에사용하는 싱글톤 클래스 빈 생성 어노테이션

@Service, @Repository 어노테이션이 다음과 같은 Component 어노테이션에 포함된다. 대체로 한번 써봤으면 알듯이, 클래스에서 사용하게 된다.

 

이 어노테이션은 선언적(Declarative)인 어노테이션이다. 즉, 패키지 스캔 안에 이 어노테이션은 "이 클래스를 정의했으니 빈으로 등록해줘." 라는 뜻이 된다. 이로써 스프링이 런타임시에 컴포넌트스캔을 하여 자동으로 빈을 찾고(detect) 등록하게 된다. 

 

@Component
public class Utility {
   // ...
}

 

 

@Bean

개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우 에 사용

@Bean의 경우 주로 @Configuration 어노테이션이 들어간 Spring 을 설정하는 클래스 내에 들어가는 메소드에서 선언한다. 즉, 해당 메서드에서 반환되는 객체(인스턴스)를 등록하도록 하는 것이다.

 

@Configuration
public class AppConfig {
   @Bean
   public MemberService memberService() {
      return new MemberServiceImpl();
   }
}

 

 

간단 정리

Bean Component
메서드에 사용 클래스에 사용
개발자가 컨트롤이 불가능한 외부 라이브러리 사용시 사용 개발자가 직접 컨트롤이 가능한 내부 클래스에 사용
setter나 builder 등을 통해서 사용자가 프로퍼티를 변경해서 생성한 인스턴스를 스프링에게 관리하라고 맡기는것 클래스를 스프링이 알아서 인스턴스 생성한 후, 등록(bean으로) 하라고 맡기는 것

 

 

참고자료

https://youngjinmo.github.io/2021/06/bean-component/

https://jojoldu.tistory.com/27