JH's Develog

[SpringBoot] @Component vs @Bean vs @Configuration 본문

Spring

[SpringBoot] @Component vs @Bean vs @Configuration

jhkimmm 2022. 1. 10. 00:12

@Component

Component 어노테이션은 클래스에 붙어서(Class-level) 이 클래스를 Custom Bean으로 만들어줍니다. ComponentScan을 통해서 @Component가 붙은 클래스는 필요한 의존성을 모두 주입받고 스프링 컨테이너에 등록되며, 등록하려는 Bean의 클래스 소스가 편집가능한 경우에 사용됩니다.

Component에는 @Controller, @Service, @Repository라는 스테레오 타입 어노테이션들이 있으며 목적에 맞게 선택하여 사용할 수 있습니다.

@Bean

Bean 어노테이션은 메서드에 붙는 Method-level 어노테이션이며 인스턴스화 하는 코드가 수동으로 작성됩니다.

빈의 인스턴스 코드와 클래스의 정의가 분리된 구조이기 때문에 외부 라이브러리나 써드 파티 클래스도 빈으로 등록할 수 있게 해줍니다.

인스턴스화 하는 코드가 수동으로 작성된다 ->  위 코드의 return new BubbleSort<>(); 처럼 직접 new를 통해서 인스턴스를 생성한다.

인스턴스 코드와 클래스의 정의가 분리됐다 -> BubbleSort가 구현된 부분과 인스턴스를 생성하는 부분이 분리되어있다.  

@Configuration

스프링 시큐리티의 전형적인 설정파일

해당 클래스는 각종 Bean설정을 담고 있음을 나타내는 어노테이션입니다. 클래스 내부의 Bean 설정(메서드)을 읽어서 스프링 컨테이너에 등록하고 필요한 곳에 주입하거나 각종 스프링 인터페이스의 구현에 함께 활용합니다.

@Configuration 어노테이션도 구조를 살펴보면 @Component 어노테이션을 포함하고 있으므로 Component의 일종이라고 할 수 있습니다. 그러나 빈 설정을 위해서는 @Configuration, 클래스 빈 등록을 위해서는 @Component를 사용해 줌으로써 어노테이션이 의도에 맞게 적절히 잘 사용되도록 하여야합니다.

 

+Bean의 생성법 3가지

 

Core Technologies

In the preceding scenario, using @Autowired works well and provides the desired modularity, but determining exactly where the autowired bean definitions are declared is still somewhat ambiguous. For example, as a developer looking at ServiceConfig, how do

docs.spring.io

빈을 생성하는 방법은 총 3가지가 있습니다.

1. @Component

2. @Bean in @Configuration

3. @Bean in @Component

기본적으로 스프링에서 생성되는 Bean은 Proxy Bean으로 생성되는데 3번 방법을 사용하면 Lite Mode Bean이 생성됩니다. Proxy Bean으로 생성되어야 스프링에서 제공하는 AOP와 같은 기능을 적용할 수 있지만 Proxy Bean은 생성하는 속도가 느립니다. 그러므로 만약 내가 생성하려고 하는 Bean의 역할을 모두 정확히 아는데 Proxy Bean으로 생성될 필요가 없다고 판단한 경우에는 Lite Mode로 Bean을 생성할 수 있습니다.

(다만, 스프링의 기능을 온전하게 사용하려면 Proxy Bean이어야 하므로 일반적으로 Proxy Bean으로 생성합니다.)

Comments