스프링과 싱글톤

싱글톤이란?

싱글톤이란 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 만약에 클라이언트의 호출이 있을 때 마다 새로운 인스턴스를 생성한다면, 이를 서버의 메모리가 버티기에는 너무나도 부담이 된다. 따라서 이러한 경우에는 인스턴스가 1개만 생성되는 싱글톤 패턴을 사용한다.

  • 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야한다. 따라서 private 생성자를 통해 외부에서 임의로 new 키워드를 사용하지 못하도록 막는다.
public class SingletonService {

    private static final SingletonService instance = new SingletonService();

    public static SingletonService getInstance(){
        return instance;
    }

    // private 생성자를 통해 new 를 사용한 인스턴스 생성을 막음
    private SingletonService() {

    }
    public void logic(){
        System.out.println("싱글톤 객체 로직 호출");
    }

}
  1. static 영역에 객체 instance를 하나 생성한다.
  2. 이 객체 인스턴스는 오직 getInstance() 메서드를 통해서만 조회할 수 있도록 구현한다. 항상 같은 인스턴스를 반환하도록 만들어야한다.
  3. 딱 1개의 객체 인스턴스만 존재해야 하므로, 생성자를 private로 막아서 new 키워드로 객체 인스턴스가 생성되는 것을 막는다.

싱글톤 패턴의 문제점

하지만 하나의 인스턴스만 사용한다는 싱글톤패턴에도 다음과 같은 문제점이 있다. 따라서 안티패턴으로 불린다.

  • 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.
  • 의존관계상 클라이언트가 구체 클래스에 의존한다 -> DIP를 위반한다.
  • 클라이언트가 구체 클래스에 의존하기 때문에 OCP 원칙을 위반할 가능성이 높다.
  • 유연성이 떠어진다.

스프링의 싱글톤 컨테이너

하지만 스프링컨테이너는 싱글톤 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다.

따라서 스프링 컨테이너는 싱글톤 컨테이너 역할을 한다. 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라고 한다.

  • 싱글톤 패턴 덕분에 DIP, OCP, private 생성자로부터 자유로워질 수 있다.

싱글톤 방식의 주의점

싱글톤 패턴은 결국 하나의 객체 인스턴스를 공유하기 때문에, 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다.

Stateless (무상태) 설계란

  • 특정 클라이언트에 의존적인 필드가 있으면 안된다.
  • 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다.

reference

  • 김영한, Spring 기본편

Written by@Gomster
항상 노력하고 나아가는 백엔드 개발자가 되고 싶은 대학생입니다.

GitHub