Spring Basic - @Configuration

mmm·2023년 3월 21일

@Configuration

@Configuration 어노테이션이 붙은 클래스는 설정 정보를 담당하는 클래스가 된다.

클래스의 메서드에 @Bean 어노테이션을 붙여 스프링 빈으로 등록할 수 있다.

  • 설정 정보를 담당하는 AppConfig 클래스
// AppConfig Class
@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService(){
        System.out.println("Call AppConfig.memberService");
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository(){
        System.out.println("Call AppConfig.memberRepository");
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService(){
        System.out.println("Call AppConfig.orderService");
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }
    @Bean
    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
    }
}
  • 싱글톤 패턴이 보장되는지 확인하는 테스트 클래스
public class ConfigurationSingletonTest {
    @Test
    void ConfigurationDeep(){
        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        AppConfig bean = ac.getBean(AppConfig.class);

        System.out.println("bean = " + bean.getClass());
    }
}
// test 코드 결과
Call AppConfig.memberService
Call AppConfig.memberRepository
Call AppConfig.orderService
bean = class hello.core.AppConfig$$SpringCGLIB$$0
  • 테스트 코드 결과를 확인해보면 AppConfig에서 memberService, orderService 가 각각 memberRepository 를 부르지만 한번만 호출되는걸 확인할 수 있다. → 싱글톤 패턴 보장
  • AppConfig는 class hello.core.AppConfig$$SpringCGLIB$$0 ??
    • class hello.core.AppConfig 라고 나오지 않는 이유는 다음과 같다.
    1. 내가 만든 클래스가 아니라, 스프링이 CGLIB라는 바이트코드 조작 라이브러리를 사용해서 AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고, 그 다른 클래스를 스프링 빈으로 등록한 것
    2. 그 임의의 다른 클래스가 바로 싱글톤 패턴을 보장
    3. @Bean이 붙은 메서드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고, 스프링 빈이 없으면 생성해서 스프링 빈으로 등록하고 반환하는 코드가 동적으로 만들어지게 됨

만약, @Configuration 가 없다면 ?

Call AppConfig.memberService
Call AppConfig.memberRepository
Call AppConfig.memberRepository
Call AppConfig.orderService
Call AppConfig.memberRepository
bean = class hello.core.AppConfig
  • memberRepository 가 3번 호출된다. → 싱글톤 X
  • class hello.core.AppConfig → 내가 만든 클래스
profile
mmm

0개의 댓글