본문 바로가기
TIL

TIL #28) 싱글톤 패턴

by 해룸 2024. 3. 12.

 

싱글톤 패턴은 소프트웨어 개발에서 인스턴스가 오직 하나만 생성되어야 하는 경우에 사용되는 디자인 패턴입니다.

이 패턴의 목적은 전역 상태를 관리하고, 여러 컴포넌트 간의 데이터 공유를 용이하게 하며, 메모리 사용을 최적화하는 것입니다.

싱글톤 패턴은 특정 클래스의 인스턴스가 프로그램 전체에서 단 하나만 존재하도록 보장합니다.

이를 통해 동일한 리소스나 서비스에 대한 중복 생성을 방지하고, 전역 접근 지점을 제공합니다.

 

싱글톤 패턴을 구현하는 방법은 여러 가지가 있지만, 가장 기본적인 구현 방법은 다음과 같습니다:

  1. 생성자를 private으로 선언하여 외부에서 인스턴스를 직접 생성할 수 없도록 합니다.
  2. 클래스 내부에 정적(private) 변수로 인스턴스를 저장합니다.
  3. 인스턴스에 접근할 수 있는 정적 메소드(예: getInstance)를 제공합니다. 이 메소드는 클래스의 유일한 인스턴스를 반환합니다. 인스턴스가 아직 생성되지 않았다면, 이 메소드 내에서 인스턴스를 생성하고 반환합니다.
class Singleton {
    private static instance: Singleton;

    // 생성자를 private로 선언해 외부 인스턴스화 방지
    private constructor() {}

    // 인스턴스에 접근하기 위한 정적 메소드
    public static getInstance(): Singleton {
        // 인스턴스가 존재하지 않는 경우에만 인스턴스 생성
        if (!Singleton.instance) {
            Singleton.instance = new Singleton();
        }
        return Singleton.instance;
    }

    public someMethod() {
        // 싱글톤 인스턴스의 메소드 로직
    }
}

// 사용 예
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 === instance2); // true, 두 변수는 같은 인스턴스를 참조

 

NestJS의 싱글톤과 의존성 주입 시스템

NestJS는 내부적으로 싱글톤 패턴을 적극 활용하는 프레임워크입니다.

NestJS의 의존성 주입 시스템은 서비스, 컨트롤러, 모듈 등 대부분의 인스턴스를 자동으로 싱글톤으로 관리합니다.

이는 개발자가 수동으로 싱글톤 로직을 구현할 필요 없이 프레임워크 차원에서 인스턴스의 중복 생성을 방지하고, 애플리케이션 전반에 걸쳐 메모리 사용을 최적화합니다.

서비스나 프로바이더를 모듈에 등록할 때, NestJS는 이들을 싱글톤으로 관리합니다.

이를 통해 애플리케이션의 어느 곳에서든 동일한 인스턴스에 접근할 수 있으며, 이는 전역 상태 관리나 여러 컴포넌트 간의 데이터 공유를 매우 효율적으로 만듭니다.

예를 들어, 사용자 인증 서비스나 데이터베이스 커넥션 같은 리소스는 애플리케이션 내에서 단 한 번만 생성되고, 필요한 모든 곳에서 재사용될 수 있습니다.

NestJS에서는 이러한 서비스나 리소스를 모듈에 프로바이더로 등록하면, NestJS의 DI 컨테이너가 자동으로 싱글톤 인스턴스를 관리합니다.

 

싱글톤의 장점:

  • 메모리 효율: 인스턴스가 단 하나만 생성되므로 메모리 사용이 최적화됩니다.
  • 데이터 공유: 같은 인스턴스를 여러 곳에서 사용함으로써 데이터 공유가 용이합니다.
  • 접근 제어: 인스턴스 생성을 제어하고, 전역 접근 지점을 통해 안전하게 접근할 수 있습니다.

싱글톤 패턴은 단 하나의 인스턴스만 생성하는 것인데, 특정 경우에는 요청마다 새로운 인스턴스를 생성하는 것이 더 적절할 수 있으며, NestJS는 이러한 경우를 위해 스코프를 설정할 수 있는 기능도 제공합니다.

예를 들어, HTTP 요청의 컨텍스트에 따라 각 요청마다 새로운 인스턴스가 필요한 경우가 있습니다.

NestJS는 이러한 요구를 충족시키기 위해 요청 스코프, 트랜시언트 스코프 등 다양한 스코프 옵션을 제공합니다.

  • 요청 스코프(Request-scoped): 요청이 들어올 때마다 새로운 인스턴스를 생성합니다. 이는 주로 요청마다 상태를 독립적으로 유지해야 할 때 사용됩니다.
  • 트랜시언트 스코프(Transient-scoped): DI 시스템이 새로운 인스턴스를 주입할 때마다 새로운 인스턴스를 생성합니다. 이는 사용하는 곳마다 독립적인 상태가 필요할 때 유용합니다.

 

'TIL' 카테고리의 다른 글

TIL #30) MVCC를 알아보자  (2) 2024.03.15
TIL #29) 0312 오늘 한일  (0) 2024.03.12
TIL #27) Error: getaddrinfo EAI_FAIL 오류  (0) 2024.03.07
TIL #26) 레디스 알아보기  (0) 2024.03.06
TIL #26) 타입스크립트 발 담구기  (0) 2024.03.05