싱글톤 패턴(singleton pattern)이란?
- 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴.
ㄴ 하나의 인스턴스를 만들어 놓고, 해당 인스턴스를 다른 여러 모듈들이 공유하며 사용.
인스턴스 :
객체지향 프로그래밍에서 어떤 클래스에 속하는 각 객체를 의미.
-> 붕어빵 틀 = Class / 각각의 붕어빵 = Instance / 붕어빵 = Object
싱글톤 : 붕어빵 틀로 붕어빵을 하나 만들어서, 여럿이서 그 붕어빵을 보고 따라그리는데 사용.
- 주로 데이터베이스 연결 모듈에 많이 사용.
- 장점 : 인스턴스를 생성 할 때 드는 비용이 줄어듬.
(하나의 인스턴스를 만들어 다른 모듈들이 그 인스턴스 사용)
- 단점 : 의존성이 높아짐.
1. 자바스크립트의 싱글톤 패턴
- 리터럴 {} 또는 new object로 객체를 생성하는 것.(다른 어떤 객체와도 같지 않기 때문)
const obj = {
a : 27
}
const obj2 = {
a : 27
}
console.log(obj===obj2);
//Singleton 클래스의 구현(자바스크립트)
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)
2. 싱글톤 패턴으로 만드는 데이터베이스 연결 모듈
//자바스크립트 싱글톤 패턴으로 만드는 데이터베이스 연결모듈
const URL = 'mongodb://localhost:27017//kundolapp'
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)
3. 자바에서의 싱글톤 패턴
//자바에서의 싱글톤
class Singleton {
private static class singleInstanceHolder {
private static final Singleton INSTASCE = new Singleton();
}
public static synchronized Singleton getInstance() {
return singleInstanceHolder.INSTASCE;
}
}
public class HelloWorld{
public static void main(String []args){
Singleton a = Singleton.getInstance();
Singleton b = Singleton.getInstance();
System.out.println(a.hashCode());
System.out.println(b.hashCode());
if(a==b){
System.out.println(true);
}
}
}
3. mongoose(Node.js에서 MongoDB연결시 사용)모듈의 싱글톤 패턴
//mongoose모듈에서 싱글톤 인스턴스를 반환하는 connect()함수
Mongoose.prototype.connect = function(uri, options, callback) {
const _mongoose = this instanceof Mongoose ? this : mongoose;
const conn = _mongoose.connection;
return _mongoose._ptomiseCallback(callback, cb => {
conn.openUri(uri, options, err => {
if (err != null) {
return cb(err);
}
return cb(null, _mongoose);
})
})
}
4. MySQL의 싱글톤 패턴(Node.js에서 MySQL DB 연결시 사용)
//MySQL의 싱글톤 패턴
//메인모듈 : 데이터베이스 연결에 관한 인스턴스 정의
const mysql = require('mysql');
const pool = mysql.CreatePool({
connectionLimit:10,
host: 'example.org',
user: 'kundol',
password: 'secret',
database : '승철이디비'
})
pool.connect();
//모듈 A : 메인모듈 인스턴스를 기반으로 쿼리를 보냄
pool.query(query, function (error, results, fields) {
if (error) throw error;
console.log('The solution is : ', result[0].solution);
})
//모듈 B : 메인모듈 인스턴스를 기반으로 쿼리를 보냄
pool.query(query, function (error, results, fields) {
if (error) throw error;
console.log('The solution is : ', result[0].solution);
})
5. 싱글톤 패턴의 단점
1) 모듈간의 결합을 강하게 만들 수 있음.
ㄴ의존성 주입(DI, Dependency Injection)을 통해 해결 가능.
ㄴ 메인모듈과 하위모듈 사이에 의존성 주입자를 두어 메인모듈이 '간접적'으로 의존성을 주입.
= 메인모듈은 하위 모듈에 대한 의존성이 떨어짐(디커플링 됨)
의존성 :
존속성이라고도 함. A가 B에 존속성이 있음 = B의 변경사항에 대해 A또한 변해야 함.
의존성 주입의 장점 :
모듈들을 쉽게 교체 할 수 있는 구조가 되어, 테스팅하기 쉽고 마이그레이션 하기 수월.
애플리케이션 의존성 방향이 일관되고, 쉽게 추론 할 수 있으며, 모듈간의 관계가 명확해짐.
이는 구현시 추상화 레이어를 넣고 이를 기반으로 구현체를 넣어주기 때문.
의존성 주입의 단점 :
복잡성이 증가 될 수 있으며, 런타임 패널티가 생길 수 있음.(모듈들이 더 분리됨으로 클래스가 더 늘어나기 때문)
의존성 주입의 원칙 :
상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 함.
둘 다 추상화에 의존해야 하며, 추상화는 세부 사항에 의존하지 말아야 함.
마이그레이션 :
운영환경에서 다른 운영환경으로 옮기는 것.
(앱 혹은 운영체제 업그레이드, 데이터에서 DB 변경, 온프레이스 인프라에서 클라우드 인프라로 바꾸는 것, 모놀리식 앱에서 컨테이너화된 서비스로 바꾸는 것 등)
'CS > CS' 카테고리의 다른 글
[CS] 옵저버 패턴 (observer pattern) (0) | 2022.09.20 |
---|---|
[CS] 노출모듈 패턴, MVC 패턴, MVP 패턴, MVVM 패턴 (0) | 2022.09.20 |
[CS] 전략 패턴(strategy pattern, 정책 패턴(policy pattern) (0) | 2022.09.20 |
[CS] 프록시 패턴(proxy pattern) (1) | 2022.09.20 |
[CS] 이터레이터 패턴(iterator pattern) (0) | 2022.09.20 |
야나의 코딩 일기장 :) #코딩블로그 #기술블로그 #코딩 #조금씩,꾸준히
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!