Skip to content

Latest commit

 

History

History
113 lines (87 loc) · 5.05 KB

싱글톤 패턴.md

File metadata and controls

113 lines (87 loc) · 5.05 KB

싱글톤 패턴

싱글톤 패턴

: 싱글톤 패턴이란 단 하나의 유일한 객체를 만들기 위한 코드 패턴이다.

  • 보통 데이터베이스 연결 모듈에 많이 사용
  • 장점
    • 인스턴스가 오직 하나만 생성되기 때문에, 생성 비용이 줄어들어 메모리 사용량을 절약할 수 있다.
    • 전역적으로 접근 가능하기 때문에, 어디서든 쉽게 사용할 수 있다.
    • 하나의 인스턴스를 사용하기 때문에 인스턴스 간에 상태를 공유할 수 있다.
    • 여러 스레드가 동시에 인스턴스를 생성하려고 할 때, synchronized 키워드를 사용해 동시성 문제를 방지할 수 있다.
  • 단점
    • 전역 상태를 유지하기 때문에 다른 객체 간의 의존성이 높아지고 코드 유지보수가 어려워질 수 있다.
    • 싱글톤 패턴은 테스트를 할 때 의존성 주입을 하지 않기 때문에 테스트 코드 작성이 어렵다.
    • 싱글톤 객체는 전역 상태를 유지하기 때문에 단위 테스트하기가 어렵다.

자바스크립트에서는 리터럴{} 또는 new Object로 객체를 생성하게 되면 다른 어떤 객체와도 같지 않기 때문에 이 자체만으로 싱글톤 패턴을 구현할 수 있다.

**const obj = {
  a: 27
}
const obj2 = {
  a: 27
}
console.log(obj === obj2)
// false**
class Singleton {
  constructor() {
    if (!Singleton.instance) {
      Singleton.instance = this;
    }
    return Singleton.instance;
  }
  getInstance() {
    return this;
  }
}
const a = new Singleton();
const b = new Singleton();
console.log(a === b); // true
  • Singleton.instance라는 하나의 인스턴스를 가지는 Singleton 클래스를 구현함
  • a와 b는 하나의 인스턴스를 가짐

데이터베이스 연결 모듈

싱글톤 패턴은 데이터베이스 연결 모듈에 많이 쓰인다.

// DB 연결을 하는 것이기 때문에 비용이 더 높은 작업
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); // true
  • DB.instance라는 하나의 인스턴스를 기반으로 a, b를 생성함.
  • 이를 통해 데이터베이스 연결에 관한 인스턴스 생성 비용을 아낄 수 있다.

싱글톤 패턴의 단점

  • 싱글톤 패턴은 TDD(Test Driven Development)를 할 때 걸림돌이 된다. TDD를 할 때 단위 테스트를 주로 하는데, 단위 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야 한다.
  • 하지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 ‘독립적인’ 인스턴스를 만들기가 어렵다는 단점이 있다.

의존성 주입

  • 싱글톤 패턴은 사용하기가 쉽고 굉장히 실용적이지만 모듈 간의 결합을 강하게 만들 수 있다는 단점이 있다.
    • 이때 의존성 주입(DI Denpendency Injection)을 통해 모듈간의 결합을 조금 더 느슨하게 만들어 해결할 수 있다.
    • 의존성이란 종속성이라고도 하며 A가 B에 의존성이 있다는 것은 B의 변경 사항에 대해 A 또한 변해야 된다는 것을 의미함

image

  • 메인 모듈이 ‘직접’ 다른 하위 모듈에 대한 의존성을 주기보다는 중간에 의존성 주입자가 이 부분을 가로채 메인 모듈이 ‘간접적’으로 의존성을 주입하는 방식이다.
  • 이를 통해 메인 모듈(상위모듈)은 하위 모듈에 대한 의존성이 떨어지게 된다. (이를 ‘디커플링이 된다’라고 함)

의존성 주입의 장점

  • 모듈들을 쉽게 교체할 수 있는 구조가 되어 테스팅하기 쉽고 마이그레이션하기도 수월함
  • 또한, 구현할 때 추상화 레이어를 넣고 이를 기반으로 구현체를 넣어 주기 때문에 애플리케이션 의존성 방향일 일관되고, 애플리케이션을 쉽게 추론하고, 모듈간의 관계들이 조금 더 명확해 진다.

의존성 주입의 단점

  • 모듈들이 더욱 분리되므로 클래스 수가 늘어나기 때문에 복잡성이 증가될 수 있다.

의존성 주입의 원칙

  • 상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 한다.
  • 상위 모듈, 하위 모듈 모두 추상화에 의존해야 하며, 추상화는 세부 사항에 의존하면 안된다.

참고