김영한님의 스프링 핵심 원리 강의 학습 내용입니다.
- 순수한 DI 컨테이너(AppConfig)는 요청을 할 때 마다 객체를 새로 생성한다. -> 메모리 낭비가 심하다.
싱글톤 패턴
public class SingletonService {
private static final SingletonService instance = new SingletonService();
public static SingletonService getInstance(){
return instance;
}
private SingletonService(){
}
}
- getInstance() : 항상 같은 인스턴스 반환
void singletonServiceTest(){
SingletonService singletonService1 = SingletonService.getInstance();
SingletonService
System.out.println("singletonService1 = " + singletonService1);
Assertions.assertThat(singletonService1).isSameAs(singletonService2);
}
- isEqualTo : 값 비교
- isSameAs : 객체 비교
단점
- 구현 코드가 많다.
- DIP, OCP 위반 : 구체.getInstance()
- 테스트가 어렵다.
- 유연성이 떨어진다.
- 안티 패턴
싱글톤 컨테이너
void springContainer(){
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService1 = ac.getBean("memberService", MemberService.class);
Assertions.assertThat(memberService1).isSameAs(memberService2);
}
- 싱글톤 패턴 적용 없이 객체를 싱글톤으로 관리
- 싱글톤 패턴 단점 보완
- 다수의 요청이 올 때 이미 만들어진 객체를 공유하여 효율적인 재사용
싱글톤 방식 주의점
- 상태를 유지한는 식으로 설계하면 안된다.
- 무상태로 설계해야 한다.
- 스프링 빈의 필드에 공유 값을 설정하면 안된다.
- @Configuration 사용해야 싱글톤을 보장