안녕하세요 오늘은 스프링 빈을 등록하는 어노테이션에 대해 알아보겠습니다 👨💻
Spring 에서 가장 기본이 되는 Spring Bean
에 대한 이야기부터 해보겠습니다.
Spring Bean
은 Spring 의 DI Container(IoC Container 혹은 Spring Container)
에 의해 관리되는 POJO(Plain Old Java Object)
입니다.
Spring 을 조금이라도 공부해본적이 있다면 이에 대해 쉽게 들어볼 수 있습니다.
그만큼 Spring Bean
과 이를 관리하는 DI Container
는 Spring의 근간이 되는 핵심 요소입니다 🌟
이렇게 만들어진 Spring Bean
을 Spring DI Container
는 관리 하며 필요한 곳에 의존성 주입을 해줍니다 ❗️
이와 같은 동작의 원리를 역전의 제어(Inversion Of Control)
이라고 하며
본격적으로 어떻게 Spring Bean
을 등록하는지 알아보겠습니다 🏁
Spring Bean
을 등록하는 가장 기본적인 방법은 @Component
를 이용하는 것입니다.
@Component // @CompomentScan 의 대상이 됨
public class SpringBean {
....
}
예를 들어 위와 같은 클래스의 객체를 Spring Bean
으로 등록하길 원한다고 해보겠습니다.
이때 해당 클래스 위에 @Component
를 명시함으로써 해당 클래스는 ComponentScan
의 대상이 되며 자동
으로 Spring Bean
으로 등록됩니다 ❗️
여기서 ComponentScan
이란 Spring 에서 제공하는 기능으로, 해당 어노테이션이 있는 클래스를 찾아서 자동으로 빈으로 등록해주는 기능입니다.
스프링 MVC 패턴에서 사용되는 @Controller
, @Service
,@Repository
또한 @Component
을 포함하고 있으며 어플리케이션 구동시 자동으로 Spring Bean
으로 등록됩니다 ❗️
스프링은 기본적으로 @Component
와 ComponentScan
을 이용한 자동 빈 등록 방식을 권장합니다. 왜냐하면 해당 클래스에 있는 @Component
만 보면 해당 빈이 등록되도록 잘 설정되었는지를 바로 파악할 수 있기 때문입니다.
SpringBoot 는 @SpringBootConfiguration
하위에 ComponentScan
의 범위를 지정해주어서 개발자가 따로 범위를 지정할 필요 없이 편하게 사용가능합니다 💪
@Bean
과 @Configuration
을 이용하여 등록하는 방식은 수동 지정 방식입니다.
위에서 예시로 들었던 클래스를 @Bean
과 @Configuration
을 이용해서 Spring Bean
으로 등록해보겠습니다 🔥
@Configuration // @Component 포함한 어노테이션
public class SpringClass {
@Bean // 메소드 이름으로 빈 이름 결정
public SpringBean springBean() {
return new SpringBean();
}
}
먼저 1개 이상의 @Bean
을 포함하는 (설정)클래스에 @Configuration 을 붙여줍니다.
그 이후, Spring Bean
을 등록하기 위해 @Bean
과 함께 메소드를 정의해줍니다.
그리고 @Configuration
은 @Component
를 가지고 있기 때문에 해당 어노테이션이 붙어있는 클래스 또한 자동으로 Spring Bean
으로 등록됩니다 ❗️
그 후 해당 클래스를 파싱해서 @Bean
이 붙어있는 메소드를 찾아서 빈으로 등록합니다.
그렇다면 왜 @Bean
과 @Configuration
을 같이 사용하는 걸까요?
@Configuration
이 없지만 이미 Spring Bean
으로 등록된 클래스에 @Bean
으로 빈을 등록할수 는 없을까요? 🤔
앞에서의 질무에 대한 답은 YES
입니다 👌
다시 말하자면 @Bean
으로 되어있는 메소드는 Spring Bean
안에만 구현되어 있다면 정상적으로 동작합니다.
하지만 스프링은 반드시 @Bean
과 @Configuration
을 같이 활용하도록 강조합니다❗️ 왜그럴까요? 그것은 바로 @Configuration
이 특별한 기능을 제공하기 때문입니다.
Spring Bean 은 싱글톤 패턴으로 구현됩니다.
스프링에서 Spring Bean
은 싱글톤 패턴으로 구현되어야 합니다.
이때 @Configuration
과 함께 빈들 등록하는 경우 CGLIB
가 프록시 패턴을 적용해 수동으로 등록하는 Spring Bean
이 싱글톤으로 생성됨을 보장합니다.
수동으로 Spring DI Container
에 Spring Bean
을 등록하는 방법
개발자가 직접 제어가 불가능한 라이브러리를 Spring Bean
으로 등록할 때 사용
유지 보수성을 높이기 위해 어플리케이션 전범위적으로 사용되는 클래스나 다형성을 활용하여 여러 구현체를 Spring Bean
으로 등록 할 때 사용
@Configuration 을 통해 Spring Bean
의 싱글톤을 보장
Spring DI Container
에 Spring Bean
을 등록하는 방법Component Scan
기능이 @Component
가 붙은 클래스를 자동으로 찾아 빈으로 등록[Spring] 빈 등록을 위한 어노테이션 @Bean, @Configuration, @Component 차이 및 비교 - (1/2)
[Spring] @Configuration 안에 @Bean을 사용해야 하는 이유, proxyBeanMethods - (2/2)