개발일지/Spring

싱글톤 패턴 (Singleton Pattern)

E-room 2023. 3. 3. 22:06
728x90

싱글톤 패턴이란?

하나의 인스턴스만 생성하여 사용하는 디자인 패턴 (클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴)

 

사용법

  1. static 영역에 객체 instance를 하나 미리 생성한다
  2. 이 객체 인스턴스가 필요하면 오직 getInstance() 메서드를 통해서만 조회할 수 있도록 한다 (이 메서드는 항상 같은 인스턴스를 반환함)
  3. 오직 하나의 객체 인스턴스만 존재해야 하므로, 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는 것을 막아준다
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("싱글톤 객체 로직 호출");
    }
}

 

참고: 싱글톤 패턴을 구현하는 방법은 여러가지가 있음!!
여기서는 객체를 미리 생성해두는 가장 단순하고 안전한 방법을 보여주었음

 

장점

  • 불필요한 낭비를 막아준다
    • api가 호출될때 마다 새로운 객체를 생성하는 것이 아닌, 미리 만들어둔 객체를 공유해서 효율적으로 사용할 수 있음
  • 싱글톤으로 구현한 인스턴스는 전역이므로 다른 클래스들의 인스턴스들이 데이터를 공유할 수 있다

 

단점

  • 멀티스레드 환경에서 동기화 처리를 하지 않았을 때, 인스턴스가 2개가 생성될 수 있음
  • 싱글톤 패턴을 구현하는 코드 자체가 많이 들어감
  • 의존관계상 클라이언트가 구체 클래스에 의존한다 -> DIP 위반
  • 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높음
  • 내부 속성을 변경하거나 초기화하기 어려움
  • private 생성자로 자식 클래스를 만들기 어려움
  • 결합도가 높아져 유연성이 떨어짐 -> 유지보수 힘들어짐, 테스트하기 어려움
  • 안티패턴으로 불리기도 함

 


 

 

싱글톤 패턴(Singleton pattern) | 👨🏻‍💻 Tech Interview

싱글톤 패턴(Singleton pattern) 애플리케이션이 시작될 때, 어떤 클래스가 최초 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴 즉, 싱글톤 패턴은 '하나'의 인스

gyoogle.dev

 

728x90