스프링 기본 - @Configuration과 싱글톤
반응형
@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과 바이트코드 조작의 마법 이라는 주제로 알아보자.
반응형
'Spring' 카테고리의 다른 글
스프링 기본 - 컴포넌트 스캔과 의존관계 자동 주입 시작하기 (0) | 2022.05.30 |
---|---|
스프링 기본 - @Configuration과 바이트코드 조작의 마법 (0) | 2022.05.30 |
스프링 기본 - 싱글톤 방식의 주의점 (0) | 2022.05.28 |
스프링 기본 - 싱글톤 컨테이너 (0) | 2022.05.28 |
스프링 기본 - 싱글톤 패턴 (0) | 2022.05.28 |
댓글
이 글 공유하기
다른 글
-
스프링 기본 - 컴포넌트 스캔과 의존관계 자동 주입 시작하기
스프링 기본 - 컴포넌트 스캔과 의존관계 자동 주입 시작하기
2022.05.30 -
스프링 기본 - @Configuration과 바이트코드 조작의 마법
스프링 기본 - @Configuration과 바이트코드 조작의 마법
2022.05.30 -
스프링 기본 - 싱글톤 방식의 주의점
스프링 기본 - 싱글톤 방식의 주의점
2022.05.28 -
스프링 기본 - 싱글톤 컨테이너
스프링 기본 - 싱글톤 컨테이너
2022.05.28