스프링

@Bean 과 @Component 의 차이?

쿠쿠s 2022. 3. 22. 13:52

 

스프링 영한님 강의중..

@Bean 은 해당 어노테이션이 붙은 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너를 등록하고, 이렇게 등록된 객체를 스프링 빈이라 하며, 싱글톤으로 관리가 된다.

 

@Component 는 @ComponentScan 이 @Component 가 붙은 모든 클래스를 스프링 빈으로 등록하게 되는데, 이때 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용하게 된다.

 

이렇게 보면 둘다 스프링 빈으로 등록하게 되는건 알겠는데 무슨 차이가 있을까?

 

 


@Bean

@Bean 어노테이션은 개발자가 컨트롤이 불가능한 외부 라이브러리들Bean으로 직접 등록하고 싶은 경우에 사용 된다.

 

AppConifg 라고 직접만든 설정 정보 클래스인데 이 클래스는 @Configuration 어노테이션을 사용하였습니다. 그래서 해당 클래스는 설정(구성) 정보로 사용되는데, 이렇게 외부 라이브러리에 @Bean을 사용하면 반환된 객체를 스프링 컨테이너에 등록되어 관리가 된다.

 

 

 

 

실제 @Bean 내부로 들어가서 코드를 보면 @Target이 METHOD로 지정이 되어있다. 즉 메서드 위에서만 선언이 가능하다.

 

 


 

 

@Component

반면에 개발자가 직접 컨트롤이 가능한 클래스들의 경우에는 @Component를 사용하면 된다.

스프링에서 많이 사용하는 @Repository, @Controller, @Service 은 @Component의 구체화된 형태로 내부에 @Component가 있어 컴포넌트 스캔의 대상이 되어 자동으로 스프링 빈에 등록하게 된다.

 

@Component도 내부를 보면 @Target이 TYPE으로 지정되어 클래스 위에서만 선언이 가능합니다.

 

 

 

 

 

 

참고 - 향로님 블로그