Vana Blog

Node.js Design Pattern - 디자인 패턴(Factory)

June 13, 2019

디자인 패턴은 되풀이되는 문제에 대한 재사용 가능한 솔루션이다.

팩토리(Factory)

가장 간단하고 공통적인 디자인 패턴.

객체를 생성하기 위한 제너릭 인터페이스

new 연산자 또는 Object.create()를 사용하여 프로토타입에서 직접 새 객체를 만드는 대신 팩토리를 호출하면 훨씬 편리하고 유연하다.

팩토리는 객체 생성을 구현과 분리할 수 있게 해준다. 팩토리는 새로운 인스턴스의 생성을 감싸서 유연성과 제어력을 제공한다. 팩토리 내에서 클로저를 활용하고 프로토타입과 new연산자, Object.create()를 사용하여 새로운 인스턴스를 생성하거나 다른 인스턴스를 반환할 수 있다.

function createImage(name) {
  if(name.match(/\.jpeg$/)){
    return new JpegImage(name);
  } else if(name.match(/\.gif$/)) {
    return new GifImage(name);
  } else if(name.match(/\.png$/)) {
    return new PngImage(name);
  } else {
    throw new Exception('Unsupported format');
  }
}

캡슐화를 강제하기 위한 메커니즘

팩토리는 클로저 덕분에 캡슐화 메커니즘으로도 사용할 수 있다.

캡슐화(encapsulation)는 외부 코드가 내부 세부 정보에 대해 직접 조작하지 못하게 하여 객체의 접근을 제어하는 기술을 말한다. 객체와의 상호작용은 공개된 인터페이스를 통해서만 발생하며 객체의 세부 구현에 대한 변경 사항과 외부 코드를 분리한다. 이것응ㄹ 정보 은닉(information hiding)이라고도 한다. 캡슐화는 상속(inheritance), 다형성(polymorphism) 및 추상화(abstration)와 함께 객체지향 디자인의 기본 원칙이기도 한다.

javascript에서 캡슐화를 적용하는 유일한 방법은 함수 범위(function scope)와 클로저를 사용하는 것이다.

function createPerson(name) {
  const privateProperties = {};
 
  const person = {
    setName: name => {
      if(!name) throw new Error('A person must have a name');
      privateProperties.name = name;
    },
    getName: () => {
      return privateProperties.name;
    }
  };
 
  person.setName(name);
  return person;
}

팩토리는 private멤버를 생성하기 위한 기술 중 하나다. 다른 접근 방법들은 아래와 같다.

덕 타이핑(duck typing)

덕 타이핑(duck typing) 팩토리 함수를 사용하여 어떤 방식으로든 객체를 생성할 수 있으며, 추가적인 초기화 단계를 수행하거나 특정 조건을 기반으로 다른 유형의 객체를 반환할 수 있다.

실전에서 사용되는 팩토리 패턴

새로운 인스턴스를 만드는데 팩토리 제공

  • Dnode : Node.js용 원격 프로시저 호출(RPC) 시스템이다.
  • Restify : REST API를 만들기 위한 프레임워크

클래스와 팩토리를 외부에 노출하고 있으나 새로운 인스턴스를 작성하는 방법

  • http-proxy: 이것은 프로그래밍 가능한 프록싱 라이브러리인데 httpProxy.createProxyServer(optons)로 새로운 인스터스가 생성된다.
  • 코어 Node.js HTTP 서버: http.createServer()를 사용하여 새로운 인스턴스를 생성한다.
  • bunyan: 로깅 라이브러리. bunyan.createLogger()라는 팩토리를 소개. new bunyan()을 실행하는 것과 같다.

다른 컴포넌트의 생성을 감싸는 팩토리를 제공.

  • throught2, from2

stamp 스펙과 조합 가능한 팩토리 기능을 사용하는 패키지


Vana Yun

Written by Vana Yun