웹 애플리케이션 사용자는 엄청 많다!
서비스를 요청하게 될때 마다 그에 따른 객체를 계속 생성하게 된다면?
엄청난 객체의 수를 경험하게 된다….. → 객체 하나로 모두 해결할 순 없을까?
그래서 나온개념이 싱글톤
public void singletonServiceTest() {
//private으로 생성자를 막아두었다. 컴파일 오류가 발생한다.
//new SingletonService();
//1. 조회: 호출할 때 마다 같은 객체를 반환
SingletonService singletonService1 = SingletonService.getInstance();
//2. 조회: 호출할 때 마다 같은 객체를 반환
SingletonService singletonService2 = SingletonService.getInstance();
//참조값이 같은 것을 확인
System.out.println("singletonService1 = " + singletonService1);
System.out.println("singletonService2 = " + singletonService2);
// singletonService1 == singletonService2
assertThat(singletonService1).isSameAs(singletonService2);
singletonService1.logic();
}
이런 식으로 싱글톤을 코딩 할 수 있지만 이것은 많은 문제점이 존재한다.
싱글톤 패턴 문제점
1 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다. 2 의존관계상 클라이언트가 구체 클래스에 의존한다. DIP를 위반한다. 3 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다. 4 테스트하기 어렵다. 5 내부 속성을 변경하거나 초기화 하기 어렵다. 6 private 생성자로 자식 클래스를 만들기 어렵다. 7 결론적으로 유연성이 떨어진다. 8 안티패턴으로 불리기도 한다.
어쨌든 이런 문제를 해결하고 싱글톤도 할 수 있도록 스프링이 지원한다.
바로 섹션4에서 배웠던 스프링 컨테이너가 싱글톤을 지원하고 스프링 빈이 싱글톤으로 관리 되는 빈이다!
싱글톤 방식 주의점
→ 상태를 유지하면 안된다. 모든 요청이 한 객체를 이용하기 때문에