Singleton

Singleton 패턴

간략 정의

The Singleton Pattern ensures a class has only one instance, and provides a global point of access to it

싱글톤 패턴은 클래스에 하나의 인스턴스만 가지도록한다. 그리고 전역에서 접근할 수 있도록 제공한다.

Eric Freeman, Elisabeth Robson, “Head First Design Patterns, 2nd Edition”, O’Reilly Media, Inc., 2020

싱글톤 패턴은 프로그램에서 하나의 인스턴스만 생성하고 그 인스턴스를 사용하도록 하는 패턴이다. 사용되는 곳은 전역 변수, 전역 인스턴스 등에 사용된다. 자바의 언어로 싱글톤 패턴을 보면 항상 thread-safe 가 나온다. 찰나의 순간에 인스턴스가 생성되지 않은 싱글톤 클래스에 2개 이상의 요청이 들어왔을 때 인스턴스가 2개 이상이 생길 수 있기 때문이다. 그렇기에 thread-safe 를 보장하기 위해 synchronized 를 사용한다. 필자의 경우 javascript 를 기준 언어로 사용하는데 딱히 thread 관련 문제를 찾아보기는 어렵다. 해당 문제를 해결할 수 있는 기법은 몇 가지를 찾아 발생 가능한지 테스트 해보려했으나 2개 이상의 인스턴스가 생기는 경우를 발생시키지 못했다. 여하튼 thread-safe 문제를 염두해둘 필요는 있다.

혹자의 경우 그냥 전역에서 접근할 거면 변수로 선언하면 되는 것 아닌가 의문을 제기할 수 있다. 일리있는 말이지만 싱글톤 패턴은 lazy initialization 을 지원한다. 즉 필요한 순간에 생성된다는 것이다.

Keyword

getInstance : 새로 생성된 인스턴스 혹은 기존의 인스턴스를 반환한다.

Class Diagram

패턴 적용

Alt text

Code

기존

이 코드의 경우는 얼마든지 중복적으로 인스턴스를 생성할 수 있다. 인스턴스 생성을 방지하려면 여러 코드가 덕지덕지 추가되어야할 것이다.

class Connection {}

class DBConnection {
  private connection: any;
  constructor() {
    this.connection = new Connection();
  }

  public query(query: string): any {
    this.connection.query(query);
  }

  public close(): void {
    this.connection.close();
  }
}

const conn = new DBConnection();
conn.query('SELECT * FROM USERS');
conn.close();

패턴 적용

class DBConnection {
  private static instance: DBConnection;
  private connection: any; // this should be the DB connection object
  private constructor() {
    // Initialize the connection to the database here
  }

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

  public query(query: string): any {
    // Execute the query using the connection and return the result
  }

  public close(): void {
    // Close the connection to the database
  }
}

const conn = DBConnection.getInstance();
conn.query('SELECT * FROM USERS');
conn.close();

실제 사용 느낌

싱글톤 패턴의 경우 개념이 간단하다보니 이해를 하는데 어렵지는 않았다. 좀 익숙해져서 그런지 이번 포스팅을 하면서 다시금 느낀 점은 없다.


Decorator
Command
NCloud LB & SourcePipeline 구축하기
tech collection 서비스 성능 개선하기
Selenium 복권 구매 자동화 만들어보기
디자인 패턴
책 리뷰
블로그 챌린지