
Spring에서는 Bean이라는 JAVA POJO를 DI Container를 통해서 관리한다.
Bean이란 아래와 같은 구성 요소를 가지고 있는 POJO이다.
Spring에서는 Bean의 구성 요소를 통해서 DI Container에 등록된 Bean을 Singleton 객체로 생성해서 등록하고, 관리한다.
본문에서 다룰 @Configuration과 @Bean은 여기서 Bean을 DI Container에 등록하는 데 사용된다.
@Configuration은 xml 설정을 대체하는 스프링 설정 클래스를 만들어주는 어노테이션이다.
해당 어노테이션은 Bean 객체를 생성하는데 쓰이는데, 아래의 예시를 통해서 자세히 알아보자.
public class Test {
}
만약 위 Test 클래스를 빈으로 등록하고 싶다면, 아래와 같이 설정 클래스를 통해서 Bean으로 등록하는 방법이 있다.
@Configuration
public class TestConfig {
@Bean
public Test test() {
return new Test();
}
}
Spring Container가 @Configuration이 붙어있는 클래스를 자동으로 빈으로 등록하고, 해당 클래스를 리플렉션해서 @Bean 어노테이션이 붙어있는 메서드를 찾아서 Bean을 생성해준다.
이 때 메서드의 이름으로 Bean 이름이 결정되기에 중복된 Bean 이름이 존재하지 않도록 주의
public class TestConfig {
@Bean
public Test test() {
return new Test();
}
}
만약 위와 같이 @Configuration이 붙은 클래스가 아니라 Bean으로 등록된 다른 클래스에서 @Bean을 사용하여 클래스를 Bean으로 등록하고자 한다면 어떻게 될까?
이 때도 마찬가지로 동작은 한다.
그러나 이 때는 싱글톤을 보장 받지 못함으로 @Bean을 사용한 클래스는 @Configuration을 붙여야 한다.
즉
@Configuration은 클래스 내에@Bean어노테이션이 붙은 메서드가 사용될 때(@Bean을 통해서 Bean을 등록하고자 할 때) 싱글톤을 보장하기 위해서 사용하는구나
싱글톤을 보장하는 장점 이외에도, @Configuration과 @Bean 을 사용했을 때 구현체를 등록하는 코드를 찾고자 한다면 @Configuration이 붙어있는 클래스만 보면 되기에 유지보수하기에도 좋다.
추가적으로 bean을 등록하기 위한 방법으로 @Component 어노테이션도 존재한다.
위와 같이 매번 수동으로(@Bean)으로 Bean 등록하기에는 많은 노력과 시간이 투자된다.
그래서 Spring에서는 특정 어노테이션이 있는 클래스를 찾아서 빈으로 등록해주는 Component Scan을 제공한다.
위랑 같은 예시를 통해서 자세히 알아보자.
public class Test {
}
만약 위 Test 클래스를 빈으로 등록하고 싶다면, 단순히 해당 클래스에 아래처럼 @Component만 적으면 된다.
@Component
public class Test {
}
이러한 @Component를 갖는 어노테이션으로는 @Controller, @Service, @Repository 그리고 위에서 다뤘던 @Configuration이 있다.
그 덕분에 Component Scan이 되어서 @Bean이 있는 메서드를 bean으로 등록할 수 있던 것이다.
[Spring] 빈 등록을 위한 어노테이션 @Bean, @Configuration, @Component 차이 및 비교 - (1/2)
[Spring Boot] Configuration Component (@Configuration, @Bean)