이전에 만들었던 순수한 자바 AppConfig는 요청할 때 마다 객체를 새로 생성한다.
고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸된다 -> 메모리 낭비가 심하다
이 문제를 싱글톤 패턴을 사용하면 해결할 수 있다.
클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 패턴
public class SingletonService {
// 1. static 영역에 객체를 딱 1개만 생성
private static final SingletonService instance = new SingletonService();
//2. public으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용
public static SingletonService getInstance(){
return instance;
}
//3. 생성자를 private로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 막는다.
private SingletonService(){
}
public void logic(){
System.out.println("싱글톤 객체 로직 호출");
}
}
@Configuration
public class AppConfig {
//MemberService 역할
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
//MemberRepository 역할
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
//OrderService 역할
@Bean
public OrderService orderService(){
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
// DiscountPolicy 역할
@Bean
public DiscountPolicy discountPolicy(){
// AppConfig에서 RateDiscountPolicy로만 교체하면 됨
return new RateDiscountPolicy();
}
}
AppConfig
의 @Configuration
어노테이션이 스프링 빈의 싱글톤을 보장해준다.