본 글은 김영한님의 스프링 핵심 원리 강의 내용을 바탕으로 정리한 글입니다.
@Configuration과 싱글톤 테스트
이와 같이 코드가 있다면,
memberService -> new memberRepository 호출
orderService -> new memberRepository 호출
결국 2가지의 new memberRepository 가 생성되면서 싱글톤이 깨지는 것 처럼 보인다.
싱글톤이 진짜 깨지는지 확인하기 위해
구현체에서 memberRepository를 호출하는 메소드를 생성한다.
이후 테스트 코드를 작성
결국에는 같은 memberRepository를 호출하면서
싱글톤이 성립되는 것을 알 수 있다.
하지만 new MemoryMemberRepository 를 각각 2번 호출해서 다른 인스턴스가 생성되어야 하는데
생성되지 않았다 그 이유를 알아보기 위해 AppConfig에 호출 로그를 남긴다.
위의 코드 같은 경우 모두 호출한다면
결국은 new MemoryMemberRepository가 3번 호출되어야 한다고 생각이 된다.
하지만 출력 결과는 1번만 출력된다.
왜 그런 것일까 ?
그이유는
@Configuration과 바이트코드 조작의 마법
스프링 컨테이너는 싱글톤 레지스트리다
따라서 스프링 빈이 싱글톤이 되도록 보장해주어야하는데 자바코드까지 스프링이 보장해주기는 어렵다.
이를 해결하기 위해 스프링은 클래스의 바이트코드를 조작하는 라이브러리를 사용하게 된다.
위 코드에서 알수 있는점은 스프링 컨테이너를 생성할 때 구성정보로 사용한 AppConfig클래스 마저도
Spring Bean에 등록이 된다는 것이다.
당연히 Spring Bean이니깐 getBean 을 활용해서 정보를 가져올수 있다.
하지만 순수한 클래스라면 class hello.core.AppConfig와 같이 출력되어야 하지만
뒤에 xxxCGLIB가 붙으면서 뭔가가 생성이 되었는데
이것은 내가 만든 클래스가 아니라 스프링이 CGLIB라는 조작 라이브러리를 통해서 AppConfig클래스를 상속받은
임의의 다른 클래스를 만들고 그 다른 클래스를 스프링 빈으로 등록한 것이다.
결국 임의의 다른 클래스가 싱글톤을 보장되도록 해준다.
'Spring' 카테고리의 다른 글
[Spring] 조회한 빈이 2개 이상일 때 해결 방법 (0) | 2023.07.18 |
---|---|
[Spring] Configuration과 싱글톤의 관계 2/2 (0) | 2023.07.16 |
[Spring] 싱글톤 패턴의 문제점을 해결한 싱글톤 컨테이너 (0) | 2023.07.14 |
[Spring] 싱글톤패턴 사용하기에는 많은 문제점 (0) | 2023.07.13 |
[Spring] 제어의 역전 IoC(inversion of Control) (0) | 2023.07.10 |