기존의 스프링 MVC에서는 xml을 활용하여 Bean을 등록하고 있었다.
하지만 프로젝트의 규모가 커짐에 따라 사용하는 요소들은 xml에 등록하는 것이 상당히 번거로워 져서 어노테이션 기반의 Bean 등록 방법이 탄생하게 되었다. Bean을 등록하기 위한 @Bean, @Component, @Configuration 어노테이션에 대하여 알아보자.
● Spring Bean이란?
- 스프링에서 스프링의 DI Container에 의해 관리되는 POJO(Plain Old Java Object)를 Bean이라고 부른다. 이러한 Bean들이 스프링을 구성하는 핵심 요소이다.
- POJO(Plain Old Java Object)로써 스프링 애플리케이션을 구성하는 핵심 객체이다.
- 스프링 IoC 컨테이너(또는 DI 컨테이너)에 의해 생성 및 관리된다.
- class, id, scope, constructor-arg 등 주요 속성으로 지닌다.
● 스프링 빈 구성요소
- class : Bean으로 등록할 Java 클래스
- id : Bean의 고유 식별자
- scope : Bean을 생성하기 위한 방법(singleton, prototype 등)
- constructor-arg : Bean 생성 시 생성자에 전달할 파라미터
- property : Bean 생성 시 setter에 전달할 인수
● Spring Bean 등록 방법(@Bean, @Configuration, @Component)
다음과 같은 클래스를 스프링 컨테이너에 등록 해보자.
public class Resource {}
이 클래스를 빈으로 등록하기 위해선 명시적으로 설정 클래스에서 @Bean 어노테이션을 사용해 수동으로 스프링 컨테이너에 빈을 등록하는 방법이있다. @Configuration 어노테이션을 클래스에 붙여주면 된다. @Bean을 사용해 수동으로 빈을 등록할 때에는 메소드 이름으로 빈 이름이 결정된다.
@Configuration
public class ResourceConfig {
@Bean
public Resource resource() {
return new Resource();
}
}
스프링 컨테이너는 @Configuration이 붙어있는 클래스를 자동으로 등록해두고, 해당 클래스를 파싱해서 @Bean이 있는 메소드를 찾아 빈을 생성한다. 다른 임의의 클래스를 만들어 @Bean을 붙인다고 되는것이 아니고, 반드시 @Bean을 사용하는 클래스에는 @Configuration 어노테이션을 활용하여 해당 클래스에서 Bean을 등록하고자 함을 명시해 줘야 한다.
수동으로 빈을 직접 등록해야 하는 상황이라면 다음과 같은 기준으로 한다.
- 개발자가 직접 제어가 불가능한 라이브러리를 활용할 때
- 애플리케이션 전 범위적으로 사용되는 클래스를 등록할 때
- 다형성을 활용하여 여러 구현체를 등록해야 할 때
만약 우리가 객체를 JSON메시지로 변경하기 위해 Gson과 같은 외부 라이브러리를 사용한다고 하자. 그러면 해당 클래스를 싱글톤 빈으로 등록해 줘야 1개의 객체만 생성하여 여러 클래스가 공유함으로 메모리 상의 이점을 얻을 수 있다. 그런데 해당 클래스는 우리가 만든게 아니라 가져다 사용하는 클래스 일 뿐 불가피하게 @Bean으로 등록 해줘야만 한다.
@Bean을 사용하는 이점은 한 눈에 파악하여 유지보수하기가 쉽기 때문이다. 예를 들자면 구현체를 빈으로 등록 할때 어떠한 구현체들이 빈으로 등록됬는지 파악하기 위해서 @Configuration 클래스만 찾아보면 되기 때문이다.
● Component
수동으로 직접 빈을 등록 하는 작업은 빈으로 등록하는 클래스가 많아 질수록 상당한 시간을 차지하고 생산력 저하로 이루어질 것이다. 이때 스프링에서 특정 어노테이션이 있는 클래스를 찾아 빈으로 등록해 주는 컴포넌트 스캔 기능이 있다.
스프링은 컴포넌트 스캔(Component Scan)을 이용해 @Component 어노테이션이 있는 클래스들을 찾아 빈으로 등록을 한다. 우리가 직접 개발한 클래스를 빈으로 편리하게 등록 해야만 하는 경우에는 @Component 어노테이션을 활요하면 된다.
public class Resource {}
@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;
}
스프링은 기본적으로 컴포넌트 스캔을 이용한 자동 빈 등록 방식을 권장한다. 또한 직접 개발한 클래스는 @Component를 통해 해당 클래스를 빈으로 등록함을 노출하는 것이 좋다. 이유는 해당 클래스에 있는 @Component만 보면 해당 빈이 등록이 되도록 설정 되었는지를 파악 할수 있기 때문이다. 위와 같이 수동으로 해야하는 경우를 제외한 대부분의 경우 자동 등록 방식을 사용하자.
그리고 @Component를 이용하면 Main 또는 App 클래스에서 @ComponentScan으로 컴포넌트 스캔 범위를 지정해 줘야한다. 그러나 SpringBoot를 이용한다면 @SpringBootConfiguration에 기본적으로 포함되어 있어 별도의 설정이 필요 없다.
● 간단 정리
- @Bean, @Configuration
- 수동으로 스프링 컨테이너에 빈을 동록하는 방법
- 개발자가 직접 제어가 불가능한 라이브러리를 빈으로 등록할 때 불가피하게 사용
- 유지보수성을 높이기 위해 애플리케이션 전 범위적으로 사용되는 클래스나 다형성을 활용하여 여러 구현체를 빈으로 등록 할 때 사용
- 1개 이상의 @Bean을 제공하는 클래스의 경우 반드시 @Configuration을 명시해 줘야 싱글톤이 보장된다.
- @Component
- 자동으로 스프링 컨테이너에 빈을 등록하는 방법
- 스프링의 컴포넌트 스캔 기능이 @Component 어노테이션이 있는 클래스를 자동으로 찾아 빈으로 등록한다.
- 대부분의 경우 @Component를 이용한 자동 등록 방식을 사용하는 것이 좋다.
- @Component 하위 어노테이션으로 @Configuration, @Controller, @Service, @Repository 등이 있다.
https://mangkyu.tistory.com/75?category=761302
'Programming > Spring' 카테고리의 다른 글
@Configuration 안에 @Bean을 사용해야 하는 이유, proxyBeanMethods (0) | 2022.10.30 |
---|---|
@Controller와 @RestController (0) | 2022.10.30 |
@RequestBody, @ModelAttribute, @RequestParam (0) | 2022.10.30 |
서블릿(Servlet) 이란? (0) | 2022.10.30 |
IoC, 스프링 컨테이너(Container), 스프링 빈(Bean)이란? (0) | 2022.10.29 |
댓글