상현에 하루하루
개발자의 하루

싱글턴 패턴

( 업데이트: )

싱글턴 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에는 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.

장점

  • 메모리 절약
  • 데이터 브릿지 역할
  • 중복 코드 방지
  • 코드 신뢰성 증가

단점

  • 자신도 모르는 사이에 인스턴스간 데이터 경합
  • 쓰레드 unsafe
  • 코드 중앙 집중화

FrontEnd

프론트엔드에서는 한명의 유저, 한대의 머신에서 실행 되는 로직이므로 싱글톤이 얻을 수 있는 장점이 별로 없어 보입니다.

아무리 막아봐도 window.**로 전부 접근이 가능하죠.
팩토리 패턴을 쓸때는 유용하겠습니다. 혹시 모를 Memory Leak을 막을 때도 유용해 보입니다만, 프론트엔드에서 싱글톤 패턴 만의 특장점은 떠오르는게 없네요

그렇다면 코드 생산성이 나아지느냐. 이것은 더이상 패턴 문제가 아니게 됩니다.

JavaScript는 싱글 쓰레드이고, 브라우저에서 돌아가는 스크립트 전체를 통틀어 쓰레드 1개 뿐입니다. 쓰레드 경합이 일어날 수 없는 구조이기 때문에 패턴으로 얻는 장점은 없다고 봅니다.

예시

class Database {
  constructor(data) {
    if (Database.exists) {
      return Database.instance;
    }

    this._data = data;
    Database.instance = this;
    Database.exists = true;

    return this;
  }

  getData() {
    return this._data;
  }

  setData(data) {
    this._data = data;
  }
}

// using
const mongo = new Database('monogo');
console.log(mongo.getData());  // mongo

const mysql = new Database('mysql');
console.log(mysql.getData());  // mongoCode language: JavaScript (javascript)

이 예제에는 싱글톤으로 구현된 Database 클래스가 있습니다. 먼저 new 연산자를 사용하여 Database 클래스 생성자를 호출, mongo라는 객체를 만듭니다. 이때는 객체가 없기 때문에 constructor 내에서 객체가 인스턴스화 됩니다.

두번째로 mysql이라는 객체를 만들때는, constructor 내에서 객체 (instance)가 존재하고 있기 때문에 새 객체가 인스턴스화되지 않고 이전에 인스턴스화된 객체, 즉 mongo 객체에 대한 참조가 반환됩니다.