애플리케이션의 여러 부분(예: 데이터베이스 연결, WebSocket 클라이언트 또는 구성 관리자)에서 공유해야 하는 개체를 처리해야 하는 경우를 경험해 보셨나요?
애플리케이션 또는 프로세스 라이프사이클 전반에 걸쳐 일관성을 유지하고 액세스할 수 있도록 이러한 객체를 어떻게 관리합니까? 여기서 싱글턴 디자인 패턴이 활용됩니다.
개요
싱글턴은 창의적 디자인 패턴으로, 새 기능을 사용하여 객체를 생성하는 기본 방식에서 발생하는 다양한 문제를 다루는 디자인 패턴 카테고리입니다. 키워드 또는 연산자.
싱글턴 디자인 패턴은 두 가지 주요 문제를 해결하는 데 중점을 둡니다.
- 인스턴스에 전역 액세스 지점을 어떻게 제공할 수 있나요?
- 클래스 또는 특정 유형의 객체에 인스턴스가 하나만 있도록 어떻게 보장할 수 있나요?
데이터베이스 연결, WebSocket 클라이언트, 캐싱 서비스 또는 전체 애플리케이션 수명 주기 동안 메모리에서 유지하고 변경해야 하는 모든 것과 같은 특정 종류 또는 유형의 전역 상태를 관리하는 방식을 단순화하고 표준화할 수 있습니다.
싱글턴 디자인 패턴을 어떻게 구현할 수 있나요?
위 스키마는 다음 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 메소드는 코드베이스의 다른 위치에서 클래스를 여러 번 인스턴스화하더라도 항상 동일한 인스턴스를 얻도록 보장합니다.
따라서 두 변수(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를 가져올 때마다 요청 맵, 제한 및 창 변수로 구성된 내부 상태 값을 재설정하고 싶지 않습니다.
결론
싱글턴 디자인 패턴은 애플리케이션에서 공유 리소스를 효과적으로 관리하기 위한 강력한 도구입니다
주요 시사점:
- 싱글턴은 클래스에 인스턴스가 하나만 있도록 보장하고 이에 대한 전역 액세스 지점을 제공합니다.
- 데이터베이스 연결, 구성 설정, 캐시와 같은 공유 리소스를 관리하는 데 유용합니다.
- 실제 적용에는 Prisma와 같은 ORM과의 데이터베이스 연결 최적화 및 속도 제한 서비스 구현이 포함됩니다.
연락하다
질문이 있으시거나 추가 논의를 원하시면 여기로 연락주세요.
즐거운 코딩하세요!
위 내용은 싱글톤 디자인 패턴: 애플리케이션에서 전역 상태 관리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Python 또는 JavaScript는 경력 개발, 학습 곡선 및 생태계를 기반으로해야합니다. 1) 경력 개발 : Python은 데이터 과학 및 백엔드 개발에 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 적합합니다. 2) 학습 곡선 : Python 구문은 간결하며 초보자에게 적합합니다. JavaScript Syntax는 유연합니다. 3) 생태계 : Python에는 풍부한 과학 컴퓨팅 라이브러리가 있으며 JavaScript는 강력한 프론트 엔드 프레임 워크를 가지고 있습니다.

JavaScript 프레임 워크의 힘은 개발 단순화, 사용자 경험 및 응용 프로그램 성능을 향상시키는 데 있습니다. 프레임 워크를 선택할 때 : 1. 프로젝트 규모와 복잡성, 2. 팀 경험, 3. 생태계 및 커뮤니티 지원.

서론 나는 당신이 이상하다는 것을 알고 있습니다. JavaScript, C 및 Browser는 정확히 무엇을해야합니까? 그들은 관련이없는 것처럼 보이지만 실제로는 현대 웹 개발에서 매우 중요한 역할을합니다. 오늘 우리는이 세 가지 사이의 밀접한 관계에 대해 논의 할 것입니다. 이 기사를 통해 브라우저에서 JavaScript가 어떻게 실행되는지, 브라우저 엔진의 C 역할 및 웹 페이지의 렌더링 및 상호 작용을 유도하기 위해 함께 작동하는 방법을 알게됩니다. 우리는 모두 JavaScript와 브라우저의 관계를 알고 있습니다. JavaScript는 프론트 엔드 개발의 핵심 언어입니다. 브라우저에서 직접 실행되므로 웹 페이지를 생생하고 흥미롭게 만듭니다. 왜 Javascr

Node.js는 크림 덕분에 효율적인 I/O에서 탁월합니다. 스트림은 메모리 오버로드를 피하고 큰 파일, 네트워크 작업 및 실시간 애플리케이션을위한 메모리 과부하를 피하기 위해 데이터를 점차적으로 처리합니다. 스트림을 TypeScript의 유형 안전과 결합하면 Powe가 생성됩니다

파이썬과 자바 스크립트 간의 성능과 효율성의 차이는 주로 다음과 같이 반영됩니다. 1) 해석 된 언어로서, 파이썬은 느리게 실행되지만 개발 효율이 높고 빠른 프로토 타입 개발에 적합합니다. 2) JavaScript는 브라우저의 단일 스레드로 제한되지만 멀티 스레딩 및 비동기 I/O는 Node.js의 성능을 향상시키는 데 사용될 수 있으며 실제 프로젝트에서는 이점이 있습니다.

JavaScript는 1995 년에 시작하여 Brandon Ike에 의해 만들어졌으며 언어를 C로 실현했습니다. 1.C Language는 JavaScript의 고성능 및 시스템 수준 프로그래밍 기능을 제공합니다. 2. JavaScript의 메모리 관리 및 성능 최적화는 C 언어에 의존합니다. 3. C 언어의 크로스 플랫폼 기능은 자바 스크립트가 다른 운영 체제에서 효율적으로 실행하는 데 도움이됩니다.

JavaScript는 브라우저 및 Node.js 환경에서 실행되며 JavaScript 엔진을 사용하여 코드를 구문 분석하고 실행합니다. 1) 구문 분석 단계에서 초록 구문 트리 (AST)를 생성합니다. 2) 컴파일 단계에서 AST를 바이트 코드 또는 기계 코드로 변환합니다. 3) 실행 단계에서 컴파일 된 코드를 실행하십시오.

Python 및 JavaScript의 미래 추세에는 다음이 포함됩니다. 1. Python은 과학 컴퓨팅 분야에서의 위치를 통합하고 AI, 2. JavaScript는 웹 기술의 개발을 촉진하고, 3. 교차 플랫폼 개발이 핫한 주제가되고 4. 성능 최적화가 중점을 둘 것입니다. 둘 다 해당 분야에서 응용 프로그램 시나리오를 계속 확장하고 성능이 더 많은 혁신을 일으킬 것입니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

드림위버 CS6
시각적 웹 개발 도구
