이 글은 면접을 위한 CS 전공지식노트의 책을 읽고 학습 후 스터디 공유를 위한 글입니다.
디자인 패턴은 프로그램을 설계할 때 발생했던 문제점들을 객체 간 상호 관계 등을 이용해 해결할 수 있는 하나의 “규약” 형태로 만들어 놓은 것.
즉, 프로그램 설계시 발생한 문제를 해결하기 위한 객체의 관계, 구조적 규약
싱글톤 패턴은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴(새로 인스턴스를 생성하더라도 같은 인스턴스를 가리킵니다.)
class Singleton {
constructor(){
**if(!Singleton.instance) Singleton.instance = this;
return Singleton.instance;**
}
getInstance(){
return this.instance;
}
}
두 인스턴스가 같은 인스턴스를 가리키는 것을 알 수 있다.
데이터 베이스 연결 모듈
실제 싱글톤 패턴은 Node.js에서 MongoDB 데이터베이스를 연결할 때 스는 mongoose 모듈에서 확인 가능.
mongoose의 데이터베이스를 연결할 때 쓰는 connect()라는 함수는 싱글톤 인스턴스를 반환한다.
// Mongoose의 프로토타입을 확장하여 connect 메서드를 수정합니다.
Mongoose.prototype.connect = function (uri, options, callback) {
// 'this'가 Mongoose의 인스턴스를 가리키는지 확인하고, 아닐 경우 Mongoose 생성자를 사용합니다.
**const _mongoose = this instanceof Mongoose ? this : Mongoose;**
// Mongoose에서 커넥션 객체를 가져옵니다.
const conn = _mongoose.connection;
// 제공된 콜백 함수에 따라 프로미스 또는 콜백을 반환합니다.
return _mongoose._promiseOrCallback(callback, cb => {
// 지정된 URI와 옵션으로 연결을 시도합니다.
conn.openUri(uri, options, err => {
// 연결 과정에서 오류가 발생하면 해당 오류를 콜백에 전달합니다.
if (err != null) {
return cb(err);
}
// 연결이 성공하면 오류를 'null'로 설정하고 Mongoose 객체를 반환합니다.
return cb(null, _mongoose);
})
})
}
현재 인스턴스가 Mongoose
의 인스턴스인지 확인하고, 그렇지 않은 경우 Mongoose
생성자를 사용하여 _mongoose
변수에 할당합니다. 이를 통해 코드는 항상 동일한 Mongoose
인스턴스를 사용하도록 보장한다.
**테스트가 서로 독립적이어야 한다**
. 그리고 **테스트를 어떤 순서로든 실행할 수 있어야한다**
.독립적인 인스턴스를 만들기 어렵다
. 즉, 모의(mock) 객체를 생성하는 데 어려움을 줄 수 있다.