Architecture

싱글톤 패턴 (Singleton Pattern)

주인장 꼬비 2023. 5. 10. 00:20

싱글톤 패턴 (Singleton Pattern)

싱글톤 패턴은 객체 지향 프로그래밍에서 많이 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 클래스의 인스턴스가 오직 하나만 생성되도록 보장하며, 이 인스턴스에 대한 전역적인 접근이 필요할 때 사용됩니다. 즉, 전역에서 유일한 객체를 생성하고, 이후에는 생성된 객체를 공유하여 사용하는 패턴입니다.

특징

  1. 클래스 내부에서 유일한 인스턴스를 생성합니다.
  2. 유일한 인스턴스를 참조할 수 있는 전역 변수를 제공합니다.
  3. 외부에서 인스턴스를 생성할 수 없도록 생성자를 private으로 선언합니다.
  4. 유일한 인스턴스를 반환하는 정적 메소드를 제공합니다.

구현 방법

싱글톤 패턴을 구현하는 방법은 다양하지만, 가장 간단한 방법은 클래스의 생성자를 private으로 선언하고, 정적 메소드를 이용해 인스턴스를 반환하는 것입니다. 이를 보통 getInstance() 메소드라고 명명합니다.

class Singleton {
  private static instance: Singleton;

  private constructor() {}

  public static getInstance(): Singleton {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton();
    }
    return Singleton.instance;
  }
}

위 코드에서는 Singleton 클래스의 생성자를 private로 선언하여 외부에서 객체를 생성할 수 없도록 하였습니다. 대신 getInstance() 메서드를 통해 유일한 인스턴스를 생성하고 반환합니다. 인스턴스를 생성할 때 이미 생성되었는지 검사하는데, 이미 생성되었다면 해당 인스턴스를 반환하고, 생성되어 있지 않다면 새로운 인스턴스를 생성합니다. 이 때, private static instance: Singleton 라는 private static 필드를 통해 유일한 인스턴스를 저장하게 됩니다.

사용 예시

싱글톤 패턴은 다음과 같은 상황에서 사용될 수 있습니다.

로깅, 캐시, 데이터베이스 연결 등과 같이 자원을 공유해야 하는 경우
설정 정보, 환경 변수 등과 같이 애플리케이션 전역에서 접근 가능한 정보를 관리하는 경우
UI 컴포넌트와 같이 애플리케이션 전역에서 유일한 객체를 생성해야 하는 경우
이 외에도 상황에 따라 다양하게 사용될 수 있습니다.

장단점

장점

  • 하나의 인스턴스만 생성되기 때문에, 자원의 낭비를 막을 수 있습니다.
  • 유일한 객체를 보장하여, 객체의 일관성과 데이터의 일관성을 유지할 수 있습니다.
  • 객체 생성에 대한 오버헤드를 줄일 수 있습니다.
  • 전역적인 객체이기 때문에, 다른 객체들이 쉽게 접근할 수 있습니다.

단점

  • 유일한 객체이기 때문에, 멀티스레드 환경에서 동기화 문제가 발생할 수 있습니다.
    -> 여러 스레드가 동시에 객체를 생성하려는 경우, 인스턴스가 두 번 생성될 수 있습니다.)

  • 객체의 공유로 인해 의존성이 높아집니다
    -> 어디서든지 접근 가능한 전역 변수와 같은 역할을 하기 때문에, 다른 객체들이 이 싱글톤 객체에 의존적이 되고, 이 객체가 변경될 경우, 그것을 참조하고 있는 다른 객체들도 영향을 받게 됩니다. 이러한 의존성 문제로 인해 코드의 유연성과 테스트 용이성이 떨어질 수 있습니다.

  • 전역 변수와 같은 역할을 하기 때문에, 코드 어디서든 접근할 수 있습니다.
    -> 코드 범위의 파악하기가 어려워지고, 객체를 무분별하게 공유함으로써 메모리 누수와 같은 문제가 발생할 가능성도 있습니다. (해당 객체가 사용되지 않더라도 메모리에서 해제되지 않기 때문)

=> 싱글톤 패턴을 사용할 때는 다중 스레드 환경에서 안전하도록 코드를 작성하고, 메모리 누수를 방지하기 위해 적절한 해제 코드를 작성해주는 것이 중요합니다.