스프링/스프링 기본이론

@Configuration과 싱글톤 패턴

chanhee01 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를 생성하고 스프링 컨테이너에 등록

 

이러한 규칙 덕분에 싱글톤 패턴이 보장되는 것이다.