주니어 개발자 1호

싱글톤 패턴 본문

개발관련 Tip

싱글톤 패턴

No_1 2023. 9. 17. 19:10

싱글톤 패턴

정의 및 설명

  • 싱글톤 패턴은 하나의 클래스에 하나의 인스턴스만 가지는 패턴입니다.
    • 보통 데이터베이스 연결에 사용합니다.
    • 혹은 제 경험으로는 Connection이 필요한 외부 Library에서 사용합니다.
      • Chat.. 등

장점

  • 인스턴스를 생성할 때 비용이 줄어듭니다.
  • 보통 외부 리소스의 Connection을 단일 관리로 지정이 되기에 max Connection Pool 을방지할 수 있습니다.
    • 불필요한 Connection 연결 비용을 방지할 수 있습니다.

단점

  • 의존성이 높아져 테스트하기가 힘들 수 있습니다.
    • 개인적인 생각으로는 데이터베이스등 연결에 필요한 필요한 부분을 ( Configure )을 주입하는 방식을 달리하면, 테스트할 수 있기에 큰 단점이라고 생각하지 않습니다.
    • 진정한 단점은 Connection이 많이 필요할 때 부하가 걸릴 수 있다는 지점일 것으로 추측이 되나, 현재의 아키텍쳐들은 이 또한 Process 등을 늘려 해결할 수 있는 방안이라고 생각합니다.

구현 예제

import * as dotenv from 'dotenv';

interface Config {
    db_url: string;
    db_user: string;
    db_password: string;
    db_port: number;
    db_name: 'mysql' | 'mongo' | 'oracle';
}

export class DBConfig {
    private config: Config;

    constructor(env?: 'dev' | 'prod' | 'test' | 'staging') {
        if (env) {
            this.setConfig(env);
        }
    }

    setConfig(env: 'dev' | 'prod' | 'test' | 'staging') {
        const envFileName = env + '.env';
        dotenv.config({ path: envFileName });

        this.config = {
            db_url: process.env.DB_URL!,
            db_user: process.env.DB_USER!,
            db_password: process.env.DB_PASSWORD!,
            db_port: Number(process.env.DB_PORT),
            db_name: process.env.DB_NAME as 'mysql' | 'mongo' | 'oracle',
        };

        // TODO: Validate 
    }

    getConfig(): Config {
        return this.config;
    }
}

class DBConnection {
    private static instance: DBConnection | null = null;
    private config: Config;

    private constructor(config: Config) {
        this.config = config;
    }

    static getInstance(config: Config): DBConnection {
        if (!DBConnection.instance) {
            DBConnection.instance = new DBConnection(config);
        }
        return DBConnection.instance;
    }
}
const env = process.env.NODE_ENV
const dbConfig = new DBConfig(env);
const config = dbConfig.getConfig();

const dbConnection = DBConnection.getInstance(config);
  • 궁금한 지점 Java에서 synchonized의 역할?

싱글톤에서의 생각해볼 만한 포인트

  • 싱글톤 패턴의 단점에 대한 생각
  • 의존성 주입에 대한 생각
    • 주입의 장점, 단점에 대한 생각
    • DI 원칙: 상위 모듈은 하위 모듈에서 어떤것도 가져오지 않아야 한다.

'개발관련 Tip' 카테고리의 다른 글

MVP Pattern  (0) 2023.09.17
팩토리 패턴에 대해 쉽게 설명해보기  (0) 2023.09.17
INDEX 테스트 해보기  (2) 2023.07.16
두개의 SSH KEY 사용하기 [ SSH-KEY 분리 ] - for Window  (0) 2022.07.19
웹 개발 체크리스트  (0) 2022.06.30