영속성 컨테스트 관리를 위해 Bean을 등록하여야한다. 기존의 Spring에서는 xml을 활용하여 Bean을 등록하였지만 프로젝트 규모가 커지게 되면 xml 사용에는 한계가 존재한다. 그래서 탄생하게 된 것이 어노테이션을 이용하여 Bean을 등록하는 것이다. Bean 등록 어노테이션인 @Bean, @Configuration, @Component에 대해 알아보자!
가장 먼저 Spring Bean이란 무엇일까?
Spring Bean이란 Spring의 DI Container에 의해 관리되는 POJO(Plain Old Java Object)를 Bean이라고 부르며, 이러한 Bean들은 Spring을 구성하는 핵심 요소이다. Spring의 Bean을 정리하면 아래와 같다.
- POJO(Plain Old Java Object)로써 Spring 애플리케이션을 구성하는 핵심 객체이다.
- Spring loC 컨테이너에 의해 생성 및 관리된다.
- class, id, scope, constructor-arg 등을 주요 속성으로 지닌다.
Spring에서는 위와 같은 Bean의 구성 요소를 바탕으로 등록되어 있는 Bean을 싱글톤 객체로 생성하여 관리한다.
그래서 빈을 등록하기 위한 다양한 방법들을 제공하고 있는데, 각각의 방법들을 살펴보자.
Spring Bean 등록 방법 (@Bean, @Configuration, @Component)
[ @Bean 어노테이션과 @Configuration 어노테이션]
아래와 같은 클래스를 스프링 컨테이너에 등록하려고 한다.
public class Member{
}
이 클래스를 빈으로 등록하기 위해서는 명시적으로 설정 클래스에서 @Bean 어노테이션을 사용해 수동으로 컨테이너에 빈을 등록하는 방법이 있다. 설정 클래스는 다음과 같이 @Configuration 어노테이션을 클래스에 붙여주면 되는데,
@Bean을 사용해 수동으로 빈을 등록해줄 때에는 메소드 이름으로 빈 이름이 자동으로 결정된다. 그러므로 중복된 빈 이름이 존재하지 않도록 주의해야한다.
@Configuration
public class Member{
@Bean
public Member member(){
return new Member();
}
}
@Configuration 안에서 @Bean이 빈으로 등록되는 과정은 어떻게 될까?
스프링 컨테이너는 @Configuration이 붙어있는 클래스를 자동으로 빈으로 등록해두고, 해당 클래스를 파싱해서 @Bean 이 있는 메소드를 찾아서 빈을 생성해준다.
하지만 어떤 임의의 클래스를 만들어서 @Bean 어노테이션을 붙인다고 되는 것이 아니고, @Bean을 사용하는 클래스에는 반드시 @Configuration 어노테이션을 활용하여 해당 클래스에서 Bean을 등록하고자 함을 명시해주어야 한다.
스프링 빈으로 등록된 다른 클래스 안에서 @Bean으로 직접 빈을 등록해주는 것도 동작은 한다. 하지만 @Configuration안에서 @Bean을 사용해야 싱글톤을 보장받을 수 있으므로 @Bean 어노테이션은 반드시 @Configuration과 함께 사용해주어야한다.
이렇게 @Bean 어노테이션의 경우는 수동으로 빈을 직접 등록해줘야만 하는 상황인데, 주로 다음과 같은 상황일 때 사용한다.
1. 개발자가 직접 제어가 불가능한 라이브러리를 활용할 때
2. 애플리케이션 점범위적으로 사용되는 클래스를 등록할 때
3. 다형성을 활용하여 여러 구현체를 등록해주어야 할 때
[ @Component 어노테이션 ]
하지만 이렇게 수동으로 직접 빈을 등록하는 작업은 빈으로 등록하는 클래스가 많아질수록 상당히 많은 시간을 투자해야할 것이고, 이는 생산력 저하로 이어진다.
그래서 스프링에서는 특정 어노테이션이 있는 클래스를 찾아서 이를 모두 빈으로 등록해주는 컴포넌트 스캔 기능을 제공한다.
스프링은 컴포넌트 스캔(Component Scan)을 사용해 @Component 어노테이션이 있는 클래스들을 찾아서 자동으로 빈 등록을 해준다. 그래서 우리가 직접 개발한 클래스를 빈으로 편리하게 등록하고자 하는 경우에는 @Component 어노테이션을 활용하면 된다.
@Component를 갖는 어노테이션으로 @Controller, @Service, @Repository 등이 존재하며 위에서 살펴봤던 @Configuration 역시 @Component을 가지고 있다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
@AliasFor(annotation = Component.class)
String value() default "";
boolean proxyBeanMethods() default true;
}
@Configuration 안에 있는 @Component에 의해 설정 클래스 역시 자동으로 빈으로 등록이 되고, 그래서 @Bean이 있는 메소드를 통해 빈으로 등록해줄 수 있던 것이다.
스프링은 기본적으로 컴포넌트 스캔을 이용한 자동 빈 등록 방식을 권장한다.
또한 직접 개발한 클래스는 @Component를 통해 해당 클래스를 빈으로 등록함을 노출하는 것이 좋다.
SpringBoot를 사용하게 되면 @SpringBootConfiguration 하위에 기본적으로 @ComponentScan이 설정되어있어 컴포넌트 스캔 기능을 활성화해줄 필요가 없지만 Boot를 사용하지 않을 때는 Main 또는 App 클래스에서 @ComponentScan으로 컴포넌트를 찾는 탐색 범위를 지정해주어야한다.
@Bean, @Configuration, @Component 차이 및 비교 요약
[ @Bean, @Configuration ]
- 수동으로 스프링 컨테이너에 빈을 등록하는 방법
- 개발자가 직접 제어가 불가능한 라이브러리를 빈으로 등록할 때 불가피하게 사용
- 유지보수성을 높이기 위해 애플리케이션 전범위적으로 사용되는 클래스나 다형성을 활용하여 여러 구현체를 빈으로 등록할 때 사용
- 1개 이상의 @Bean을 제공하는 클래스의 경우 반드시 @Configuraion을 명시해주어야 싱글톤이 보장된다.
[ @Component ]
- 자동으로 스프링 컨테이너에 빈을 등록하는 방법
- 스프링의 컴포넌트 스캔 기능이 @Component 어노테이션이 있는 클래스를 자동으로 찾아서 빈으로 등록
- 대부분의 경우 @Component를 이용한 자동 등록 방식을 사용하며, 스프링 또한 이 방법을 권장
- @Component 하위 어노테이션 : @Configuration, @Controller, @Service, @Repository
'Spring > Lombok' 카테고리의 다른 글
@RequestParam, @ModelAttribute (0) | 2022.08.01 |
---|---|
@PostConstruct @PreDestroy (0) | 2022.05.08 |
@Data (0) | 2022.05.03 |
@RestController @Requestbody @Responsebody (0) | 2022.05.03 |
@Transactional (0) | 2022.04.29 |