스프링에서 Bean을 등록하는 방법은 대표적으로 @Bean과 @Component 애너테이션을 활용하는 것이다.
두 가지 애너테이션은 각각 어떤 경우에 사용하는걸까?
@Component
스프링에서는 특정 애너테이션이 있는 클래스를 찾아서 빈으로 등록해주는 Component Scan 기능을 제공한다.
컴포넌트 스캔을 통해 @Component 애너테이션이 있는 클래스들을 찾아서 스프링 컨테이너에 빈으로 자동 등록해준다.
* @Component는 클래스에만 붙일 수 있는 애너테이션이다
@Target(ElementType.TYPE)
=> Target이 TYPE 이므로 클래스, 인터페이스, 열거형에 붙일 수 있다.
다음과 같이 @Component를 내가 직접 개발한 클래스에 붙이고 컴포넌트 스캔을 통해 빈으로 편리하게 등록할 수 있다.
@Component
public class TestClass {
...
}
@Component를 갖는 애너테이션으로 @Controller, @Service, @Repository 등이 있으며
이제 곧 살펴볼 @Configuration 역시 안에 @Component를 가지고 있다.
@Controller
public class TestController {
...
}
@Component를 이용한다면 Main 또는 App 클래스에서 @ComponentScan으로 컴포넌트를 찾는 탐색 범위를 지정해주어야 한다. 하지만 SpringBoot를 이용중이라면 @SpringBootConfiguration 하위에 기본적으로 포함되어 있어 별도의 설정이 필요 없다.
스프링에서는 기본적으로 Component Scan을 이용한 자동 빈 등록 방식을 권장한다.
빈으로 등록하는 작업이 간편하고, 제대로 등록이 되었는지 확인도 단순하게 체크하기 쉽기 때문이다.
@Bean, @Configuration
@Bean은 수동으로 스프링 컨테이너에 빈을 등록할 때 사용한다.
* @Bean은 메서드 또는 애너테이션에만 붙일 수 있다.
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Configuration 애너테이션이 붙어있는 설정 클래스 안에 있는 메서드에 @Bean을 붙여서 수동으로 빈을 등록할 수 있다.
(반드시 @Configuration 애너테이션이 붙어있는 클래스에서 @Bean을 붙여 빈으로 등록해야 한다.
그래야 등록된 빈이 싱글톤으로 생성됨을 보장받을 수 있다. [해당 내용 참고 링크])
@Configuration
public class TestConfig {
@Bean
public TestClass addTestClass() {
return new TestClass();
}
}
그런데 왜 이렇게 수동으로 등록을 할까? 어떤 경우에 수동으로 빈을 등록할 수 밖에 없을까?
주로 개발자가 직접 제어가 불가능한 라이브러리를 빈으로 등록해야 할 때 불가피하게 사용하는 경우가 많다.
내가 직접 만든 클래스는 @Component 애너테이션을 붙일 수 있지만,
외부에서 가져다 쓰는 클래스에는 @Component를 붙일 수 없기 때문이다.
다음 블로그에서 많은 참고를 하였습니다
https://mangkyu.tistory.com/75
[Spring] 빈 등록을 위한 어노테이션 @Bean, @Configuration, @Component 차이 및 비교 - (1/2)
기존의 Spring MVC에서는 xml을 활용하여 Bean을 등록하고 있었다. 하지만 프로젝트의 규모가 커짐에 따라 사용하는 요소들을 xml에 등록하는 것이 상당히 번거로워 져서 어노테이션(Annotation, @)를 활
mangkyu.tistory.com
'Spring & SpringBoot > Spring' 카테고리의 다른 글
스프링부트의 장점, 핵심 요소 (0) | 2023.07.26 |
---|---|
Spring Interceptor (인터셉터) (0) | 2023.01.02 |
@ModelAttribute와 @RequestBody의 차이점 (0) | 2022.12.28 |
220516 Spring - Chapter 5. Spring MVC로 웹사이트 만들어보기 (0) | 2022.05.17 |
220513 Spring - Chapter 4. MyBatis로 게시판 만들기(Part.5) (0) | 2022.05.14 |