๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Node.js

Buffer์™€ Stream(Node.js)

by devved 2022. 9. 29.
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ ๋ชฉ์ฐจ

    Buffer vs Stream

    fileSystem์„ ์‚ฌ์šฉํ•ด ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๊ณ  ์ €์žฅํ•˜๋Š” ๋™์ž‘์„ ํ•˜๋ ค๊ณ  ํ• ๋•Œ, ์ฆ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ˜•์‹์ด๋‹ค.

    ๋ฒ„ํผ: ์ผ์ •ํ•œ ํฌ๊ธฐ๋กœ ๋ชจ์•„๋‘๋Š” ๋ฐ์ดํ„ฐ

    • ์ผ์ •ํ•œ ํฌ๊ธฐ๊ฐ€ ๋˜๋ฉด ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌ
    • ๋ฒ„ํผ๋ง: ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ฐฐ ๋•Œ๊นŒ์ง€ ๋ชจ์œผ๋Š” ์ž‘์—…

    ์ŠคํŠธ๋ฆผ: ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„ โžก๏ธ

    • ์ผ์ •ํ•œ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ ์„œ ์—ฌ๋Ÿฌ ๋ฒˆ์— ๊ฑธ์ณ์„œ ์ฒ˜๋ฆฌ
    • ๋ฒ„ํผ(๋˜๋Š” ์ฒญํฌ)์˜ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ
    • ์ŠคํŠธ๋ฆฌ๋ฐ: ์ผ์ •ํ•œ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ์ž‘์—…

     

    Buffer

    buffer๋Š” ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฐ์กฐ๊ฐ ๋‚˜๋‰˜์–ด์„œ ๋ณด๋‚ด์คŒ → ๋ฐ›๋Š” ์ชฝ์—์„œ buffer๋ฅผ ํ•˜๋‚˜๋กœ ๋ชจ์•„์„œ ํ•ฉ์ณ์ค˜์•ผํ•จ(๋ฐฐ์—ด์— ๋“ค์–ด์žˆ์œผ๋ฉด concat์‚ฌ์šฉ)

    • ๋ฉ”์„œ๋“œ
      • from(๋ฌธ์ž์—ด)
        • ๋ฌธ์ž์—ด์„ ๋ฒ„ํผ๋กœ ๋ฐ”๊ฟ”์คŒ. length ์†์„ฑ์€ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ์•Œ๋ฆฐ๋‹ค. ๋ฐ”์ดํŠธ ๋‹จ์œ„
      • toString(๋ฒ„ํผ)
        • ๋ฒ ํผ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ”์คŒ. ์ด๋•Œ base64๋‚˜ hex๋ฅผ ์ธ์ˆ˜๋กœ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ์ธ์ฝ”๋”ฉ์œผ๋กœ๋„ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
      • concat(๋ฐฐ์—ด)
        • ๋ฐฐ์—ด ์•ˆ์— ๋“  ๋ฒ„ํผ๋“ค์„ ํ•˜๋‚˜๋กœ ํ•ฉ์นจ
      • alloc(๋ฐ”์ดํŠธ)
        • ๋นˆ ๋ฒ„ํผ๋ฅผ ์ƒ์„ฑ. ๋ฐ”์ดํŠธ๋ฅผ ์ธ์ˆ˜๋กœ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ํฌ๊ธฐ์˜ ๋ฒ„ํผ๊ฐ€ ์ƒ์„ฑ
    • ๋‹จ์ 
      • ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ
        • ์šฉ๋Ÿ‰์ด 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/

    https://cheony-y.tistory.com/191

    ๋ฐ˜์‘ํ˜•