
스프링에서 스프링 빈을 관리하는 설정 방식에는 XML과 JavaConfig 두가지 방식이 존재한다.
그 중 JavaConfig에서 @Configuration 어노테이션을 사용하게 되면 설정이라는 단어의 뜻 그대로 선언 된 자바 클래스는 스프링 설정을 담당하는 클래스가 된다.
@Configuration
public class ResourceConfig {
@Bean
public MangKyuResource mangKyuResource() {
return new MangKyuResource();
}
}
스프링 컨테이너는 @Configuration이 붙어있는 클래스를 자동으로 빈으로 등록해두고, 해당 클래스를 파싱해서 @Bean이 있는 메소드를 찾아서 빈을 생성해준다.
@Bean을 사용해야 싱글톤을 보장받을 수 있으므로 @Bean 어노테이션은 반드시 @Configuration과 함께 사용해주어야 한다.
애플리케이션 전범위적으로 사용되는 클래스와 다형성을 활용하여 여러 구현체를 등록할 때 @Bean을 사용하면 좋은 이유는 한 눈에 파악하여 유지보수하기 좋기 때문이다.
스프링은 컴포넌트 스캔(Component Scan)을 사용해 @Component 어노테이션이 있는 클래스들을 찾아서 자동으로 빈 등록을 해준다.
@Component
public class Utility {
// ...
}
@ComponentScan에 대한 자세한 설명은 여기를 참조
- @Component를 갖는 어노테이션으로 @Controller, @Service, @Repository 등이 있으며 앞서 살펴봤던 @Configuration 역시 내부에 @Component를 가지고 있다.
- @Configuration 안에 있는 @Component에 의해 설정 클래스 역시 자동으로 빈으로 등록이 되고, 그래서 @Bean이 있는 메소드를 통해 빈을 등록해줄 수 있었던 것이다.
- 컴포넌트 스캔을 이용한 자동 빈 등록 방식을 권장
- @Component를 이용한다면 Main 또는 App 클래스에서 @ComponentScan으로 컴포넌트를 찾는 탐색 범위를 지정해주어야 한다.
- SpringBoot를 이용중이라면 @SpringBootConfiguration 하위에 기본적으로 @ComponentScan이 포함되어 있어 별도의 설정이 필요 없다.
@Bean은 메소드 레벨에서 선언하며, 반환되는 객체(인스턴스)를 개발자가 수동으로 빈으로 등록하는 애노테이션이다.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl();
}
}
개발자가 컨트롤이 불가능한 외부 라이브러리를 빈으로 등록하고 싶을때 @Bean을 사용하며, 개발자가 직접 컨트롤이 가능한 클래스의 경우 @Component를 사용한다고 한다.
싱글톤을 보장받기 위해 @Bean은 반드시 @Configuration 안에서 사용되어야 한다.
https://mangkyu.tistory.com/75 - @Bean, @Configuration, @Component 차이 및 비교
https://mangkyu.tistory.com/234
https://oingdaddy.tistory.com/254 Component Scan 정리