[Spring] Why - @Configuration, @Component의 차이점.

하쮸·2025년 4월 5일
0

Error 또는 Why & How

목록 보기
17/43

1. 차이점.

@Configuration
public class MyConfig {

    @Bean
    public ServiceA aService(){
        return new ServiceA();
    }

    @Bean
    public ServiceB bService(){
        return new ServiceB(aService());
    }

}
  • 위 코드를 보면, ServiceBServiceA를 의존성으로 갖고 있음.
    • 메서드 호출로 의존성을 주입하고 있음.
  • 겉보기에는 매번 new 키워드를 써서 새 인스턴스를 생성하는 것처럼 보이지만 실제 스프링은 그렇게 동작하지 않음.

  • @Configuration

    • 1개 이상의 @Bean을 사용하는 클래스의 경우 반드시 @Configuration을 활용.
    • 생성하는 객체들을 스프링이 빈(Bean)으로 관리하라는 의미.
    • @Configuration이 사용된 클래스는 CGLIB 프록시를 기반으로 빈(Bean)을 싱글톤으로 유지함.
      • @Bean 메서드 호출 시 항상 같은 인스턴스를 반환하게 해줌.
        이 점이 @Component와의 가장 큰 차이점.
    • 위 코드로 설명하자면.
      스프링 컨텍스트에 의해 관리되는 싱글톤 빈(Bean)이 생성됨.
      메서드를 여러 번 호출하더라도, 스프링이 생성한 동일한 빈(Bean)을 반환해줌.
  • @Component

    • 개발자가 커스텀한 클래스를 빈(Bean)으로 등록하고자 하는 경우 @Component를 활용.
    • 스프링이 관리해야 할 컴포넌트(Component)라는 의미.
      • 즉, 스프링이 자동으로 빈(Bean) 등록해줌.
    • 마찬가지로 위 코드로 설명하자면.
      메서드를 호출할 때마다 스프링이 관리하는 인스턴스를 반환하는 것이 아니라
      매번 새로운 인스턴스를 반환함.
  • @Component의 기능을 @Configuration(proxyEnabled = false)로 동일하게 설정할 수 있음.
    (이러한 방식을 Bean 경량 모드 처리(bean light mode processing)라고 부르기도 함)


1-1. 정리.

-@Component@Configuration
목적 및 역할- 일반 빈(Bean) 등록용 클래스.
- 일반적인 컴포넌트.
- 클래스 자체만 빈으로 등록됨.
- 빈(Bean) 등록 및 설정용 클래스.
- 설정 클래스(여러 Bean을 정의하는 클래스) 등록.
- @Bean 메서드를 통해 여러 빈을 등록 가능.
빈(Bean) 생성 방식- 클래스 자체를 빈(Bean)으로 등록.- @Bean 메서드를 통해 빈(Bean) 등록.
프록시 사용- 사용 X.- CGLIB 프록시 사용 (싱글톤 보장).
중복 호출 시- 새로운 객체를 반환할 수 있음.- 같은 객체를 반환함. (싱글톤 유지)

2. 참고.

profile
Every cloud has a silver lining.

0개의 댓글