[Spring] 웹 애플리케이션과 싱글톤

soonhankwon·2023년 9월 22일
0

Spring makes it easy to create Java enterprise applications.

  • 스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했습니다.
  • 대부분의 스프링 애플리케이션은 웹 애플리케이션입니다.
  • 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 합니다.


순수한 DI 컨테이너

  • 요청을 할 때마다 객체를 새로 생성합니다.
    • 고객 트래픽이 초당 100이 나오면 초당 객체 100개 생성되고 소멸됩니다.
    • 메모리 낭비가 심함
  • 해결방안은 해당 객체를 딱 1개만 생성되고, 공유하도록 설계합니다.
    • 싱글톤 패턴

싱글톤 패턴

  • 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴입니다.
  • 그래서 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 합니다.
    • private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야함.

Exam

public class SingletonService {

    // static 영역에 객체를 딱 1개 생성
    private static final SingletonService instance = new SingletonService();
    
    // public 으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용
    public static SingletonService getInstance() {
        return instance;
    }
    
    // 생성자를 private 로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다.
    private SingletonService() {
    }

    public void logic() {
        System.out.println("print singleton instance logic");
    }
}
  • 딱 1개의 객체 인스턴스만 존재해야 하므로, 생성자를 private 로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는 것을 막습니다.

싱글톤 패턴 문제점

  • 싱글톤 패턴을 구현하는 코드 자체가 많이 들어갑니다.
  • 의존관계상 클라이언트가 구체 클래스에 의존합니다. → DIP 위반
    public class SingletonClient {
        private Singleton singleton = Singleton.getInstance(); // 구체 클래스에 의존
    }
  • 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높습니다.
    • 싱글톤 클래스를 수정하면 클라이언트 클래스에 영향을 줍니다.
  • 테스트하기 어렵습니다.
    • 예를 들어 싱글톤 인스턴스를 의존하는 단위 테스트가 수천 개 있다면?
    • 싱글톤 인스턴스의 수정으로 인해 단위 테스트 수천개를 수정해야할 것입니다.
  • 내부 속성을 변경하거나 초기화하기 어렵습니다.
    • 일반적으로 생성 시점에 초기화되며, 이후 변경하기 어렵게 설계됨
  • private 생성자로 자식 클래스를 만들기 어렵습니다.
    • 생성자를 보통 private 로 선언하기 때문에 상속을 통한 확장이 어려워짐
  • 결론적으로 유연성이 떨어집니다.
    • 다른 인스턴스를 생성하거나 다른 구현으로 교체하기가 어려워짐
  • 일부에서는 안티 패턴이라고 불리기도 합니다.

주의점

또한 싱글톤은 단 하나의 인스턴스만 존재하기 때문에 객체의 상태를 변경시키는 설계를 하면 안됩니다. 이러한 경우 여러 스레드에서 단 하나의 인스턴스를 공유하기 때문에 예상치못한 상태 변화가 일어날 것입니다.

DI

이러한 문제점들로 인해 최근에는 DI(Dependency Injection)와 같은 더 유연하고 테스트 가능한 패턴을 사용합니다.


Reference.

profile
ProblemOverFlow

0개의 댓글