프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 '규약'형태로 만들어 놓은 것
// Singleton.js
let instance;
export default class Singleton {
constructor(data = "Initial data") {
if (instance) {
return instance;
}
this.data = data;
instance = this;
}
getData() {
return this.data;
}
setData(data) {
this.data = data;
}
}
const URL = "mongodb://localhost:27017/app";
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); // true
하나의 인스턴스 기반으로 a, b를 생성함으로 데이터베이스 연결에 관한 인스턴스 생성 비용을 아낄 수 있다.
TDD(Test Driven Development)를 할 때 단위 테스트를 주로 하는데 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야하는데 싱글톤 패턴은 독립적인 인스턴스를 만들기 어렵다.
모듈 간의 결합을 강하게 만든다. 의존성 주입(DI, Dependency Injection)을 통해 모듈간의 결합을 조금 더 느슨하게 만들어 해결할 수 있다. * 의존성 주입을 종속성이라고도 한다.
모듈들을 쉽게 교체할 수 있는 구조가 되어 테스팅과 마이그레이션이 수월해진다. 구현 시 추상화 레이어를 넣고 이를 기반으로 구현체를 넣어 주기 때문에 애플리케이션 의존성 방향이 일관되고, 애플리케이션을 쉽게 추론할 수있다.
오듈들이 더욱더 분리되므로 클래스 수가 늘어나 복잡성이 증가될 수 있고 약간의 런타임 페널티가 발생.
프로그래밍에서 추상화란 복잡하고 불필요한 세부 사항을 숨겨 코드를 더 간단하고 읽기 쉽고 유지 관리하기 쉽게 만드는 프로세스.
좋은 객체를 만드는 법, 설계를 잘하는 법을 추상화라고 생각하기
참고 서적
면접을 위한 CS 전공 지식 노트