Node.js ์คํธ๋ฆผ์ด ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ํ์ฅ์ฑ๊ณผ ์๋ต์ฑ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
Node.js ์คํธ๋ฆผ: ๋์ฉ๋ ๋ฐ์ดํฐ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ
๋ฐ์ดํฐ ์ค์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์๋์๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. Node.js๋ ๋ ผ๋ธ๋กํน, ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ฒญํฌ๋ก ์ฒ๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ธ ์คํธ๋ฆผ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธฐ์ฌ์์๋ Node.js ์คํธ๋ฆผ์ ์ธ๊ณ๋ฅผ ํ๊ตฌํ์ฌ ์ด์ , ์ ํ, ๋ฐฉ๋ํ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌ์์ค๋ฅผ ์๋ชจํ์ง ์๊ณ ์ฒ๋ฆฌํ ์ ์๋ ํ์ฅ ๊ฐ๋ฅํ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ดํด๋ด ๋๋ค.
์คํธ๋ฆผ์ ์ฌ์ฉํ๋ ์ด์
์ ํต์ ์ผ๋ก ์ ์ฒด ํ์ผ์ ์ฝ๊ฑฐ๋ ๋คํธ์ํฌ ์์ฒญ์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ํ ์ฒ๋ฆฌํ๋ ๊ฒ์ ํนํ ๋์ฉ๋ ํ์ผ ๋๋ ์ง์์ ์ธ ๋ฐ์ดํฐ ํผ๋๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฌ๊ฐํ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ด๋ํ ์ ์์ต๋๋ค. ๋ฒํผ๋ง์ด๋ผ๊ณ ํ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋นํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์๋ต ์๋๋ฅผ ๋ฆ์ถ ์ ์์ต๋๋ค. ์คํธ๋ฆผ์ ์์ ๋ ๋ฆฝ์ ์ธ ์ฒญํฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ ์ฒด ๋ฐ์ดํฐ ์ธํธ๊ฐ ๋ก๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋ ์ฆ์ ๋ฐ์ดํฐ ์์ ์ ์์ํ ์ ์๋๋ก ํ์ฌ ๋์ฑ ํจ์จ์ ์ธ ๋์์ ์ ๊ณตํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ํนํ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ์ฒญํฌ๋ก ์ฒ๋ฆฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ํฌ๊ฒ ์ค์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ฒด ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ฑ๋ฅ ํฅ์: ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ง์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ๋ ๋๋ก ์ฒ๋ฆฌ ๋ฐ ์ ์กํ ์ ์์ผ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต ์๋๋ฅผ ๊ฐ์ ํฉ๋๋ค.
- ํ์ฅ์ฑ ํฅ์: ์คํธ๋ฆผ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ํฐ ๋ฐ์ดํฐ ์ธํธ์ ๋ ๋ง์ ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ด ํ์ฅ์ฑ๊ณผ ๊ฒฌ๊ณ ์ฑ์ด ํฅ์๋ฉ๋๋ค.
- ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ์คํธ๋ฆผ์ ๋น๋์ค, ์ค๋์ค ๋๋ ์ผ์ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ ์กํด์ผ ํ๋ ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋๋ฆฌ์ค์ ์ด์์ ์ ๋๋ค.
์คํธ๋ฆผ ์ ํ ์ดํด
Node.js๋ ๊ฐ๊ฐ ํน์ ๋ชฉ์ ์ ์ํด ์ค๊ณ๋ ๋ค ๊ฐ์ง ๊ธฐ๋ณธ ์คํธ๋ฆผ ์ ํ์ ์ ๊ณตํฉ๋๋ค.
- ์ฝ๊ธฐ ์คํธ๋ฆผ: ์ฝ๊ธฐ ์คํธ๋ฆผ์ ํ์ผ, ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋๋ ๋ฐ์ดํฐ ์์ฑ๊ธฐ์ ๊ฐ์ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ 'data' ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ด๊ณ ๋ฐ์ดํฐ ์์ค๊ฐ ์์ ํ ์๋ชจ๋์์ ๋ 'end' ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ ๋๋ค.
- ์ฐ๊ธฐ ์คํธ๋ฆผ: ์ฐ๊ธฐ ์คํธ๋ฆผ์ ํ์ผ, ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- ์ด์ค ์คํธ๋ฆผ: ์ด์ค ์คํธ๋ฆผ์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๊ฐ ๋ชจ๋ ๊ฐ๋ฅํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์๋ฐฉํฅ์ผ๋ก ๋์์ ํ๋ฅด๊ฒ ํฉ๋๋ค. ์์ผ๊ณผ ๊ฐ์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ณํ ์คํธ๋ฆผ: ๋ณํ ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ํต๊ณผํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฑฐ๋ ๋ณํํ ์ ์๋ ํน์ํ ์ ํ์ ์ด์ค ์คํธ๋ฆผ์ ๋๋ค. ์์ถ, ์ํธํ ๋๋ ๋ฐ์ดํฐ ๋ณํ๊ณผ ๊ฐ์ ์์ ์ ์ด์์ ์ ๋๋ค.
์ฝ๊ธฐ ์คํธ๋ฆผ์ผ๋ก ์์ ํ๊ธฐ
์ฝ๊ธฐ ์คํธ๋ฆผ์ ๋ค์ํ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์ํ ๊ธฐ๋ฐ์ ๋๋ค. ๋ค์์ ์ฝ๊ธฐ ์คํธ๋ฆผ์ ์ฌ์ฉํ์ฌ ๋์ฉ๋ ํ ์คํธ ํ์ผ์ ์ฝ๋ ๊ธฐ๋ณธ ์์ ๋๋ค.
const fs = require('fs');
const readableStream = fs.createReadStream('large-file.txt', { encoding: 'utf8', highWaterMark: 16384 });
readableStream.on('data', (chunk) => {
console.log(`Received ${chunk.length} bytes of data`);
// Process the data chunk here
});
readableStream.on('end', () => {
console.log('Finished reading the file');
});
readableStream.on('error', (err) => {
console.error('An error occurred:', err);
});
์ด ์์์:
fs.createReadStream()์ ์ง์ ๋ ํ์ผ์์ ์ฝ๊ธฐ ์คํธ๋ฆผ์ ๋ง๋ญ๋๋ค.encoding์ต์ ์ ํ์ผ์ ๋ฌธ์ ์ธ์ฝ๋ฉ(์ด ๊ฒฝ์ฐ UTF-8)์ ์ง์ ํฉ๋๋ค.highWaterMark์ต์ ์ ๋ฒํผ ํฌ๊ธฐ(์ด ๊ฒฝ์ฐ 16KB)๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๊ฒ์ 'data' ์ด๋ฒคํธ๋ก ๋ด๋ณด๋ด์ง ์ฒญํฌ์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.'data'์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๋ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ์ฌ์ฉํ ์ ์์ ๋๋ง๋ค ํธ์ถ๋ฉ๋๋ค.- ์ ์ฒด ํ์ผ์ด ์ฝํ์ ๋
'end'์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํธ์ถ๋ฉ๋๋ค. - ์ฝ๋ ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด
'error'์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํธ์ถ๋ฉ๋๋ค.
์ฐ๊ธฐ ์คํธ๋ฆผ์ผ๋ก ์์ ํ๊ธฐ
์ฐ๊ธฐ ์คํธ๋ฆผ์ ๋ค์ํ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์์ ์ฐ๊ธฐ ์คํธ๋ฆผ์ ์ฌ์ฉํ์ฌ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ์์ ๋๋ค.
const fs = require('fs');
const writableStream = fs.createWriteStream('output.txt', { encoding: 'utf8' });
writableStream.write('This is the first line of data.\n');
writableStream.write('This is the second line of data.\n');
writableStream.write('This is the third line of data.\n');
writableStream.end(() => {
console.log('Finished writing to the file');
});
writableStream.on('error', (err) => {
console.error('An error occurred:', err);
});
์ด ์์์:
fs.createWriteStream()์ ์ง์ ๋ ํ์ผ์ ์ฐ๊ธฐ ์คํธ๋ฆผ์ ๋ง๋ญ๋๋ค.encoding์ต์ ์ ํ์ผ์ ๋ฌธ์ ์ธ์ฝ๋ฉ(์ด ๊ฒฝ์ฐ UTF-8)์ ์ง์ ํฉ๋๋ค.writableStream.write()๋ฉ์๋๋ ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆผ์ ์๋๋ค.writableStream.end()๋ฉ์๋๋ ๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆผ์ ์ฐ์ง ์์์ ์๋ฆฌ๊ณ ์คํธ๋ฆผ์ ๋ซ์ต๋๋ค.- ์ฐ๋ ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด
'error'์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํธ์ถ๋ฉ๋๋ค.
์คํธ๋ฆผ ํ์ดํ
ํ์ดํ์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์คํธ๋ฆผ์ ์ฐ๊ฒฐํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ผ๋ก, ๋ฐ์ดํฐ๋ฅผ ํ ์คํธ๋ฆผ์์ ๋ค๋ฅธ ์คํธ๋ฆผ์ผ๋ก ์ํํ๊ฒ ์ ์กํ ์ ์์ต๋๋ค. pipe() ๋ฉ์๋๋ ์คํธ๋ฆผ์ ์ฐ๊ฒฐํ๋ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ์ฌ ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ์ค๋ฅ ์ ํ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋งค์ฐ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค.
const fs = require('fs');
const zlib = require('zlib'); // For gzip compression
const readableStream = fs.createReadStream('large-file.txt');
const gzipStream = zlib.createGzip();
const writableStream = fs.createWriteStream('large-file.txt.gz');
readableStream.pipe(gzipStream).pipe(writableStream);
writableStream.on('finish', () => {
console.log('File compressed successfully!');
});
์ด ์์ ๋ ํ์ดํ์ ์ฌ์ฉํ์ฌ ๋์ฉ๋ ํ์ผ์ ์์ถํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
- ์ ๋ ฅ ํ์ผ์์ ์ฝ๊ธฐ ์คํธ๋ฆผ์ด ์์ฑ๋ฉ๋๋ค.
zlib๋ชจ๋์ ์ฌ์ฉํ์ฌgzip์คํธ๋ฆผ์ด ์์ฑ๋๋ฉฐ, ์ด ๋ชจ๋์ ๋ฐ์ดํฐ๋ฅผ ํต๊ณผํ๋ฉด์ ์์ถํฉ๋๋ค.- ์์ถ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ ํ์ผ์ ์ฐ๊ธฐ ์ํด ์ฐ๊ธฐ ์คํธ๋ฆผ์ด ์์ฑ๋ฉ๋๋ค.
pipe()๋ฉ์๋๋ ์คํธ๋ฆผ์ ์์๋๋ก ์ฐ๊ฒฐํฉ๋๋ค: ์ฝ๊ธฐ ๊ฐ๋ฅ -> gzip -> ์ฐ๊ธฐ ๊ฐ๋ฅ.- ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋๋ฉด ์ฐ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ์์
'finish'์ด๋ฒคํธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋์ด ์์ถ ์ฑ๊ณต์ ๋ํ๋ ๋๋ค.
ํ์ดํ์ ๋ฐฑํ๋ ์ ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ฝ๊ธฐ ์คํธ๋ฆผ์ด ์ฐ๊ธฐ ์คํธ๋ฆผ์ด ์ฌ์ฉํ ์ ์๋ ๊ฒ๋ณด๋ค ๋ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ๋ ๋ฐฑํ๋ ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ํ์ดํ์ ์ฐ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ์ด ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ค๋น๊ฐ ๋ ๋๊น์ง ๋ฐ์ดํฐ ํ๋ฆ์ ์ผ์ ์ค์งํ์ฌ ์ฝ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ์ด ์ฐ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ์ ์๋ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ฅผ ํตํด ํจ์จ์ ์ธ ๋ฆฌ์์ค ํ์ฉ์ ๋ณด์ฅํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํ๋ก๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
๋ณํ ์คํธ๋ฆผ: ์คํ ์ค์ธ ๋ฐ์ดํฐ ์์
๋ณํ ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์คํธ๋ฆผ์์ ์ฐ๊ธฐ ์คํธ๋ฆผ์ผ๋ก ํ๋ฅผ ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฑฐ๋ ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ ๋ณํ, ํํฐ๋ง ๋๋ ์ํธํ์ ๊ฐ์ ์์
์ ํนํ ์ ์ฉํฉ๋๋ค. ๋ณํ ์คํธ๋ฆผ์ Duplex ์คํธ๋ฆผ์์ ์์๋๋ฉฐ ๋ฐ์ดํฐ ๋ณํ์ ์ํํ๋ _transform() ๋ฉ์๋๋ฅผ ๊ตฌํํฉ๋๋ค.
๋ค์์ ํ ์คํธ๋ฅผ ๋๋ฌธ์๋ก ๋ณํํ๋ ๋ณํ ์คํธ๋ฆผ์ ์์ ๋๋ค.
const { Transform } = require('stream');
class UppercaseTransform extends Transform {
constructor() {
super();
}
_transform(chunk, encoding, callback) {
const transformedChunk = chunk.toString().toUpperCase();
callback(null, transformedChunk);
}
}
const uppercaseTransform = new UppercaseTransform();
const readableStream = process.stdin; // Read from standard input
const writableStream = process.stdout; // Write to standard output
readableStream.pipe(uppercaseTransform).pipe(writableStream);
์ด ์์์:
stream๋ชจ๋์์Transformํด๋์ค๋ฅผ ํ์ฅํ๋ ์ฌ์ฉ์ ์ง์ ๋ณํ ์คํธ๋ฆผ ํด๋์คUppercaseTransform์ ๋ง๋ญ๋๋ค._transform()๋ฉ์๋๋ ๊ฐ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ๋๋ฌธ์๋ก ๋ณํํ๋๋ก ์ฌ์ ์๋ฉ๋๋ค.callback()ํจ์๋ ๋ณํ์ด ์๋ฃ๋์์์ ์๋ฆฌ๊ณ ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ดํ๋ผ์ธ์ ๋ค์ ์คํธ๋ฆผ์ผ๋ก ์ ๋ฌํ๊ธฐ ์ํด ํธ์ถ๋ฉ๋๋ค.- ์ฝ๊ธฐ ์คํธ๋ฆผ(ํ์ค ์ ๋ ฅ)๊ณผ ์ฐ๊ธฐ ์คํธ๋ฆผ(ํ์ค ์ถ๋ ฅ)์ ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค.
- ์ฝ๊ธฐ ์คํธ๋ฆผ์ ๋ณํ ์คํธ๋ฆผ์ ํตํด ์ฐ๊ธฐ ์คํธ๋ฆผ์ผ๋ก ํ์ดํํ์ฌ ์ ๋ ฅ ํ ์คํธ๋ฅผ ๋๋ฌธ์๋ก ๋ณํํ๊ณ ์ฝ์์ ์ธ์ํฉ๋๋ค.
๋ฐฑํ๋ ์ ์ฒ๋ฆฌ
๋ฐฑํ๋ ์ ๋ ํ ์คํธ๋ฆผ์ด ๋ค๋ฅธ ์คํธ๋ฆผ์ ์๋ํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ์ค์ํ ๊ฐ๋ ์ ๋๋ค. ์ฝ๊ธฐ ์คํธ๋ฆผ์ด ์ฐ๊ธฐ ์คํธ๋ฆผ์ด ์ฌ์ฉํ ์ ์๋ ๊ฒ๋ณด๋ค ๋ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ฉด ๋ฐฑํ๋ ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ๋ฐฑํ๋ ์ ๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํ๋ก ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ถ์์ ์ฑ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. Node.js ์คํธ๋ฆผ์ ๋ฐฑํ๋ ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
pipe() ๋ฉ์๋๋ ๋ฐฑํ๋ ์
๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ฐ๊ธฐ ์คํธ๋ฆผ์ด ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ค๋น๊ฐ ๋์ง ์์ผ๋ฉด ์ฝ๊ธฐ ์คํธ๋ฆผ์ด ์ฐ๊ธฐ ์คํธ๋ฆผ์ด ์ค๋น๋์๋ค๋ ์ ํธ๋ฅผ ๋ณด๋ผ ๋๊น์ง ์ผ์ ์ค์ง๋ฉ๋๋ค. ๊ทธ๋ฌ๋ pipe()๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์คํธ๋ฆผ์ผ๋ก ์์
ํ ๋ readable.pause() ๋ฐ readable.resume() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑํ๋ ์
๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๋ค์์ ๋ฐฑํ๋ ์ ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์ ๋๋ค.
const fs = require('fs');
const readableStream = fs.createReadStream('large-file.txt');
const writableStream = fs.createWriteStream('output.txt');
readableStream.on('data', (chunk) => {
if (!writableStream.write(chunk)) {
readableStream.pause();
}
});
writableStream.on('drain', () => {
readableStream.resume();
});
readableStream.on('end', () => {
writableStream.end();
});
์ด ์์์:
- ์คํธ๋ฆผ์ ๋ด๋ถ ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐจ ์์ผ๋ฉด
writableStream.write()๋ฉ์๋๋false๋ฅผ ๋ฐํํ์ฌ ๋ฐฑํ๋ ์ ๊ฐ ๋ฐ์ํ์์ ๋ํ๋ ๋๋ค. writableStream.write()๊ฐfalse๋ฅผ ๋ฐํํ๋ฉดreadableStream.pause()๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ธฐ ์คํธ๋ฆผ์ ์ผ์ ์ค์งํ์ฌ ๋ ๋ง์ ๋ฐ์ดํฐ ์์ฑ์ ์ค์งํฉ๋๋ค.- ์ฐ๊ธฐ ์คํธ๋ฆผ์ ๋ฒํผ๊ฐ ๋ ์ด์ ๊ฐ๋ ์ฐจ์ง ์์ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ค๋น๊ฐ ๋๋ฉด
'drain'์ด๋ฒคํธ๊ฐ ์ฐ๊ธฐ ์คํธ๋ฆผ์์ ๋ด๋ณด๋ด์ง๋๋ค. 'drain'์ด๋ฒคํธ๊ฐ ๋ด๋ณด๋ด์ง๋ฉดreadableStream.resume()์ ์ฌ์ฉํ์ฌ ์ฝ๊ธฐ ์คํธ๋ฆผ์ ๋ค์ ์์ํ์ฌ ๋ฐ์ดํฐ ์์ฑ์ ๊ณ์ํ ์ ์๋๋ก ํฉ๋๋ค.
Node.js ์คํธ๋ฆผ์ ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ
Node.js ์คํธ๋ฆผ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํ ๋ค์ํ ์๋๋ฆฌ์ค์์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฐพ์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์์ ๋๋ค.
- ํ์ผ ์ฒ๋ฆฌ: ๋์ฉ๋ ํ์ผ์ ํจ์จ์ ์ผ๋ก ์ฝ๊ณ , ์ฐ๊ณ , ๋ณํํ๊ณ , ์์ถํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ์ ๋ณด๋ฅผ ์ถ์ถํ๊ธฐ ์ํด ๋๊ท๋ชจ ๋ก๊ทธ ํ์ผ์ ์ฒ๋ฆฌํ๊ฑฐ๋ ์๋ก ๋ค๋ฅธ ํ์ผ ํ์ ๊ฐ์ ๋ณํํฉ๋๋ค.
- ๋คํธ์ํฌ ํต์ : ๋น๋์ค ๋๋ ์ค๋์ค ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ๊ณผ ๊ฐ์ ๋๊ท๋ชจ ๋คํธ์ํฌ ์์ฒญ ๋ฐ ์๋ต์ ์ฒ๋ฆฌํฉ๋๋ค. ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ์ฒญํฌ๋ก ์ฌ์ฉ์์๊ฒ ์คํธ๋ฆฌ๋ฐํ๋ ๋น๋์ค ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ ๊ณ ๋ คํ์ญ์์ค.
- ๋ฐ์ดํฐ ๋ณํ: CSV์์ JSON ๋๋ XML์์ JSON์ผ๋ก์ ๊ฐ์ด ์๋ก ๋ค๋ฅธ ํ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํฉ๋๋ค. ์ฌ๋ฌ ์์ค์ ๋ฐ์ดํฐ๋ฅผ ํตํฉ๋ ํ์์ผ๋ก ๋ณํํด์ผ ํ๋ ๋ฐ์ดํฐ ํตํฉ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค.
- ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ: IoT ์ฅ์น์์ ์์ง๋ ์ผ์ ๋ฐ์ดํฐ ๋๋ ์ฃผ์ ์์ฅ์์ ์์ง๋ ๊ธ์ต ๋ฐ์ดํฐ์ ๊ฐ์ ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํฉ๋๋ค. ์์ฒ ๊ฐ์ ์ผ์์์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ค๋งํธ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด์ญ์์ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธ ์์ฉ: ํนํ ๋์ฉ๋ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ MongoDB์ ๊ฐ์ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํฌํจํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค. ์ด๋ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ด๋ณด๋ด๊ธฐ ์์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Node.js ์คํธ๋ฆผ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Node.js ์คํธ๋ฆผ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ณ ์ด์ ์ ๊ทน๋ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ์ฌ๋ฐ๋ฅธ ์คํธ๋ฆผ ์ ํ ์ ํ: ํน์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ์ ์ ํ ์คํธ๋ฆผ ์ ํ(์ฝ๊ธฐ ๊ฐ๋ฅ, ์ฐ๊ธฐ ๊ฐ๋ฅ, ์ด์ค ๋๋ ๋ณํ)์ ์ ํํฉ๋๋ค.
- ์ค๋ฅ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌ: ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ค์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํฉ๋๋ค. ํ์ดํ๋ผ์ธ์ ๋ชจ๋ ์คํธ๋ฆผ์ ์ค๋ฅ ๋ฆฌ์ค๋๋ฅผ ์ฒจ๋ถํฉ๋๋ค.
- ๋ฐฑํ๋ ์ ๊ด๋ฆฌ: ํ๋์ ์คํธ๋ฆผ์ด ๋ค๋ฅธ ์คํธ๋ฆผ์ ์๋ํ์ง ์๋๋ก ๋ฐฑํ๋ ์ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ฌ ํจ์จ์ ์ธ ๋ฆฌ์์ค ํ์ฉ์ ๋ณด์ฅํฉ๋๋ค.
- ๋ฒํผ ํฌ๊ธฐ ์ต์ ํ:
highWaterMark์ต์ ์ ์กฐ์ ํ์ฌ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ํ๋ฆ์ ์ํด ๋ฒํผ ํฌ๊ธฐ๋ฅผ ์ต์ ํํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์ฑ๋ฅ ๊ฐ์ ์ต์์ ๊ท ํ์ ์ฐพ๊ธฐ ์ํด ์คํํฉ๋๋ค. - ๊ฐ๋จํ ๋ณํ์ ํ์ดํ ์ฌ์ฉ: ๊ฐ๋จํ ๋ฐ์ดํฐ ๋ณํ ๋ฐ ์คํธ๋ฆผ ๊ฐ ๋ฐ์ดํฐ ์ ์ก์
pipe()๋ฉ์๋๋ฅผ ํ์ฉํฉ๋๋ค. - ๋ณต์กํ ๋ ผ๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ์ ์ง์ ๋ณํ ์คํธ๋ฆผ ๋ง๋ค๊ธฐ: ๋ณต์กํ ๋ฐ์ดํฐ ๋ณํ์ ๊ฒฝ์ฐ ๋ณํ ๋ ผ๋ฆฌ๋ฅผ ์บก์ํํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ง์ ๋ณํ ์คํธ๋ฆผ์ ๋ง๋ญ๋๋ค.
- ๋ฆฌ์์ค ์ ๋ฆฌ: ์คํธ๋ฆผ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ํ ํ์ผ ๋ซ๊ธฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ํด์ ์ ๊ฐ์ ์ ์ ํ ๋ฆฌ์์ค ์ ๋ฆฌ๋ฅผ ํ์ธํฉ๋๋ค.
- ์คํธ๋ฆผ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํจ์จ์ฑ์ ์ต์ ํํ๊ธฐ ์ํด ์คํธ๋ฆผ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํฉ๋๋ค. Node.js์ ๋ด์ฅ ํ๋กํ์ผ๋ฌ ๋๋ ํ์ฌ ๋ชจ๋ํฐ๋ง ์๋น์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ฒฐ๋ก
Node.js ์คํธ๋ฆผ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ฒญํฌ๋ก ์ฒ๋ฆฌํ์ฌ ์คํธ๋ฆผ์ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ฉฐ ํ์ฅ์ฑ์ ํฅ์์ํต๋๋ค. ๋ค์ํ ์คํธ๋ฆผ ์ ํ์ ์ดํดํ๊ณ , ํ์ดํ์ ๋ง์คํฐํ๊ณ , ๋ฐฑํ๋ ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ฐฉ๋ํ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ Node.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด ๊ธฐ์ฌ์์ ์ค๋ช ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด Node.js ์คํธ๋ฆผ์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ํ์ฉํ๊ณ ๊ด๋ฒ์ํ ๋ฐ์ดํฐ ์ง์ฝ์ ์์ ์ ๋ํ ๊ณ ์ฑ๋ฅ, ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
Node.js ๊ฐ๋ฐ์์ ์คํธ๋ฆผ์ ์์ฉํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ก์ด ์์ค์ ํจ์จ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ด์ด๋ณด์ธ์. ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ด ๊ณ์ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด ์ ์ ๋ ์ค์ํด์ง ๊ฒ์ด๋ฉฐ Node.js ์คํธ๋ฆผ์ ์ด๋ฌํ ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค.