728x90
@Configuration
public class AppConfig {
//@Bean memberService -> new MemoryMemberRepository()
//@Bean orderService -> new MemoryMemberRepository()
//2가지 Bean에서 new로 MemoryMemberRepository를 생성해 준다, 과연 싱글톤으로 생성 될까??
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository()); //구체적인 클래스를 생성할때 알수 있다
}
@Bean
public OrderService orderService(){
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
//역할
//메소드 명을 본 순간 역할이 다 드러나는 장점이 있다
//후에 구현체를 갈아 끼울때 해당 코드만 변경하면 된다
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy(){
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
- memberService 빈을 만드는 코드를 보면 memberRepository()를 호출한다.
- 이 메서드를 호출하면 new MemoryMemberRepository() 를 호출한다.
- orderService 빈을 만드는 코드도 동일하게 memberRepository() 를 호출한다.
- 이 메서드를 호출하면 new MemoryMemberRepository() 를 호출한다.
- 결과적으로 각각 다른 2개의 MemoryMemberRepository 가 생성되면서 싱글톤이 깨지는 것처럼 보인다. 스프링 컨테이너는 이 문제를 어떻게 해결할까?
- OrderServiceImpl, MemberServiceImpl에 테스트용 memberRepository를 출력하는 코드를 작성한다.

OrderServiceImpl, MemberServiceImpl

출력되는 값이 같은지 테스트
- 확인해보면 memberRepository 인스턴스는 모두 같은 인스턴스가 공유되어 사용된다.
- AppConfig의 자바 코드를 보면 분명히 각각 2번 new MemoryMemberRepository 호출해서 다른 인스턴스가 생성되어야 하는데?
- 어떻게 된 일일까? 혹시 두 번 호출이 안되는 것일까? 실험을 통해 알아보자
-
@Configuration public class AppConfig { //@Bean memberService -> new MemoryMemberRepository() //@Bean orderService -> new MemoryMemberRepository() //2가지 Bean에서 new로 MemoryMemberRepository를 생성해 준다, 과연 싱글톤으로 생성 될까?? @Bean public MemberService memberService(){ System.out.println("call AppConfig.memberService"); return new MemberServiceImpl(memberRepository()); //구체적인 클래스를 생성할때 알수 있다 } @Bean public OrderService orderService(){ System.out.println("call AppConfig.orderService"); return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public MemberRepository memberRepository() { //역할 //메소드 명을 본 순간 역할이 다 드러나는 장점이 있다 //후에 구현체를 갈아 끼울때 해당 코드만 변경하면 된다 System.out.println("call AppConfig.memberRepository"); return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy(){ //return new FixDiscountPolicy(); return new RateDiscountPolicy(); } }
- Bean이 생성되는 곳에서 호출되는 부분을 출력한다
- 내가 생각했던 call AppConfig.memberRepository는 총 3번이 호출돼야 하지만 1번만 호출된다.
- 어떻게 된 것일까?

테스트 결과
728x90
'스프링 핵심 원리(기본편)' 카테고리의 다른 글
| Ch06. 컴포넌트 스캔 - 컴포넌트 스캔과 의존관계 자동 주입 시작하기 (0) | 2022.02.20 |
|---|---|
| Ch05. 싱글톤 컨테이너 - @Configuration과 바이트코드 조작의 마법 (0) | 2022.02.19 |
| Ch05. 싱글톤 컨테이너 - 싱글톤 방식의 주의점 (0) | 2022.02.19 |
| Ch05. 싱글톤 컨테이너 - 싱글톤 컨테이너 (0) | 2022.02.19 |
| Ch05. 싱글톤 컨테이너 - 싱글톤 패턴 (0) | 2022.02.19 |