반응형

@Configuration과 싱글톤

 

다음 AppConfig 코드를 보자.

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

 

결과적으로 각각 다른 2개의 MemoryMemberRepository가 생성되면서 싱글톤이 깨지는 것 처럼 보인다.
스프링 컨테이너는 이 문제를 어떻게 해결할까?

 

직접 테스트 해보자.

 

검증 용도의 코드 추가 (MemberServiceImpl, OrderServiceImpl)

  • 테스트를 위해 MemberRepository를 조회할 수 있는 기능을 추가한다. 기능 검증을 위해 잠깐 사용하는 것이니 인터페이스에 조회기능까지 추가하지는 말자.

 

테스트 코드

  • 확인해보면 memberRepository 인스턴스는 모두 같은 인스턴스가 공유되어 사용된다.
  • AppConfig의 자바 코드를 보면 분명히 각각 2번 new MemoryMemberRepository 호출해서 다른 인스턴스가 생성되어야 하는데?
  • 어떻게 된 일일까? 혹시 두 번 호출이 안되는 것일까? 실험을 통해 알아보자.

 

 

AppConfig에 호출 로그 남김

스프링 컨테이너가 각각 @Bean을 호출해서 스프링 빈을 생성한다. 그래서 memberRepository()는 다음과 같이 총 3번이 호출되어야 하는 것 아닐까?

  • 1. 스프링 컨테이너가 스프링 빈에 등록하기 위해 @Bean에 붙어있는 memberRepository() 호출
  • 2. memberService() 로직에서 memberRepository() 호출
  • 3. orderService() 로직에서  memberRepository() 호출

 

그런데 출력 결과는 모두 1번만 호출된다.

 

이게 어떻게 된 것일까?

강력한 스프링의 힘...?!!!

다음시간에 @Configuration과 바이트코드 조작의 마법 이라는 주제로 알아보자.

 

반응형