본문 바로가기
JavaScript

[JavaScript]싱글톤 패턴 구현

by teamnova 2023. 10. 16.

안녕하세요 이번시간에는 디자인 패턴 중 하나인 싱글톤 패턴을 자바스크립트에서 구현해보겠습니다.

1. 싱글턴 패턴이란?

싱글턴 패턴은 소프트웨어 디자인 패턴 중 하나로, 클래스의 인스턴스가 하나만 생성되도록 보장하고, 그 인스턴스에 쉽게 접근할 수 있도록 하는 패턴입니다.

2. 자바스크립트에서의 싱글톤 패턴 구현

구현은 DB커넥터를 싱글톤 패턴을 사용하는

2.1 CommonJS

// dbConnector.js

const mysql = require('mysql');  // MySQL 라이브러리를 가져옵니다.
require("dotenv").config();  // 환경 변수를 로드합니다.
let instance = null;  // 싱글턴 인스턴스를 저장할 변수

class DbConnector {
    constructor() {
        if (!instance) {  // 인스턴스가 존재하지 않는 경우
            // MySQL 연결 설정
            this.connection = mysql.createConnection({
                host: process.env.DB_HOST,
                user: process.env.DB_USER,
                password: process.env.DB_PASSWORD,
                database: process.env.DB_DATABASE
            });
            // MySQL에 연결합니다.
            this.connection.connect(err => {
                if (err) {
                    console.error('Database connection error:', err);
                    return;
                }
                console.log('Database connected!');
            });
            instance = this;  // 현재 인스턴스를 저장합니다.
        }
        return instance;  // 인스턴스를 반환합니다.
    }

    // SQL 쿼리를 실행하는 메서드
    query(sql, args) {
        return new Promise((resolve, reject) => {
            this.connection.query(sql, args, (err, rows) => {
                if (err) {
                    return reject(err);  // 에러 발생시 reject
                }
                resolve(rows);  // 결과 반환
            });
        });
    }
}

module.exports = DbConnector;  // DbConnector 클래스를 내보냅니다.

2.2 ES6

// dbConnector.js

import mysql from 'mysql';  // MySQL 라이브러리를 가져옵니다.
import { config } from 'dotenv';  // dotenv 라이브러리에서 config 함수를 가져옵니다.

config();  // 환경 변수를 로드합니다.
let instance = null;  // 싱글턴 인스턴스를 저장할 변수

class DbConnector {
    constructor() {
        if (!instance) {  // 인스턴스가 존재하지 않는 경우
            // MySQL 연결 설정
            this.connection = mysql.createConnection({
                host: process.env.DB_HOST,
                user: process.env.DB_USER,
                password: process.env.DB_PASSWORD,
                database: process.env.DB_DATABASE
            });
            // MySQL에 연결합니다.
            this.connection.connect(err => {
                if (err) {
                    console.error('Database connection error:', err);
                    return;
                }
                console.log('Database connected!');
            });
            instance = this;  // 현재 인스턴스를 저장합니다.
        }
        return instance;  // 인스턴스를 반환합니다.
    }

    // SQL 쿼리를 실행하는 메서드
    query(sql, args) {
        return new Promise((resolve, reject) => {
            this.connection.query(sql, args, (err, rows) => {
                if (err) {
                    return reject(err);  // 에러 발생시 reject
                }
                resolve(rows);  // 결과 반환
            });
        });
    }
}

export default DbConnector;  // DbConnector 클래스를 내보냅니다.

 3. 결론

const DbConnector = require('./dbConnector');

const db1 = new DbConnector();
const db2 = new DbConnector();

console.log(db1 === db2); // true
// 두 인스턴스는 동일하므로 두 객체에서 동일한 DB 연결을 사용하게 됩니다.

싱글턴 패턴을 활용하면, 특히 DB 연결과 같이 공유 리소스를 사용하는 경우 중복 연결을 피하고, 리소스 사용을 최적화할 수 있습니다. 자바스크립트에서는 CommonJS 또는 ES6 모듈 시스템을 활용하여 싱글턴 패턴을 구현할 수 있습니다.