스프링에서 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

 

 

 

 

 

 

 

 

+ Recent posts