Ted's Codding study

싱글톤 패턴 본문

TypeScript

싱글톤 패턴

Ted93 2024. 7. 2. 11:29
특정 클래스의 인스턴스가 프로그램 내에서 오직 하나만 존재하도록 보장하는 디자인 패턴
주로 자원을 공유해야 하는 상황에서 유용
일관된 상태를 유지하고 싶을 때 적합

데이터베이스 연결이나 로그 파일 핸들러와 같이 시스템 전체에서
단 하나만 있어야 하는 리소스를 관리할 때 사용

1. 싱글톤 패턴의 구현 방법

1-1) 생성자를 비공개로 설정

  • 클래스의 외부에서 new 키워드를 사용하여 인스턴스를 생성할 수 없도록 설정

 

1-2) 클래스 내부에서 인스턴스 생성

  • 클래스 자체가 자신의 유일한 인스턴스를 생성하고 관리

 

1-3) 전역 접근점 제공

  • 인스턴스에 접근할 수 있는 정적 메소드(보통 getInstance라고 명명)를 제공
  • 필요할 때 인스턴스를 생성하고, 이미 인스턴스가 존재하면 기존 인스턴스를 반환

 

2. TypeScript에서의 싱글톤 패턴 구현 예제

  • 로거 기능을 싱글톤으로 구현
  • 로거는 애플리케이션의 다양한 부분에서 메시지를 로깅하는 데 사용
  • Logger 클래스는 자신의 유일한 인스턴스를 관리하며, 이 인스턴스에 대한 전역 접근점을 제공
  • getInstance 메소드는 인스턴스가 아직 생성되지 않았다면 새로 생성하고, 이미 존재한다면 기존 인스턴스를 반환
  • Logger 클래스의 모든 사용자가 동일한 인스턴스를 공유
// LogLevel 타입 정의
type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';

// Logger 클래스 정의
class Logger {
  private static instance: Logger;
  private logLevel: LogLevel = 'info';
  private logs: string[] = [];

  // 외부에서 직접적인 인스턴스 생성을 불가능하게 설정
  private constructor() {}

  public static getInstance(): Logger {
    // Logger.instance는 정적메서드 호출 방식임
    if (!Logger.instance) {
      Logger.instance = new Logger();
    }
    return Logger.instance;
  }

  public setLogLevel(level: LogLevel): void {
    this.logLevel = level;
  }
  public log(message: string, level: LogLevel = 'info'): void {
    const levels: LogLevel[] = ['debug', 'info', 'warn', 'error', 'fatal'];

    // 입력된 로그 레벨이 현재 설정된 로그 레벨 이상일 때만 로그를 기록
    if (levels.indexOf(level) >= levels.indexOf(this.logLevel)) {
      const timestamp = new Date().toISOString();
      const formattedMsg = `[${timestamp}] [${level}]: ${message}`;

      this.logs.push(formattedMsg);
      console.log(formattedMsg);
    }
  }

  public printLogHistory(): void {
    console.log('-----전체 히스토리 출력-----');
    console.log(this.logs.join('\\n'));
  }
}
const logger = Logger.getInstance();
logger.setLogLevel('debug'); // 로그 레벨을 debug로 설정
logger.log('이것은 디버그 메세지입니다.', 'debug');
logger.log('이것은 정보출력 메세지입니다.', 'info');

logger.printLogHistory();

const anotherLogger = Logger.getInstance();
anotherLogger.printLogHistory();

 

로거(Logger)

  • 소프트웨어의 실행 중에 발생하는 이벤트를 기록하는 도구
  • 개발자나 시스템 관리자가 소프트웨어의 상태를 실시간으로 모니터링하거나, 나중에 문제를 진단할 수 있는 기록을 남기는 것이 가능
  • 주로 디버깅, 오류 추적, 시스템 상태 모니터링, 보안 감사 등 다양한 목적으로 사용

 

 

노션으로 보고 싶다면?

https://short-echidna-b16.notion.site/7be8178ee46d44948abac9b6762c98c9?pvs=4

 

싱글톤 패턴 | Notion

목차

short-echidna-b16.notion.site