Book
cs-for-interview
ch01_design_pattern
Part02 Factory Pattern

팩토리 패턴

정리

팩토리 패턴이란?

  • 객체를 사용하는 코드에서 객체 생성 부분을 따로 떼어내 추상화한 패턴
  • 상속관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴
class CoffeeFactory {
    static createCoffee(type) {
        const factory = factoryList[type]
        return factory.createCoffee()
    }
}   
class Latte {
    constructor() {
        this.name = "latte"
    }
}
class Espresso {
    constructor() {
        this.name = "Espresso"
    }
} 
 
class LatteFactory extends CoffeeFactory{
    static createCoffee() {
        return new Latte()
    }
}
class EspressoFactory extends CoffeeFactory{
    static createCoffee() {
        return new Espresso()
    }
}
const factoryList = { LatteFactory, EspressoFactory } 
 
 
const main = () => {
    // 라떼 커피를 주문한다.  
    const coffee = CoffeeFactory.createCoffee("LatteFactory")  
    // 커피 이름을 부른다.  
    console.log(coffee.name) // latte
}
main()

팩토리 패턴의 장점

  • 느슨한 결합을 가진다
    • 상위 클래스와 하위 클래스가 분리되기 때문
  • 유연성이 좋다
    • 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문
  • 유지보수성이 증가한다
    • 객체 생성 로직이 따로 떼어져 있어 코드를 리팩터링하더라도 한 곳만 고칠 수 있기 때문

고민하고 기억하기

p. 24

Q. 팩토리 패턴이 등장하게 된 이유가 뭘까?

  • 객체 생성 로직의 복잡성과 유연성을 관리하고, 코드의 유지보수성을 높이기 위해

(팩토리 패턴이 등장하게 된 이유는, 어떤 상황에서 사용하는 것이 좋을까 와 같다고 생각함)

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

Q. 팩토리 패턴은 어떤 상황에서 사용하는 것이 좋을까?

  • 객체나 컴포넌트의 생성 과정이 높은 복잡성을 가지고 있을 때
  • 상황에 맞춰 다양한 객체 인스턴스를 편리하게 생성할 수 있는 방법이 필요할 때
  • 같은 속성을 공유하는 여러 개의 작은 객체 또는 컴포넌트를 다뤄야 할 때
  • 덕 타이핑 같은 API 규칙만 충족하면 되는 다른 객체의 인스턴스와 함께 객체를 구성할 때
  • 디커플링 상황

Q. 덕타이핑과 구조적 타이핑, 동적 타이핑

  • 동적 타이핑은, 값이 담길 때 타입이 정해지기 때문에, 동적으로 변한다

  • 덕 타이핑은, 객체의 변수, 메소드의 집합이 객체의 타입을 결정한다

덕 타이핑

  • 구조적 타이핑은, 구조 안에 같은 속성의 타입이 있는지를 체크하는 것이다.
    • 때문에, 의도하지 않았지만 동일한 타입을 가지는 경우 동일한 유형으로 간주될 수 있다 구조적 타이핑

둘 다 객체의 변수, 메소드 같은 필드를 기반으로 타입을 체크(혹은 안할수도)하지만,

덕 타이핑은 '런타임'에 체크하기 때문에 동적 타이핑에서, 구조적 타이핑은 '타입 체커'에서 체크하기 때문에 정적 타이핑에서 쓰인다.

Q. JS는 왜 동적 타입 언어로 설계된 것일까?

주로 유연성간편성을 제공하기 위해서이다

  • 동적 타입 언어란, 변수에 타입을 지정하지 않고 코드가 실행되는 런타임에 변수 값이 할당될 때 해당 값의 타입에 따라 변수 타입이 결정되는 언어이다
  • 자바스크립트는 원래 웹 브라우저 내에서 동적으로 실행되는 스크립트 언어로 설계되었는데, 웹 페이지는 빠른 속도로 변화하는 동적 콘텐츠를 처리해야 했다
  • 동적 타이핑으로 설계된 자바스크립트는 유연성 덕분에 복잡한 설정 없이 다양한 데이터 타입을 처리할 수 있으며, 다양한 웹 브라우저 환경에서 원활하게 작동할 수 있다

Q. TS는 왜 등장한걸까?

  • JS는 동적 타입 언어로, 런타임에 실제 코드의 값이 평가될 시점에서야 변수에 들어올 값과 타입을 알 수 있다
  • 때문에, 개발자의 의도와 다르게 동작할 수 있다. (ex: 숫자 a,b의 합을 구하는 함수에서 문자열의 합을 구할 수 있음)
  • TS는 정적 타입 언어로, 컴파일 타임에 변수의 타입을 결정한다
  • 이로써 TS는 타입 에러를 사전에 방지해 안정성을 보장한다

Q. JS는 왜 싱글스레드를 사용할까?

  • JS는 원래 웹 브라우저에서 동적 동작을 위해 설계되었기 때문이다
  • 주로 DOM을 조작하는 데 주로 사용되는데, 여러 스레드가 동시에 DOM을 수정한다면 충돌이 발생할 수 있다
  • 싱글 스레드에서는 한 번에 하나의 작업만 수행하므로, DOM 업데이트가 안전하게 순차적으로 이루어진다 (비동기)
  • 그러나 이벤트 루프를 통한 비동기 처리로 동시성을 지원한다.
  • 이벤트 루프는 콜 스택태스크 큐를 사용해, 비동기 작업이 완료되면 해당 콜백 함수를 콜 스택으로 보내 실행한다

Q. 이벤트 루프의 동작 과정은 어떻게 진행되나?

  1. 콜 스택에 현재 실행 중인 컨텍스트가 있는지, 테스크 큐에 대기 중인 함수가 있는지 반복하며 확인
  2. 만약 콜 스택이 비어있고, 테스크 큐에 대기중인 함수가 있다면 순차적으로 콜스택으로 이동 후 실행
  3. 태스크 큐와 마이크로 태스크 큐에 대기 중인 함수가 있다면, 마이크로 테스크 큐를 우선적으로 처리 후 테스크 큐 처리

이벤트루프 동작 과정

Q. 팩토리 패턴을 사용하면 안되는 상황은 뭘까?

객체 생성 인터페이스 제공이 작업 중인 라이브러리나 프레임워크의 설계 목표가 아닐 때

  • 잘못된 상황에 팩토리 패턴을 적용하면 애플리케이션의 복잡도가 크게 증가할 수 있다
  • 객체 생성 과정이 복잡할 경우 단위 테스트의 복잡성 또한 증가시킬 수 있다
    • 팩토리 패턴은 객체 생성 과정을 인터페이스 뒤에 추상화하기 때문