싱글톤 singleton 패턴 - 자바스크립트 예제

SW설계
읽는데 3분 소요
처음 쓰여진 날: 2025-09-02
마지막 수정일: 2025-09-02

요약

객체지향 프로그래밍의 핵심, GoF(Gang of Four) 디자인 패턴 중 생성 패턴인 싱글톤(Singleton)을 자바스크립트 코드와 함께 알아봅니다. 정처기 실기 대비를 위한 주관식 문제가 포함되어 있습니다.

싱글톤 패턴 요약

패턴 종류핵심 키워드
싱글톤 (Singleton)한 클래스에 단 하나의 객체만 존재하도록 강제
싱글톤 패턴 감자
싱글톤 패턴 감자

싱글톤 (Singleton) 패턴

싱글톤 패턴은 이름 그대로, 한 클래스에 단 하나의 객체만 존재하도록 강제하는 디자인 패턴입니다. single이라는 단어에서 알 수 있듯, 인스턴스가 유일하다는 것이 핵심입니다.

기본 구조

클래스 기반 언어에서 싱글톤은 보통 다음과 같이 구현합니다.

javascript
class Singleton {
  constructor() {
    // 인스턴스가 이미 존재하는지 확인합니다.
    if (Singleton.instance) {
      return Singleton.instance;
    }

    this.message = "나는 클래스 기반 유일 인스턴스야";
    // 없다면, 현재 인스턴스를 저장합니다.
    Singleton.instance = this;
  }
}

// 사용 예시
const a = new Singleton();
const b = new Singleton();

console.log(a === b); // true ✅
console.log(a.message); // "나는 클래스 기반 유일 인스턴스야"

new Singleton()을 두 번 호출했지만, 변수 ab는 정확히 동일한 인스턴스를 참조합니다. 🎯

언제 필요할까?

애플리케이션 전역에서 공유되어야 하는 자원이 있을 때 유용합니다. 대표적인 예로 로그 수집기(Logger) 가 있습니다.

만약 Logger 인스턴스가 여러 개라면 로그가 분산되어 기록되는 문제가 발생할 수 있습니다. ⚠️

javascript
class Logger {
  constructor(name) {
    this.name = name;
    this.logs = [];
  }

  log(message) {
    this.logs.push(`[${this.name}] ${message}`);
  }

  printLogs() {
    console.log(this.logs.join("\n"));
  }
}

// 인스턴스가 두 개 생성된 경우
const loggerA = new Logger("A");
const loggerB = new Logger("B");

loggerA.log("서버 시작");
loggerB.log("DB 연결됨");
loggerA.log("사용자 로그인");

// 로그가 각 인스턴스에 따로 저장됩니다.
loggerA.printLogs();
// [A] 서버 시작
// [A] 사용자 로그인

loggerB.printLogs();
// [B] DB 연결됨

이 문제를 해결하기 위해 Logger에 싱글톤 패턴을 적용하면, 여러 곳에서 인스턴스를 생성하더라도 실제로는 단 하나의 인스턴스만 사용하게 되어 로그를 중앙에서 관리할 수 있습니다.

javascript
class Logger {
  constructor() {
    if (Logger.instance) {
      return Logger.instance;
    }
    this.logs = [];
    Logger.instance = this;
  }

  log(message) {
    this.logs.push(message);
  }

  printLogs() {
    console.log(this.logs.join("\n"));
  }
}

// 여러 곳에서 Logger를 호출해도 괜찮습니다.
const logger1 = new Logger();
const logger2 = new Logger();

logger1.log("서버 시작");
logger2.log("DB 연결됨");
logger1.log("사용자 로그인");

// 모든 로그가 하나의 인스턴스에 기록됩니다.
logger1.printLogs();
/*
서버 시작
DB 연결됨
사용자 로그인
*/

console.log(logger1 === logger2); // true

💡 싱글톤 패턴 중요 키워드

  • 클래스에 오직 한 인스턴스만 존재하도록 강제한다.

정처기 기출 문제

기출
문제
객체 하나만 생성하도록 하고 어디서든 참조할 수 있도록 하는 디자인 패턴은?
보기
답변
정답정답 보기
기출
문제
특정 클래스의 인스턴스를 하나만 생성하도록 하고 이 인스턴스에 대한 접근 방법을 제공하는 디자인 패턴은?
보기
답변
정답정답 보기