Node.js파일과 스트림

pipeline과 finished

여러 스트림을 안전하게 연결하고 완료 여부를 확인할 때 쓰는 `pipeline()`과 `finished()` 패턴을 정리합니다.

마지막 수정 2026년 3월 20일

기본 패턴

javascript
import { createReadStream, createWriteStream } from "node:fs";
import { pipeline } from "node:stream/promises";

await pipeline(
  createReadStream("./input.log"),
  createWriteStream("./output.log"),
);

설명

  • 단순한 readable.pipe(writable)도 유용하지만, 실제 운영 코드에서는 오류 전파와 종료 처리가 더 중요합니다.
  • pipeline()은 여러 스트림을 연결하고, 중간 어딘가에서 오류가 나면 전체 흐름을 함께 실패시키도록 도와줍니다.
  • 프로미스 버전을 쓰면 await으로 완료 시점을 기다릴 수 있어 비동기 코드와도 자연스럽게 연결됩니다.
  • finished()는 특정 스트림이 정상 종료됐는지, 에러로 끝났는지 감시할 때 유용합니다.
  • pipeline()은 "연결과 전파", finished()는 "완료 감시"에 더 초점이 있다고 이해하면 좋습니다.

짧은 예제

javascript
import { createWriteStream } from "node:fs";
import { finished } from "node:stream/promises";

const writable = createWriteStream("./result.txt");
writable.end("done");

await finished(writable);

빠른 정리

함수역할
pipe()스트림을 단순 연결
pipeline(...)연결 + 오류 전파 + 완료 대기
finished(stream)특정 스트림 완료 감시
stream/promisesawait 가능한 스트림 API

주의할 점

스트림이 두세 개만 연결돼도 수동 error 처리 코드는 금방 복잡해집니다. 운영 코드에서는 pipeline()을 기본 선택지로 두는 편이 훨씬 안전할 때가 많습니다.

참고 링크

1 sources