앞선 아티클에서 readStream과 writeStream을 pipe를 사용해서 연결하는 방법까지 함께 살펴보았습니다.
이번 아티클에서는 이 pipe를 응용하여 좀 더 다양한 기능을 구현해 보겠습니다. 일단 pipe는 스트림 사이에 여러 번 연결이 가능합니다. 이 뜻이 예시가 없으면 잘 이해가 안 가실 텐데, 예제를 위해 zlib 모듈을 사용해 보겠습니다.
zlip은 노드에서 파일을 압축하는 모듈인데, 자주 사용하는 모듈은 아니니 예제를 이해하는 정도로만 학습하시면 됩니다. 아래 예제에서는 zlib의 createGzip 메서드가 스트림을 지원합니다. 그래서 readStream과 writeStream 사이에서 파이핑을 진행하게 됩니다.
const zlib = require('zlib');
const fs = require('fs');
const readStream = fs.createReadStream('./readme4.txt');
const zlibStream = zlib.createGzip();
const writeStream = fs.createWriteStream('./readme4.txt.gz');
readStream.pipe(zlibStream).pipe(writeStream);
앞선 아티클에서는 readStream과 writeStream을 pipe를 통해서 바로 연결했고, 그 과정을 통해 readStream으로 불러온 파일을 writeStream에 전달해 복사했었습니다.
이번 예제코드에서는 버퍼 데이터가 전달되는 과정에서 gzip을 통해 압축을 한번 거치고, 그 다음에 파일로 작성이 됩니다. 위 코드를 실행하면 출력되는 것은 없지만 해당 폴더에 [readme4.txt.gz]라는 압축파일이 생성되는 것을 확인할 수 있습니다.
stream 모듈에서 pipeline 메서드를 사용하면 여러 개의 파이프를 연결할 수 있습니다. 위의 예제를 ES 모듈을 사용해 다르게 구현해 보겠습니다.
import { pipeline } from 'stream/promises';
import zlib from 'zlib';
import fs from 'fs';
await pipeline(
fs.createReadStream('./readme4_2.txt'),
zlib.createGzip(),
fs.createWriteStream('/readme4_2.txt.gz'),
);
여기에 pipeline의 장점으로써 활용할 수 있는 기능이, AbortController 사용입니다. 원할 때 파이프를 중단할 수 있는 것이죠.
import { pipeline } from 'stream/promises';
import zlib from 'zlib';
import fs from 'fs';
const ac = new AbortController();
const signal = ac.signal;
setTimeout(() => ac.abort(), 1000);
await pipeline(
fs.createReadStream('./readme4_2.txt'),
zlib.createGzip(),
fs.createWriteStream('/readme4_2.txt.gz'),
{ signal },
);
pipeline의 마지막 인수로 { signal }을 추가해주고, 원하는 시점에 ac.abort( )를 호출하는 방식입니다. 위의 예제에서는 1초 후에 중단하도록 작성했습니다.
다음 아티클에서는 버퍼와 메모리를 사용해서 동일한 작업을 처리했을 때, 어떤 차이가 발생하는지 확인해 보겠습니다.
'Programming > Node.js' 카테고리의 다른 글
4. Node 기능 살펴보기 (8) - fs메서드 살펴보기 1 (0) | 2024.05.29 |
---|---|
4. Node 기능 살펴보기 (7) - 버퍼와 스트림 6 (0) | 2024.05.28 |
4. Node 기능 살펴보기 (7) - 버퍼와 스트림 4 (0) | 2024.05.24 |
4. Node 기능 살펴보기 (7) - 버퍼와 스트림 3 (0) | 2024.05.22 |
4. Node 기능 살펴보기 (7) - 버퍼와 스트림 2 (0) | 2024.05.21 |