싱글톤 패턴(Singleton Pattern)
하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴.
데이터베이스 연결 모듈에 많이 사용.
ex) MongoDB 데이터베이스를 연결할 때 쓰는 mongoose 모듈
→ mongoose의 connect() 함수는 싱글톤 인스턴스를 반환한다.
MySQL 데이터베이스 연결
- 장점: 인스턴스 생성 비용 줄어듦.
→ 하나의 인스턴스를 만들어 놓고 다른 모듈들이 해당 인스턴스를 공유하며 사용한다.
- 단점: 의존성이 높아짐.
ex) 테스트가 서로 독립적이어야 하는 단위 테스트에 걸림돌이 됨.
모듈간의 결합을 강하게 만듦.
→ 의존성 주입으로 해결 가능.
의존성 주입(DI, Dependency Injection) = 디커플링(모듈 간 결합도를 낮춤)
하나의 객체가 다른 객체의 의존성을 제공.
상위 모듈이 하위 모듈에게 직접적으로 의존성을 주입하는 것이 아닌, 중간에 의존성 주입자(dependency injector)를 두어 상위 모듈이 하위 모듈에게 간접적으로 의존성을 주입하게 함.
- 장점: 모듈을 쉽게 교체할 수 있어 test 하기 쉽다. 모듈 간 관계가 명확해진다.
- 단점: 모듈이 분리되므로 클래스 수가 늘어나 복잡성이 증가될 수 있다.
의존성 주입 원칙
: 상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 한다.
상위 모듈과 하위 모듈은 추상화에 의존해야 한다.
추상화는 세부 사항에 의존하지 말아야 한다.
자바스크립트의 싱글톤 패턴
① 리터럴 {} 또는 new Object를 사용한 객체 생성 자체만으로 싱글톤 패턴 구현 가능.
const obj1 = {
year : 2022
};
const obj2 = {
year : 2022
};
console.log(obj1 === obj2); //false
→ obj1과 obj2는 다른 인스턴스를 가진다.
② 하나의 인스턴스를 가지는 클래스를 구현하여 싱글톤 패턴 구현 가능.
class Singleton {
constructor() {
if (!Singleton.instance) {
Singleton.instance = this;
}
return Singleton.instance;
}
getInstance() {
return this.instance;
}
}
const obj1 = new Singleton();
const obj2 = new Singleton();
console.log(obj1 === obj2); //true
→ a와 b는 Singleton.instance라는 하나의 인스턴스를 가진다.