๋ฐ์ํ
๐ ๋ชฉ์ฐจ
Buffer vs Stream
fileSystem์ ์ฌ์ฉํด ํ์ผ์ ์ฝ๊ณ ์ฐ๊ณ ์ ์ฅํ๋ ๋์์ ํ๋ ค๊ณ ํ ๋, ์ฆ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉํ๋ ํ์์ด๋ค.
๋ฒํผ: ์ผ์ ํ ํฌ๊ธฐ๋ก ๋ชจ์๋๋ ๋ฐ์ดํฐ
- ์ผ์ ํ ํฌ๊ธฐ๊ฐ ๋๋ฉด ํ๋ฒ์ ์ฒ๋ฆฌ
- ๋ฒํผ๋ง: ๋ฒํผ์ ๋ฐ์ดํฐ๊ฐ ์ฐฐ ๋๊น์ง ๋ชจ์ผ๋ ์์
์คํธ๋ฆผ: ๋ฐ์ดํฐ์ ํ๋ฆ โก๏ธ
- ์ผ์ ํ ํฌ๊ธฐ๋ก ๋๋ ์ ์ฌ๋ฌ ๋ฒ์ ๊ฑธ์ณ์ ์ฒ๋ฆฌ
- ๋ฒํผ(๋๋ ์ฒญํฌ)์ ํฌ๊ธฐ๋ฅผ ์๊ฒ ๋ง๋ค์ด์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
- ์คํธ๋ฆฌ๋ฐ: ์ผ์ ํ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ์ ๋ฌํ๋ ์์
Buffer
buffer๋ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ ์กฐ๊ฐ์กฐ๊ฐ ๋๋์ด์ ๋ณด๋ด์ค → ๋ฐ๋ ์ชฝ์์ buffer๋ฅผ ํ๋๋ก ๋ชจ์์ ํฉ์ณ์ค์ผํจ(๋ฐฐ์ด์ ๋ค์ด์์ผ๋ฉด concat์ฌ์ฉ)
- ๋ฉ์๋
- from(๋ฌธ์์ด)
- ๋ฌธ์์ด์ ๋ฒํผ๋ก ๋ฐ๊ฟ์ค. length ์์ฑ์ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ์๋ฆฐ๋ค. ๋ฐ์ดํธ ๋จ์
- toString(๋ฒํผ)
- ๋ฒ ํผ๋ฅผ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ์ค. ์ด๋ base64๋ hex๋ฅผ ์ธ์๋ก ๋ฃ์ผ๋ฉด ํด๋น ์ธ์ฝ๋ฉ์ผ๋ก๋ ๋ณํ ๊ฐ๋ฅํฉ๋๋ค.
- concat(๋ฐฐ์ด)
- ๋ฐฐ์ด ์์ ๋ ๋ฒํผ๋ค์ ํ๋๋ก ํฉ์นจ
- alloc(๋ฐ์ดํธ)
- ๋น ๋ฒํผ๋ฅผ ์์ฑ. ๋ฐ์ดํธ๋ฅผ ์ธ์๋ก ๋ฃ์ผ๋ฉด ํด๋น ํฌ๊ธฐ์ ๋ฒํผ๊ฐ ์์ฑ
- from(๋ฌธ์์ด)
- ๋จ์
- ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์
- ์ฉ๋์ด 100MB์ธ ํ์ผ์ด ์์ผ๋ฉด ์ฝ์ ๋ ๋ฉ๋ชจ๋ฆฌ์ 100MB์ ๋ฒํผ๋ฅผ ๋ง๋ค์ด์ผํ๋ค. ์ด ๋, ์๋ฒ๊ฐ์ด ์ฌ๋ฌ๋ช ์ด ์ด์ฉํ๋ ํ๊ฒฝ์์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์
- 100MB ์ฉ๋์ ํ์ผ์ ์ฝ์ ๋๋ ๋ฉ๋ชจ๋ฆฌ 100MB์ ๋ฒํผ๋ฅผ ๋ง๋ค์ด์ผํ๊ณ ์ด ์์ ์ 10๊ฐ๋ง ๋์์ ํด๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ 1GB์ ๋๋ฌ → ๊ทธ๋์ ๋์จ ๊ฒ์ด ์คํธ๋ฆผ !
- ๋์์ด ๋๋ฆผ
- ๋ชจ๋ ๋ด์ฉ์ ๋ฒํผ๋ฅผ ๋ค ์ด ํ์์ผ ๋ค์ ๋์์ผ๋ก ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ ํ์ผ ์ฝ๊ธฐ, ์์ถ, ์ฐ๊ธฐ ๋ฑ์ ์กฐ์์ ํ ๋ ๋งค๋ฒ ์ ์ฒด ์ฉ๋์ ๋ฒํผ๋ก ์ฒ๋ฆฌํด์ผ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ ์ ์์
- ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์
Stream
- Stream์ ํ์ผ์ ์ฝ์ด์ chuck ๋จ์๋ก ๋๋ ์ ์กฐ๊ธ์ฉ ์ง์์ ์ผ๋ก ์ ๋ฌํ๋ ๋ฐฉ์
- readStream์ data(ํ์ผ์ฝ๊ธฐ ์์), end(ํ์ผ ๋ค์ฝ์ผ๋ฉด), error(์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด) ์ด๋ฒคํธ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉ
- ์์ → OTT์์ ์์์ ์ก์ถํ ๋ ์คํธ๋ฆฌ๋ฐํ๋ค๊ณ ํ๋๋ฐ, ์ด๋ ์คํธ๋ฆผ์ด ํ์ผ์ ์ ์กํ๋ ๋ฐฉ์
โญ๏ธ [์ฃผ์] readStream๋ ๋น๋๊ธฐ์ด๊ธฐ ๋๋ฌธ์ ์๋ฌ์ฒ๋ฆฌ ํ์
์ฝ๋์์
// input์ผ๋ก ๋ฐ์ดํฐ ๋ฐ์์ค
if (url === '/message' && method === 'POST') {
const body = [];
// data ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์์ฑ
req.on('data', (chunk) => {
console.log(chunk);
// <Buffer 6d 65 73 73 61 67 65 3d 61 73 64> ์ด๋ฐ์์ผ๋ก ์ถ๋ ฅ
body.push(chunk);
});
return req.on('end', () => {
// ์ ์ญ์์ ์ฌ์ฉ๊ฐ๋ฅํ Buffer ๊ฐ์ฒด ์ฌ์ฉํ์ฌ ์ buffer ์์ฑ
const parseBody = Buffer.concat(body).toString();
// ๋ฒํผ ์์ ์์์ ๋ชจ์ ๋ชจ๋ ์ฒญํฌ ์ถ๊ฐํด์ค(์ด์ฐจํผ ํ์ผ์ด๋ ์ด๋ฐ๊ฑฐ ์๋ค์ด์ค๊ณ ๋ฌธ์์ด ์
๋ ฅํด์ค๊ฑฐ๋๊น toString์ผ๋ก ๋ฐ๊ฟ์ค~~)
console.log(parseBody);
// message=asdf๋ก ์ถ๋ ฅ
const message = parseBody.split('=')[1];
fs.writeFile('message.txt', message, (err) => {
res.statusCode = 302;
res.setHeader('Location', '/');
return res.end();
})
});
}
reference
https://creamereos.github.io/dev/2020/12/04/dev-nodeJS-buffer-stream/
๋ฐ์ํ