Node.js파일과 스트림

Web Streams와 Node streams

현대 Node.js에서 공존하는 Web Streams와 전통적인 Node streams가 무엇이 다르고, 어느 경계에서 만나는지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

javascript
const response = await fetch("https://example.com/data");
const webStream = response.body;

설명

  • Node.js에는 오래전부터 stream.Readable, stream.Writable 중심의 전통적인 Node streams 모델이 있었고, 최근에는 fetch와 함께 Web Streams API도 기본 제공됩니다. 이름이 비슷해 보여도 모델과 메서드 구성이 다릅니다.
  • Node streams는 파일, 소켓, 파이프 같은 런타임 자원과 긴밀하게 붙어 있고, pipe, pipeline, highWaterMark, backpressure 같은 개념을 중심으로 이해하는 편이 좋습니다.
  • Web Streams는 브라우저와 더 가깝고, ReadableStream, WritableStream, TransformStream 같은 표준 인터페이스를 따릅니다. fetch 응답 본문처럼 Web 플랫폼 표면과 연결될 때 자주 등장합니다.
  • 중요한 것은 "어느 API가 어떤 스트림을 반환하는가"를 구분하는 감각입니다. Node 내부 파일 처리에서는 전통적인 stream이 더 많이 보이고, fetch나 Web API 경계에서는 Web Streams가 더 자연스럽습니다.
  • 현대 Node에서는 두 세계가 공존하므로, 스트림 코드가 깨질 때 문법보다 먼저 "지금 내가 다루는 것이 Node stream인지 Web Stream인지"를 확인하는 습관이 중요합니다.

빠른 정리

구분잘 보이는 곳
Node streams파일, 소켓, 기존 Node API
Web Streamsfetch, 표준 Web API 표면
핵심 차이타입과 메서드 구성이 다름
핵심 질문이 API가 어떤 종류의 stream을 돌려주는가

주의할 점

스트림이라는 이름만 보고 메서드를 섞어 쓰면 바로 막힐 수 있습니다. response.body가 있다고 해서 자동으로 전통적인 Node Readable이라고 가정하면 안 되고, 현재 API가 어느 스트림 계열인지 먼저 확인하는 편이 좋습니다.

참고 링크

2 sources