[add] @Configuration과 싱글톤[#21] #26
AppConfig 코드를 본다.
memberService 빈을 만드는 코드를 보면 memberRepository() 를 호출한다.
이 메서드를 호출하면 new MemoryMemberRepository() 를 호출한다.
orderService 빈을 만드는 코드도 동일하게 memberRepository() 를 호출한다.
이 메서드를 호출하면 new MemoryMemberRepository() 를 호출한다.
객체가 2개 생성된다.
@Bean memberService ➡️ new MemoryMemberRepository()
@Bean orderService ➡️ new MemoryMemberRepository()
결과적으로 각각 다른 2개의 MemoryMemberRepository 가 생성되면서 싱글톤이 깨지는 것 처럼 보인다.
스프링 컨테이너는 이 문제를 어떻게 해결할까?
이전에 스프링 컨테이너는 싱글톤을 보장해준다고 했었다. 189일차(모험 98일차) - 싱글톤 컨테이너
직접 테스트 해본다.
MemberServiceImpl, OrderServiceImpl 에 각각 아래와 같이 작성한다.
// 테스트 용도
public MemberRepository getMemberRepository() {
return memberRepository;
}
테스트를 위해 MemberRepository를 조회할 수 있는 기능을 추가한다.
기능 검증을 위해 잠깐 사용하는 것이니 인터페이스에 조회기능까지 추가하지는 않았다.
ConfigurationSingletonTest
MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class);
OrderServiceImpl orderService = ac.getBean("orderService", OrderServiceImpl.class);
원래는 이렇게 구체 타입으로 꺼내는 것은 좋지 않은 방법이다.
실행시키면 똑같이 나온다.
MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class);
System.out.println("memberRepository = " + memberRepository);
위 코드를 추가해서 다시 실행시켜본다.
3개 스프링 빈이 모두 같은 것으로 출력된다.
AppConfig를 보면 3번의 new가 호출되는게 맞는데 결과를 보면 같은 인스턴스가 조회된다.
* 참고
Assertions.assertThat(orderService.getMemberRepository()).isSameAs((memberRepository));
⬇️ import static
assertThat(orderService.getMemberRepository()).isSameAs((memberRepository));
AppConfig에 호출 로그 남김
* soutm 단축키 → 메소드명
System.out.println("AppConfig.memberService");
memberService
call AppConfig.memberService
call AppConfig.memberRepository
memberRepository
call AppConfig.memberRepository
orderService
call AppConfig.orderService
call AppConfig.memberRepository
(test 실행시키기 전)
test를 실행시키기 전에 생각을 해보면
실행되는 순서는 다를지 몰라도 결과적으로 memberRepository 메소드가 3번 호출이 되어야 한다.
- 스프링 컨테이너가 스프링 빈에 등록하기 위해 @Bean이 붙어있는 memberRepository() 호출
- memberService() 로직에서 memberRepository() 호출
- orderService() 로직에서 memberRepository() 호출
다시 configurationTest를 실행시켜본다. call이 3번 띄워져 있다.
call AppConfig.memberService
call AppConfig.memberRepository
call AppConfig.orderService
memberRepository가 3번 호출이 되어야 하는데 메소드가 한 번 호출이 된다.
왜 일까? 스프링이 싱글톤을 보장해줘서?
어느덧 모험 100일이 되었다.
어느 순간 부터 모험가를 쓰지 않고 작성했는데 오늘은 기념으로 한 번 써봤다.
- 모험가 haedal
'TIL' 카테고리의 다른 글
인스타그램 실행과정 gif (0) | 2022.03.28 |
---|---|
192일차(모험 101일차) - 프로젝트 (0) | 2022.03.25 |
190일차(모험 99일차) - 싱글톤 방식의 주의점⭐ (0) | 2022.03.23 |
189일차(모험 98일차) - 싱글톤 컨테이너 (0) | 2022.03.22 |
188일차(모험 97일차) - 싱글톤 패턴 (0) | 2022.03.21 |