Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- docker m2
- 개발자 전직
- index like
- mongo 4.4.18
- 인텔리제이 github 로그인
- 개발자 면접 팁
- git
- 회고록
- 신입 면접 팁
- mongo 4.4
- aws m2
- 개발자 취업 준비
- 밸런스 게임
- mysql like
- 쿠버네티스
- github accesstoken
- nestjs
- ECS
- VUE
- 개발자 회고록
- OSI 7계층
- index in
- 팩토리 패턴 언제
- 라즈베리바이4 mongo
- 신입 개발자 면접
- kubernetes
- 퇴사
- 팩토리 패턴 예제
- token 탈취
- mysql index 속도차이
Archives
- Today
- Total
주니어 개발자 1호
싱글톤 패턴 본문
싱글톤 패턴
정의 및 설명
- 싱글톤 패턴은 하나의 클래스에 하나의 인스턴스만 가지는 패턴입니다.
- 보통 데이터베이스 연결에 사용합니다.
- 혹은 제 경험으로는 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 |