>웹 프론트엔드 >JS 튜토리얼 >싱글톤 디자인 패턴: 애플리케이션에서 전역 상태 관리

싱글톤 디자인 패턴: 애플리케이션에서 전역 상태 관리

Susan Sarandon
Susan Sarandon원래의
2024-12-03 19:34:15417검색

애플리케이션의 여러 부분(예: 데이터베이스 연결, WebSocket 클라이언트 또는 구성 관리자)에서 공유해야 하는 개체를 처리해야 하는 경우를 경험해 보셨나요?

애플리케이션 또는 프로세스 라이프사이클 전반에 걸쳐 일관성을 유지하고 액세스할 수 있도록 이러한 객체를 어떻게 관리합니까? 여기서 싱글턴 디자인 패턴이 활용됩니다.

개요

싱글턴창의적 디자인 패턴으로, 새 기능을 사용하여 객체를 생성하는 기본 방식에서 발생하는 다양한 문제를 다루는 디자인 패턴 카테고리입니다. 키워드 또는 연산자.

싱글턴 디자인 패턴은 두 가지 주요 문제를 해결하는 데 중점을 둡니다.

  1. 인스턴스에 전역 액세스 지점을 어떻게 제공할 수 있나요?
  2. 클래스 또는 특정 유형의 객체에 인스턴스가 하나만 있도록 어떻게 보장할 수 있나요?

데이터베이스 연결, WebSocket 클라이언트, 캐싱 서비스 또는 전체 애플리케이션 수명 주기 동안 메모리에서 유지하고 변경해야 하는 모든 것과 같은 특정 종류 또는 유형의 전역 상태를 관리하는 방식을 단순화하고 표준화할 수 있습니다.

싱글턴 디자인 패턴을 어떻게 구현할 수 있나요?

Singleton Design Pattern: Managing Global States in Your Applications

위 스키마는 다음 TypeScript 클래스로 변환됩니다.

타입스크립트 예시

class Singleton {
  private static instance: Singleton
  // other properties...
  public authorName: string

  private constructor({ authorName }: { authorName: string }) {
    this.authorName = authorName
  }

  public static getInstance(params) {
    if (!this.instance) {
      this.instance = new Singleton(params)
    }
    return this.instance
  }
  // other methods...
}

  • 클래스는 고유하게 공유 가능한 인스턴스를 저장하기 위한 정적 속성을 정의해야 합니다.

정적이라는 키워드는 인스턴스 객체가 클래스의 인스턴스와 연결되지 않고 클래스 정의 자체와 연결되어 있음을 의미합니다.

  • 클래스 생성자는 비공개로 표시되어야 합니다. 클래스의 인스턴스를 가져오는 유일한 방법은 getInstance 정적 메서드를 호출하는 것입니다.
const instance = Singleton.getInstance({ authorName: "Sidali Assoul" })


// let's imagine
const instance1 = Singleton.getInstance({ authorName: "Sidali Assoul" }) // "Sidali Assoul"
const instance2 = Singleton.getInstance({ authorName: "John Doe" }) // "Sidali Assoul"

싱글턴 클래스와 연결된 정적 메소드인 getInstance를 호출하여 위 클래스를 활용할 수 있습니다.

getInstance 메소드는 코드베이스의 다른 위치에서 클래스를 여러 번 인스턴스화하더라도 항상 동일한 인스턴스를 얻도록 보장합니다.

Singleton Design Pattern: Managing Global States in Your Applications

따라서 두 변수(instance1 및 instance2)는 동일한 싱글톤 인스턴스를 공유합니다.

첫 번째 실제 시나리오

Prisma는 JavaScript 생태계에서 잘 알려진 ORM입니다. 애플리케이션에서 Prisma를 사용하려면 PrismaClient를 가져온 다음 여기에서 객체를 인스턴스화해야 합니다.

class Singleton {
  private static instance: Singleton
  // other properties...
  public authorName: string

  private constructor({ authorName }: { authorName: string }) {
    this.authorName = authorName
  }

  public static getInstance(params) {
    if (!this.instance) {
      this.instance = new Singleton(params)
    }
    return this.instance
  }
  // other methods...
}

Prisma 클라이언트는 일부 엔터티를 처음 쿼리하거나 변경하려고 할 때만 지연 방식, 즉 다른 말로 데이터베이스에 연결합니다.

const instance = Singleton.getInstance({ authorName: "Sidali Assoul" })


// let's imagine
const instance1 = Singleton.getInstance({ authorName: "Sidali Assoul" }) // "Sidali Assoul"
const instance2 = Singleton.getInstance({ authorName: "John Doe" }) // "Sidali Assoul"

prismaClient를 파일로 가져올 때마다 PrismaClient에서 새 인스턴스가 만들어집니다. 따라서 해당 인스턴스를 사용할 때마다 많은 데이터베이스 연결이 설정됩니다.

import { PrismaClient } from "@prisma/client"

export const prismaClient = new PrismaClient()

열린 데이터베이스 연결이 많으면 애플리케이션 성능이 저하되고 데이터베이스가 일반적으로 제한된 수의 연결만 처리할 수 있으므로 데이터베이스가 종료될 수도 있습니다.

싱글턴 디자인 패턴은 PrismaClient 클래스의 인스턴스가 두 개 이상 있는 것을 방지하고 PrismaClientSingleton.getInstance() 정적 메서드를 통해 액세스할 수 있는 단일 지점을 제공함으로써 이러한 문제를 방지하는 데 도움이 될 수 있습니다.

import { prismaClient } from "@/db"

const users = await prismaClient.user.findMany() // query on the users table

두 번째 실제 시나리오

우리가 겪게 될 또 다른 실제 시나리오는 인메모리 속도 제한 서비스입니다.

사용자나 해커는 특정 엔드포인트에 수많은 요청을 보내 스팸을 보낼 수 있습니다. 이로 인해 취약점이 발생하거나 예상치 못한 비용이 발생하거나 서버 장애가 발생할 수 있습니다.

이를 방지하기 위해 기본적인 인메모리 비율 제한 서비스를 구현할 수 있습니다.

서비스는 특정 시간 간격(예: 60초) 동안 IP 주소당 요청 수를 제한해야 합니다.

export const prismaClient = new PrismaClient() // a new instance is created every time it gets imported then used.

RateLimiterService 클래스는 주어진 타이밍 창에서 IP 주소(맵 키)로 식별되는 특정 사용자가 수행한 요청 수(requests[ip].count)를 추적하는 맵을 저장합니다. (요청[ip].lastRequestTime).

우리의 RateLimiterService는 전역적으로 사용되도록 되어 있습니다. 즉, RateLimiterService를 가져올 때마다 요청 맵, 제한 및 창 변수로 구성된 내부 상태 값을 재설정하고 싶지 않습니다.

결론

싱글턴 디자인 패턴은 애플리케이션에서 공유 리소스를 효과적으로 관리하기 위한 강력한 도구입니다

주요 시사점:

  1. 싱글턴은 클래스에 인스턴스가 하나만 있도록 보장하고 이에 대한 전역 액세스 지점을 제공합니다.
  2. 데이터베이스 연결, 구성 설정, 캐시와 같은 공유 리소스를 관리하는 데 유용합니다.
  3. 실제 적용에는 Prisma와 같은 ORM과의 데이터베이스 연결 최적화 및 속도 제한 서비스 구현이 포함됩니다.

연락하다

질문이 있으시거나 추가 논의를 원하시면 여기로 연락주세요.

즐거운 코딩하세요!

위 내용은 싱글톤 디자인 패턴: 애플리케이션에서 전역 상태 관리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.