Book
cs-for-interview
ch01_design_pattern
Part01 Singleton Pattern

싱글톤 패턴

정리

싱글톤과 의존성 주입

  • 싱글톤은 모듈 간 결합을 강하게 만든다는 단점이 존재
  • '의존성 주입'을 통해 이를 느슨하게 만들 수 있음
  • 메인 모듈이 직접 하위 모듈에게 의존성을 주기보다 중간에 '의존성 주입자'가 가로채 메인 모듈이 '간접'적으로 의존성을 주입 ( → 의존성이 떨어짐, 이를 디커플링이 된다라고도 함)
  • 장점
    • 모듈들을 쉽게 교체할 수 있는 구조 → 테스팅이 쉬움, 마이그레이션 수월
    • 의존성 방향이 일관됨
    • 모듈 간의 관계들이 조금 더 명확해짐
  • 단점 : 모듈이 더 분리됨 → 복잡성이 증가될 수 있음
  • 의존성 주입 원칙
    • 상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 한다
    • 둘 다 추상화에 의존해야 하며, 이때 추상화는 세부사항에 의존하지 말아야 한다

고민하고 기억하기

p. 16

Q. React는 라이브러리일까, 프레임워크일까? 그리고 그 이유는 뭘까?

  • 둘의 차이는 '엄격한 규칙'이라고 생각함
  • 프레임워크인 Vue의 경우에는 템플릿이 제공되어 이를 따라야 함. React의 경우, 비교적 자유도가 높음
  • React는 프레임워크라기엔 기능들이 많지 않아 필요한 기능들을 추가로 설치해야 함
  • 이러한 점을 토대로, React는 라이브러리

Q. 디자인 패턴은 왜 등장한걸까?

  • 코드를 체계화하기 위한 공통적인 패턴을 제공해 코드를 쉽게 이해하도록 도움
  • 다른 개발자와의 의사소통을 원활하게 해줌

p. 17

Q. 싱글톤이 하나의 클래스에 오직 하나의 인스턴스만 가지게 하는 이유가 뭘까?

  • 인스턴스란, 생성자 함수를 통해 생성된 객체
  • 장점 : 인스턴스를 생성할 때 드는 비용 감소
  • 단점 : 의존성이 높아짐 ( → 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문 )
  • 즉, 인스턴스 생성 비용을 감소시키기 위해 하나의 인스턴스만 가지게 설정하는 것..!

자바스크립트 + 리액트 디자인 패턴

Q. 정적 클래스와 싱글톤의 유사점과 차이점은?

  • 유사점 : 단 하나만 존재하며, 어디서든 접근 가능
  • 차이점 :
    • 초기화 시점 (중요!)
      • 정적 클래스 : 프로그램 실행 시점에 자동으로 초기화
      • 싱글톤 인스턴스 : 필요한 시점에 생성 (지연 초기화) → 리소스 & 메모리를 효율적으로
    • 확장성
      • 정적 클래스 : 상속, 인터페이스 구현 불가능. static 키워드를 붙여야 하는 번거로움
      • 싱글톤 인스턴스 : 상속, 인터페이스 구현 가능 → 확장성

Q. 싱글톤 패턴의 '지연 초기화'란?

  • 싱글톤 인스턴스는 처음 사용되기 전까진 생성되지 않음
  • 필요한 시점에 인스턴스를 생성하고 초기화

Q. (내가 생각한) 싱글톤 패턴과 전역 상태 관리 도구의 유사점과 차이점은?

  • 유사점
    • 싱글톤 패턴 : 클래스의 인스턴스가 오직 하나만 존재하도록 제한해 인스턴스 생성 비용을 아낌
    • 전역 상태 관리 도구 : 복수의 컴포넌트에서 공유되는 특정 상태를 단 하나의 변수로 생성하고 관리
  • 차이점
    • 싱글톤 패턴 : 인스턴스에 대한 접근 허용
    • 전역 상태 관리 도구 : 변경 불가능한 읽기 전용 상태를 제공

p. 19

Q. 싱글톤 패턴이 DB 연결 모듈에 많이 쓰이는 이유는?

  • 데이터베이스 연결에 관한 인스턴스 생성 비용을 아끼려고
  • 실제로 mongoose의 DB 연결 시 쓰는 connect() 함수는 싱글톤 인스턴스를 반환함
  • MySQL에서 DB 연결 시에도 싱글톤 패턴이 쓰임

p. 22

Q. 싱글톤 패턴이 TDD의 걸림돌이 되는 이유는?

  • TDD는 주로 단위 테스트를 함
  • 단위 테스트는 서로 독립적이어야 하며, 테스트를 어떤 순서로든 실행할 수 있어야 함
  • 싱글톤 패턴은 '독립적인' 인스턴스를 만들기 어려움 ( → 미리 생성된 하나의 인스턴스를 기반으로 구현하기 때문 )