AppConfig 코드를 잠시 살펴보자.
결과적으로 각각 다른 2개의 MemoryMemberRepository가 생성되면서 싱글톤이 깨지는 것 처럼 보인다. 하지만 스프링 컨테이너에서는 이 문제가 해결된다.
OrderServiceImpl과 MemberServiceImpl에 getMemberRepository() 메서드를 추가한다.
그 후에 테스트 코드를 작성한다.
테스트가 통과하므로, memberRepository1과 memberRepository2가 같은 인스턴스를 공유한다는 것을 알 수 있다.
왜 그럴까?
AppConfig의 @Configuration에 답이있다.
사실 스프링은 CGLIB라는 바이트코드 조작 라이브러리를 사용해서 AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고, 그 다른 클래스를 스프링 빈으로 등록한다.
위에서 알 수 있듯이 이미 스프링 컨테이너에 memoryMemberRepository가 있으면 또 다시 생성을 하지않는다. 덕분에 싱글톤이 보장된다.
@Configuration을 적용하지 않고 @Bean만 적용하면 위의 memberRepository1과 memberRepository2가 같은 인스턴스가 아니고 두개 다 생성된다.
@Bean만 사용해도 스프링 빈으로 등록되지만, 싱글톤을 보장하지 않는다.
항상 @Configuration을 사용하자.