저번 포스팅 ([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으로) 하라고 맡기는 것 |
참고자료
'프로그래밍 공부 > Spring' 카테고리의 다른 글
[Spring] DB ConnectionPool이란? (1) | 2022.05.25 |
---|---|
[Spring] 의존 자동 주입, @AutoWired (2) | 2022.05.07 |
[Spring] Controller에서 데이터 받기 (0) | 2022.04.28 |
[Spring] Java Bean vs Spring Bean (1) | 2022.04.26 |
[Spring] @ExceptionHandler 와 @ControllerAdvice (0) | 2022.04.26 |