싱글톤 패턴
싱글톤 패턴이란?
싱글톤 패턴은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다. 하나의 클래스를 기반으로 여러 개의 개별적인 인스턴스를 만들 수 있지만, 그렇게 하지 않고 하나의 클래스를 기반으로 단 하나의 인스턴스를 만들어 이를 기반으로 로직을 만드는데 쓰이며, 보통 데이터베이스 연결 모듈에 많이 사용한다.
1. 장단점
- 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈이 공유하며 사용하기 때문에 인스턴스 생성할 때 드는 비용이 줄어든다. 하지만 의존성이 높아진다는 단점이 있다
- TDD(Test Driven Development)를 할 때 걸림돌이 된다. TDD를 할 때 단위 테스트를 주로 하는데, 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야 한다. 하지만, 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 ‘독립적인’ 인스턴스를 만들기가 어렵다.
- 싱글톤 패턴은 사용하기가 쉽고, 실용적이지만 모듈 간의 결합을 강하게 만들 수 있다는 단점있다. 이때 의존성 주입(DI)을 통해 모듈간의 결합을 느슨하게 만들어 해결할 수 있다.
의존성 주입 이란?
2. 싱글톤 패턴 구현
2-1) JavaScript 구현
class Singleton {
constructor() {
if (!Singleton.instance) {
Singleton.instance = this
}
return Singleton.instance
}
getInstance() {
return this.instance
}
}
const a = new Singleton();
const b = new Singleton();
console.log(a === b) // true
2-2) JavaScript DB 연결 모듈 구현
const URL = 'mongodb://localhost:.....'
const createConnection = url => ({"url" : url})
class DB {
constructor(url) {
if(!DB.instance) {
DB.instance = createConnection(url)
}
return DB.instance
}
connect() {
return this.instance
}
}
const a = new DB(URL)
const b = new DB(URL)
console.log(a === b) // true
- DB.instace라는 하나의 인스턴스 기반으로 a, b를 생성하여 인스턴스 생성 비용을 아낄 수 있다.
2-3) Node.js DB 연결 모듈 구현(MySQL)
//메인 모듈
const mysql = require('mysql');
const pool = mysql.createPool({
connectionLimit: 10,
host: 'example.org',
user: 'jacob'
password: '1234',
database: 'codb'
});
pool.connect();
// 모듈 A
pool.query(query, function (error, results, fields) {
if(error) throw error;
console.log('The solution is: ', results[0].solution);
}
- 메인 보듈에서 DB연결 인스턴스를 정의하고, 모듈 A에서 해당 인스턴스를 기반으로 쿼리를 보내는 형식으로 사용된다.
2-4) Node.js DB 연결 모듈 구현(MongoDB)
MongoDB를 연결할 때 mongoose 모듈을 사용한다.
Mongoose.prototype.connect = function(uri, options,callback) {
const _mongoose = this instacneof Mongoose ? this : mongoose;
const conn = _mongoose.connection;
return _mongoose._promiseOrCallback(callback, cb => {
conn.openUri(uri, options, err => {
if (err != null) {
return cb(err);
}
return cb(null, _mongoose);
});
});
};
반응형
'CS' 카테고리의 다른 글
프로세스 메모리(스택, 힙, 데이터 영역, 코드 영역) 구조 개념 및 특징 (0) | 2023.01.13 |
---|---|
옵저버(Observer ) 패턴 개념 및 구현 방법(Java, JavaScript) (0) | 2023.01.10 |
알고리즘 BigO(시간 복잡도, 공간 복잡도) 개념 및 예제 (0) | 2023.01.05 |
팩토리(factory) 패턴 개념 및 JavaScript에서 사용 방법 (1) | 2023.01.04 |
의존성 주입(DI) 개념 및 Java, JavaScript 사용 방법 (0) | 2022.12.27 |