-
@Configuration과 싱글톤 패턴스프링/스프링 기본이론 2023. 1. 30. 18:52
@Configuration // Configuration이라고 선언 public class AppConfig { @Bean // 스프링 컨테이너에 등록 public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemoryMemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public DiscountPolicy discountPolicy() { return new RateDiscountPolicy(); } }
AppConfig 클래스에서 관리하는 스프링 컨테이너를 보면 OrderService와 memberService도 new memberRepository를 만들어서 싱글톤 패턴이 깨진다고 생각을 할 수 있다.
각각 다른 2개의 MemoryMemberRepository가 생성되어 싱글톤이 깨지는 것처럼 보일 수 있다는 것이다.
하지만 @Configuration 어노테이션을 사용하면 계속 새로운 객체를 생성하지 않고, 싱글톤 패턴을 유지할 수 있다.
public MemberRepository getMemberRepository() { return memberRepository; }
MemberSerivce의 구현체와 OrderService의 구현체에 위와 같이 memberRepository를 return 해주는 get 메서드를 생성하고 테스트 코드에 어떠한 객체가 나오는지 실험 해 볼 것이다.
테스트코드에서 테스트를 실행시킨 결과 memberRepository, memberService, OrderService에서 만든 객체가 모두 같은 주소를 가리키는 것을 확인 할 수 있었다.
스프링은 @Configuration이라는 애노테이션을 이용해서 싱글톤패턴을 지향한다는 것을 확인할 수 있었다.
스프링 컨테이너가 @Bean이 붙은 메서드마다
1. memoryMemberRepository가 스프링 컨테이너에 등록되어 있으면
- 스프링 컨테이너에서 찾아서 반환
2. 스프링 컨테이너에 없으면
- 기존 로직을 호출해서 MemoryMemberRepository를 생성하고 스프링 컨테이너에 등록
이러한 규칙 덕분에 싱글톤 패턴이 보장되는 것이다.
'스프링 > 스프링 기본이론' 카테고리의 다른 글
의존관계 자동 주입 (0) 2023.01.31 컴포넌트 스캔 (0) 2023.01.30 스프링을 이용한 싱글톤 패턴 (0) 2023.01.30 싱글톤 패턴의 개념 (0) 2023.01.28 의존관계 주입과 스프링 컨테이너 (0) 2023.01.24