@Configuration과 싱글톤

AppConfig코드를 잘 살펴보면 memberService 빈을 만드는 코드를 보면 memberRepository() 를 호출한다. 이 메서드를 호출하면 new MemoryMemberRepository() 를 호출한다. orderService 빈을 만드는 코드도 동일하게 memberRepository() 를 호출한다. 이 메서드를 호출하면 new MemoryMemberRepository() 를 호출한다.

결과적으로 각각 다른 2개의 MemoryMemberRepository 가 생성되면서 싱글톤이 깨지는 것 처럼 보인다!

@Configuration
  public class AppConfig {
      @Bean
      public MemberService memberService() {
          return new MemberServiceImpl(memberRepository());
      }
      @Bean
      public OrderService orderService() {
          return new OrderServiceImpl(
                  memberRepository(),
                  discountPolicy());
}
      @Bean
      public MemberRepository memberRepository() {
          return new MemoryMemberRepository();
      }
... }

저렇게 생성되는 new로 memberRepository들은 각각 같은 인스턴스일까 다른 인스턴스일까? 로깅을 해보면 memberService, orderService가 호출하는 memberRepository와 memberRepository그 자체는 모두 같은 인스턴스임을 확인할 수 있다!

혹시나 메서드가 호출되지 않았는지 확인하기 위해 메서드마다 출력문을 생성해서 로깅해본다!

예상되는 결과 : 총 3번의 memberRepository() memberService() memberRepository() orderService() memberRepository() memberRepository() //그 자체

실제 결과

이 결과를 확인하면서 알 수 있듯이, 스프링에서 싱글톤을 관리해주는 것 같다! =>비밀은 바로 @Configuration 애노테이션을 적용한 AppConfig에 있다!

Last updated