섹션5. 싱글톤 컨테이너

웹 애플리케이션 사용자는 엄청 많다!

서비스를 요청하게 될때 마다 그에 따른 객체를 계속 생성하게 된다면?

엄청난 객체의 수를 경험하게 된다….. → 객체 하나로 모두 해결할 순 없을까?

그래서 나온개념이 싱글톤

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에서 배웠던 스프링 컨테이너가 싱글톤을 지원하고 스프링 빈이 싱글톤으로 관리 되는 빈이다!

Untitled

Untitled

싱글톤 방식 주의점

→ 상태를 유지하면 안된다. 모든 요청이 한 객체를 이용하기 때문에