CS

싱글톤(Singleton) 패턴 개념 및 Node.js DB(MySQL, MongoDB) 연결 모듈 구현

cob 2022. 12. 26. 09:45
싱글톤 패턴

 

 

 

싱글톤 패턴이란?
싱글톤 패턴은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다. 하나의 클래스를 기반으로 여러 개의 개별적인 인스턴스를 만들 수 있지만, 그렇게 하지 않고 하나의 클래스를 기반으로 단 하나의 인스턴스를 만들어 이를 기반으로 로직을 만드는데 쓰이며, 보통 데이터베이스 연결 모듈에 많이 사용한다.

 

 

싱글톤 패턴

 

 


1. 장단점

  • 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈이 공유하며 사용하기 때문에 인스턴스 생성할 때 드는 비용이 줄어든다. 하지만 의존성이 높아진다는 단점이 있다
  • TDD(Test Driven Development)를 할 때 걸림돌이 된다. TDD를 할 때 단위 테스트를 주로 하는데, 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야 한다. 하지만, 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 ‘독립적인’ 인스턴스를 만들기가 어렵다.
  • 싱글톤 패턴은 사용하기가 쉽고, 실용적이지만 모듈 간의 결합을 강하게 만들 수 있다는 단점있다. 이때 의존성 주입(DI)을 통해 모듈간의 결합을 느슨하게 만들어 해결할 수 있다.
의존성 주입 이란?

2022.12.27 - [CS] - 의존성 주입(DI) 개념 및 Java, JavaScript 사용 방법

 

 

 


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);
		});
	});
};

 

 

반응형