싱글톤(Singleton)
"인스턴스가 하나만 존재하도록 접근을 중앙 집중화"
객체지향에서 가장 많이 사용
Node 에서 논의할 가치가 없지만 알아두면 좋음
Node개발자가 알아둬야 할 몇가지 주의사항과 제약사항 존재
- 상태 정보의 공유
- 리소스 사용의 최적화
- 리소스에 대한 접근 동기화
Ex) 데이터 베이스에 대한 접근을 제공하는 일반적인 DB 클래스
// Database.js
export class Databse {
constructor (dbName, connectionDetails) {
// ...
}
// ...
}
- 전형적인 구현은 일반적으로 연결풀 (connection pool)을 유지함
=> 각 요청에 대해 새로운 DB 인스턴스를 만들 필요 없음 - DB 인스턴스는 대기중인 트랜잭션 목록 같은 일부 상태 정보를 가짐
위의 두가지 기준을 완벽하게 충족
시작 시 하나의 DB 인스턴스를 설정하고 만들어 모든 컴포넌트가 하나의 DB 인스턴스를 공유
Node의 모듈에서 인스턴스를 익스포트 하는것만으로 싱글톤 패턴과 유사하게 동작
// dbInstance.js
import { Database } from './Database.js';
export const dbInstance = new Database('sampleDb', {
url : ...,
username : ...,
password : ...,
})
// 다른곳에서 공유된 인스턴스 불러오기
import { dbInstance } from './dbInstance.js'
새로운 인스턴스를 내보내는것으로 해당 인스턴스가 하나만 존재한다고 가정함
Node 는 모듈을 캐시하여 불러올때마다 코드를 다시 읽어들이지 않음
다만 주의할 점!
모듈은 전체경로를 키로 하여 캐시됨 => 싱글톤 보장
각 패키지는 자신의 node_modules 디렉터리 내에 자체적인 일련의 종속성을 가져 고유성 보장하지 못함
패키지마다 다른 버전의 종속성을 가지면 두개의 인스턴스를 생성해버림 (드문 일)
이 경우 중복 패키지를 최상위 node_modules 디렉터리에 설치함, 종속성 호이스팅 (dependency hoisting)
다음과 같이 명시적으로 글로벌 변수를 사용하지 않는 한, 위에 기술한 대로 싱글톤 패턴은 Node 에 존재하지 않는다는것을 쉽게 이해 할 수 있지...
global.dbInstance = new Databse ('sampleDB', {...});
이렇게 하면 인스턴스가 패키지 내에서가 아닌 전체 어플리케이션에서 공유되는 유일한 인스턴스임을 보장
다만, 대부분 필요하지 않으며 최악의 경우 이렇게 사용
'Javascript > Node.js' 카테고리의 다른 글
Proxy Pattern - 구조적 설계 패턴 (0) | 2022.02.06 |
---|---|
Wiring Pattern - 생성자 디자인 패턴 (0) | 2022.02.03 |
Domenic Revealing Constructor Pattern - 생성자 디자인 패턴 (0) | 2022.02.03 |
Builder Pattern - 생성자 디자인 패턴 (0) | 2022.02.03 |
Factory Pattern - 생성자 디자인 패턴 (0) | 2022.02.03 |
댓글