빠른 흐름
javascript
import { createReadStream, createWriteStream } from "node:fs";
import { createGzip } from "node:zlib";
import { pipeline } from "node:stream/promises";
await pipeline(
createReadStream("./input.log"),
createGzip(),
createWriteStream("./output.log.gz"),
);연결과 완료
먼저 구분해 둘 기본형은 아래입니다.
- 단순 연결:
readable.pipe(writable) - 다단 연결:
await pipeline(a, b, c) - 특정 스트림 완료 대기:
await finished(stream) - 스트림 promises API:
node:stream/promises
스트림 여러 개를 연결하면 기본값은 pipeline()
운영 코드에서 pipe()는 데이터 흐름은 연결하지만 에러 정리 책임이 금방 흩어집니다. 읽기/변환/쓰기 체인이 생기는 순간 pipeline() 쪽이 보통 맞습니다.
finished()는 "이 스트림 하나가 끝났는가"를 기다리는 카드다
파이프라인 전체보다 특정 writable flush 완료, 특정 readable 종료만 기다리고 싶을 때 유용합니다.
javascript
import { finished } from "node:stream/promises";
await finished(writeStream);이 카드의 핵심은 데이터 흐름보다 정리 책임이다
실전에서 다시 찾는 포인트는 보통 "어디서 에러가 나도 다 닫히는가"입니다. pipeline()은 그 책임을 한 번에 가져갑니다.
pipe()는 개념 카드, pipeline()은 운영 카드에 가깝다
둘 다 연결은 되지만, 운영 코드에서는 "실패했을 때 누가 정리하는가"가 더 중요합니다.
그래서 체인이 둘 이상이거나 파일/네트워크 리소스가 걸리면 pipeline()이 기본값에 가깝습니다.
언제 pipeline을 쓸까
체크포인트
- 단순 연결:
pipe() - 에러 정리까지 포함:
pipeline() - 특정 스트림 완료 대기:
finished() - 중간 transform 있음:
pipeline()선호 - 파일/네트워크 리소스 정리까지 본다:
pipeline()우선
주의할 점
운영 코드에서 pipe()만 연결하고 에러 정리를 빼면 스트림이 열린 채 남기 쉽다. 두 개 이상 엮이는 순간 pipeline()이 기본값이라고 보는 편이 안전하다.
참고 링크
1 sources