[Spring] Spring Bean 등록을 위한 어노테이션 (@Bean, @Configuration 과 @Component)

최동근·2023년 2월 26일
0

스프링

목록 보기
8/8

안녕하세요 오늘은 스프링 빈을 등록하는 어노테이션에 대해 알아보겠습니다 👨‍💻

☘️ Spring Bean 이란?

Spring 에서 가장 기본이 되는 Spring Bean 에 대한 이야기부터 해보겠습니다.

Spring Bean 은 Spring 의 DI Container(IoC Container 혹은 Spring Container) 에 의해 관리되는 POJO(Plain Old Java Object) 입니다.

Spring 을 조금이라도 공부해본적이 있다면 이에 대해 쉽게 들어볼 수 있습니다.
그만큼 Spring Bean 과 이를 관리하는 DI Container 는 Spring의 근간이 되는 핵심 요소입니다 🌟

  • POJO(Plain Old Java Object) 로써 Spring Application 을 구성하는 핵심 객체임
  • Spring DI Container 에 의해 생성,관리 및 소멸 됨
  • class, id, scope 등을 주요 속성으로 지님

이렇게 만들어진 Spring BeanSpring DI Container 는 관리 하며 필요한 곳에 의존성 주입을 해줍니다 ❗️
이와 같은 동작의 원리를 역전의 제어(Inversion Of Control) 이라고 하며
본격적으로 어떻게 Spring Bean을 등록하는지 알아보겠습니다 🏁

☘️ @Component

Spring Bean 을 등록하는 가장 기본적인 방법은 @Component 를 이용하는 것입니다.

@Component // @CompomentScan 의 대상이 됨
public class SpringBean {

	....
}

예를 들어 위와 같은 클래스의 객체를 Spring Bean 으로 등록하길 원한다고 해보겠습니다.
이때 해당 클래스 위에 @Component 를 명시함으로써 해당 클래스는 ComponentScan 의 대상이 되며 자동 으로 Spring Bean 으로 등록됩니다 ❗️

여기서 ComponentScan 이란 Spring 에서 제공하는 기능으로, 해당 어노테이션이 있는 클래스를 찾아서 자동으로 빈으로 등록해주는 기능입니다.

스프링 MVC 패턴에서 사용되는 @Controller, @Service,@Repository 또한 @Component 을 포함하고 있으며 어플리케이션 구동시 자동으로 Spring Bean 으로 등록됩니다 ❗️
스프링은 기본적으로 @ComponentComponentScan 을 이용한 자동 빈 등록 방식을 권장합니다. 왜냐하면 해당 클래스에 있는 @Component 만 보면 해당 빈이 등록되도록 잘 설정되었는지를 바로 파악할 수 있기 때문입니다.
SpringBoot 는 @SpringBootConfiguration 하위에 ComponentScan 의 범위를 지정해주어서 개발자가 따로 범위를 지정할 필요 없이 편하게 사용가능합니다 💪

☘️ @Bean & @Configuration

@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 으로 빈을 등록할수 는 없을까요? 🤔

@Bean 과 @Configuration 을 같이 사용하는 이유

앞에서의 질무에 대한 답은 YES 입니다 👌
다시 말하자면 @Bean 으로 되어있는 메소드는 Spring Bean 안에만 구현되어 있다면 정상적으로 동작합니다.
하지만 스프링은 반드시 @Bean@Configuration 을 같이 활용하도록 강조합니다❗️ 왜그럴까요? 그것은 바로 @Configuration 이 특별한 기능을 제공하기 때문입니다.

Spring Bean 은 싱글톤 패턴으로 구현됩니다.

스프링에서 Spring Bean 은 싱글톤 패턴으로 구현되어야 합니다.
이때 @Configuration 과 함께 빈들 등록하는 경우 CGLIB 가 프록시 패턴을 적용해 수동으로 등록하는 Spring Bean 이 싱글톤으로 생성됨을 보장합니다.

☘️ @Bean & @Configuration 과 @Component 특징 정리 및 차이

  • [@Bean, @Configuration]
    • 수동으로 Spring DI ContainerSpring Bean 을 등록하는 방법

    • 개발자가 직접 제어가 불가능한 라이브러리를 Spring Bean 으로 등록할 때 사용

    • 유지 보수성을 높이기 위해 어플리케이션 전범위적으로 사용되는 클래스나 다형성을 활용하여 여러 구현체를 Spring Bean 으로 등록 할 때 사용

    • @Configuration 을 통해 Spring Bean 의 싱글톤을 보장


  • [@Component]
    • 자동으로 Spring DI ContainerSpring Bean 을 등록하는 방법
    • 스프링의 Component Scan 기능이 @Component 가 붙은 클래스를 자동으로 찾아 빈으로 등록
    • 스프링에서는 해당 방법을 권장함
    • 다양한 하위 어노테이션을 가지고 있음(ex.@Service, @Controller 등)

참고

[Spring] 빈 등록을 위한 어노테이션 @Bean, @Configuration, @Component 차이 및 비교 - (1/2)
[Spring] @Configuration 안에 @Bean을 사용해야 하는 이유, proxyBeanMethods - (2/2)

profile
비즈니스가치를추구하는개발자

0개의 댓글