Vana Blog

Node.js Design Pattern - 스트림 코딩(3)

June 13, 2019

파이프 패턴

Node.js 스트림 서로 다른 패턴으로 함께 연결(pipe)될 수 있다. 두 개의 서로 다른 스트림의 흐름을 하나로 병합하고 분할할 수 있다.

스트림 결합(combine)

  • 결합된 스트림을 쓸 때는 파이프라인의 첫 번째 스트림에 쓴다.
  • 결합된 스트림으로부터 읽을 때는 파이프라인의 마지막 스트림에서 읽는다.
  • 결합된 스트림은 보통 이중(Duplex) 스트림이며, 첫 번째 스트림을 Writable 마지막 스트림을 Readable쪽에 연결한다.
  • 파이프라인 내부의 모든 스트림에서 발생하는 모든 오류를 포착해야한다.
  • 오류 이벤트는 파이프라인을 따라 자동으로 전파되지 않는다.

결합된 스트림의 이점

  • 내부 파이프라인을 숨김으로써 블랙박스화 하여 재배포할 수 있다.
  • 에러 리스너를 결합된 스트림 자체 외에 파이프라인의 각 스트림들에 첨부하지 않도록 하여 에러 관리를 간소화한다.

참고

스트림 포크(fork)

하나의 Readable 스트림을 여러 Writable 스트림으로 연결함으로써 스트림을 포크할 수 있다. 서로 다른 대상에 동일한 데이터를 보내는 경우에 유용함. 동일한 데이터에 대해 여러 가지 변형을 수해하거나 데이터를 분할하는 경우에도 사용 가능.

스트림 병합(merge)

일련의 Readable스트림을 하나의 Writable스트림으로 파이프하는 것으로 구성. auto end 옵션을 사용하는 연결은 소스 중 하나가 끝나는 즉시 대상 스트림이 종료되도록 하므로 최종 이벤트를 처리하는 방식에 주의해야한다. 동작 중인 소스에서 이미 종료된 스트리메 쓰기를 계속하므로 이로 인한 오류가 발생할 수 있다. 이 문제에 대한 해결책은 여러 소스들을 하나의 대상에 연결할 때 {end: false} 옵션을 사용하고 모든 소스들이 일기를 완료한 경우에만 대상에서 end()를 호출하도록 한다.

참고

주의점

  • 대상 스트림으로 파이프된 데이터가 임의로 혼합된다는 점에 유의해야한다. 스트림을 순서대로 병합할 수 있는 병합 패턴
  • multistream

멀티플렉싱과 디멀티플렉싱

병합 스트림 패턴의 특별한 변형. 여러 스트림을 함께 결합하지 않고 대신 공유 채널을 사용하여 일련의 스트림 데이터를 전달한다. 단일 스트림을 통한 전송을 가능하게 하기 위해 다중 스트림을 함께 결합하는 동작이 멀티플렉싱 공유 스트림으로부터 수신된 데이터로 원본 스트림을 재구성하는 동작이 디멀티플렉싱이다. 이런 작업을 수행하는 장치를 각각 멀티플렉서(mux) 그리고 디멀티플렉서(demux)라고 한다. 전화, 라디오, TV, 인터넷과 같은 통신 매체의 토대 중 하나이다.


Vana Yun

Written by Vana Yun