[Node.js] fs module / path / __dirname / ๊ทธ๋ฆฌ๊ณ  Stream ๐Ÿ’ฏ๏ธ

jungeundelilahLEEยท2020๋…„ 12์›” 17์ผ
2

Node.js

๋ชฉ๋ก ๋ณด๊ธฐ
5/27
post-custom-banner

๐Ÿ’ฏ๏ธ ์ž์„ธํ•œ promise๋Š” ์—ฌ๊ธฐ ๐Ÿ‘‰๏ธPromise ๋ฅผ ์ฐธ๊ณ ํ•˜์ž!

fs ๐Ÿ’ฏ๏ธ

const fs = require("fs");

fs.readFile("./readme.txt", (err, data) => {
    if (err) {
        throw err;
    } 
    console.log(data)   // <Buffer eb 82 98 eb a5 bc 20 ec 9d bd ec 96 b4 eb 9d bc>
    // readFile์˜ ๊ฒฐ๊ณผ๋ฌผ์€ ๋ฒ„ํผ๋ผ๋Š” ํ˜•์‹์œผ๋กœ ์ œ๊ณต๋จ (*๋ฒ„ํผ: ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ)
    console.log(data.toString())  // ๋‚˜๋ฅผ ์ฝ์–ด๋ผ
} )

fs.readFile (path, [option], callback)

fs.readFile('/etc/passwd', 'utf8', ( (err, data) > { } ) );
// err๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด, err -> null์ด ๋œ๋‹ค.
// data์— ๋ฌธ์ž์—ด, Buffer ํ˜•ํƒœ์˜ ๊ฐ์ฒด๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค. (data๋Š” ํŒŒ์ผ์˜ ๋‚ด์šฉ)
  • path : ํŒŒ์ผ ์ด๋ฆ„์„ ์ธ์ž๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ์Œ

    • string / Buffer / URL / integer / ์ด 4๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ์Œ but, ์ฃผ๋กœ, string type์œผ๋กœ ๋„˜๊น€
  • option : ๋ง๊ทธ๋Œ€๋กœ ์˜ต์…˜

    • object / string / 2๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ์Œ
    • ์ธ์ฝ”๋”ฉ์ด ํŠน์ •๋˜์ง€ ์•Š์œผ๋ฉด, raw buffer๊ฐ€ ๋ฆฌํ„ด๋จ
    • string type์œผ๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ, ์ธ์ฝ”๋”ฉ์„ ๋„˜๊น€ ("utf8")
  • callback : ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋„˜๊น€

    • function / ํŒŒ์ผ์„ ์ฝ๊ณ  ๋‚œ ๋’ค, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜

    • 2 ๊ฐ€์ง€ ์ธ์ž

      • err : ์—๋Ÿฌ (๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด null)
      • data : ํŒŒ์ผ์˜ ๋‚ด์šฉ (๋ฌธ์ž์—ด์ด๋‚˜ buffer๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์ „๋‹ฌ๋จ)


about Buffer/Stream (์ฐธ๊ณ )

  • ๋ฒ„ํผ : ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ (์˜ˆ, ๋ฌผ๋ ˆ๋ฐฉ์•„๊ฐ€ ํ˜๋ ค๋ณด๋‚ด์ฃผ๋Š” ๋ฌผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฌผ์„ ๋ฐ›์•„๋†“๋Š” ์–‘๋™์ดโžก๏ธ ๊ทผ๋ฐ ์ด๊ฒƒ์€ ์กฐ๊ทธ๋งˆํ•œ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด(arr)์ผ ์ˆ˜๋„ or ์ŠคํŠธ๋ง(str)์ผ ์ˆ˜๋„)
  • ์ฒญํฌ : ๋‚˜๋ˆ ์ง„ ์กฐ๊ฐ๋“ค / (์˜ˆ, ๋ฌผ๋ ˆ๋ฐฉ์•„ ์นธ์— ๋‹ด๊ธด ๋ฌผ)
  • ์ŠคํŠธ๋ฆผ
    • ์–ด๋–ค ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• / (์˜ˆ, ๋ฌผ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ)
    • ๋ฒ„ํผ๋ฅผ ์ชผ๊ฐœ์„œ ์—ฌ๋Ÿฌ๋ฒˆ์— ๋‚˜๋ˆ  ๋ณด๋‚ด๋Š” ๊ฒƒ
    • ๋งค์šฐ ์ถ”์ƒ์ ์ด๋ผ, ์–ด๋””์„œ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ํ๋ฅธ๋‹ค๋ฉด ์ŠคํŠธ๋ฆผ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค
    • (์• ์ดˆ์—, ์–ด๋–ค ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด๋ผ๋„ ๊ด€๋ฆฌํ•  ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ)
    • ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์— ๋”ฐ๋ผ
      • readable : ์–ด๋”˜๊ฐ€ ์ €์žฅ๋œ ํŒŒ์ผ์—์„œ โžก๏ธ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ์˜ ํ๋ฆ„ / ์ฆ‰, ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ / (์†Œ์œ„, 'ํŒŒ์ผ์„ ์ฝ์–ด์˜จ๋‹ค')
      • writable : ๋ฐ์ดํ„ฐ๋ฅผ โžก๏ธ ํŒŒ์ผ์— ์ €์žฅํ•  ๋•Œ์˜ ํ๋ฆ„ / ์ฆ‰, (์–ด๋– ํ•œ ํŒŒ์ผ์—) ์ €์žฅ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์นญ / (์†Œ์œ„, 'ํ•˜๋“œ๋””์Šคํฌ์— ๋ฎ์–ด์“ด๋‹ค, ํŒŒ์ผ์„ ์“ด๋‹ค')
  • ์ด๋Ÿฌํ•œ ์ŠคํŠธ๋ฆผ์€ ์ธํ„ฐ๋„ท์—์„œ ์ •๋ณด๋ฅผ ์š”์ฒญํ•  ๋•Œ๋„ ์‚ฌ์šฉ๋œ๋‹ค
    (ํŒŒ์ผ-๋ฐ์ดํ„ฐ vs ์ธํ„ฐ๋„ท-์ •๋ณด ๋Š” ์ƒํ™ฉ์ด ์กฐ๊ธˆ ๋‹ค๋ฆ„ โžก๏ธ ์ปดํ“จํ„ฐ์—์„œ ์ŠคํŠธ๋ฆผ์€ ํญํฌ์ฒ˜๋Ÿผ ์—ฐ์†์ ์œผ๋กœ ํ˜๋Ÿฌ๊ฐ€์ง€๋งŒ, ์ธํ„ฐ๋„ท์€ ๊ทธ๋ ‡์ง€ ์•Š์Œ)
    ๐Ÿ‘‰๏ธ ๋ฌผ๋ ˆ๋ฐฉ์•„ ๋น„์œ 
    : ๋ฌผ๋ ˆ๋ฐฉ์•„ ์œ„๋กœ ๋ฌผ์ด ์—ฐ์†์ ์œผ๋กœ ํ˜๋Ÿฌ๋“ค์–ด์˜จ๋‹ค๋ฉด ๋ฌผ๋ ˆ๋ฐฉ์•„๋Š” ๊ฐ๊ฐ์˜ ์นธ์— ๋ฌผ์„ ๋‹ด์•„ ์•„๋ž˜์— ๋ถ€๋ถ„๋ถ€๋ถ„ ํ˜๋ ค๋ณด๋ƒ…๋‹ˆ๋‹ค.
    ์ด๋•Œ ๋ฌผ๋ ˆ๋ฐฉ์•„ ์นธ์— ๋‹ด๊ธด ๋ฌผ์„ ์กฐ๊ฐ-์ฒญํฌ๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
    ์ดํ›„ ๋ฌผ๋ ˆ๋ฐฉ์•„๊ฐ€ ๋Œ์•„๊ฐ€๋ฉด ์นธ์— ์ €์žฅ๋œ ๋ฌผ์„ ํ˜๋ ค๋ณด๋ƒ…๋‹ˆ๋‹ค.
    ์ด๋•Œ ๋ฌผ๋ ˆ๋ฐฉ์•„๊ฐ€ ํ˜๋ ค๋ณด๋‚ด์ฃผ๋Š” ๋ฌผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ๋•Œ๊ทธ๋•Œ ์–‘๋™์ด๋กœ ๋ฌผ์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์–‘๋™์ด๋Š” ๋ฒ„ํผ๋ผ๋Š”, (๊ฐ™์€) ์กฐ๊ทธ๋งŒ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์ผ์ˆ˜๋„ ์žˆ๊ณ , ์ŠคํŠธ๋ง์ผ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!
    ์ด๋Ÿฐ ๋ฌผ-์ฒญํฌ ๋ฅผ ์กฐ๊ธˆ์”ฉ ๋ฐ›์•„์™€์„œ ๋‚˜์ค‘์— ์ทจํ•ฉํ•œ๋‹ค๋ฉด ์˜จ์ „ํ•œ ๋ฌผ-๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ด๋Ÿฐ ๋ฌผ์„ ์ „๋‹ฌํ•˜๋Š”๊ฒƒ๋„ ์ŠคํŠธ๋ฆผ์ด๋ผ๊ณ  ํ–ˆ๋˜๊ฒƒ์„ ๋‹ค์‹œํ•œ๋ฒˆ ๊ธฐ์–ตํ•ด ์ฃผ์„ธ์š”.
    ๋งŒ์•ฝ ๋ฌผ์„ ์ „๋‹ฌํ•˜๋Š”๋ฐ ๋„์ค‘์— ๋ฌผ์˜ ์–‘์ด ์ ๊ฒŒ ์˜ค๊ฑฐ๋‚˜, ๋ชจ๋“  ์ „์†ก์ด ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์•Œ๋ ค์ค˜์•ผ ํ• ๊นŒ์š”?
    ์ •๋‹ต์€ ์ด๋ฒคํŠธ๋ผ๋Š” ๋ฒจ์„ ์šธ๋ ค ์•Œ๋ ค์ค„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋งŒ์•ฝ ์ „์†ก์ด ์ „๋ถ€ ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ์ค‘๊ฐ„์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด ์ŠคํŠธ๋ฆผ์€ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ด๋Ÿฐ ์—๋Ÿฌ ํ˜น์€ ์ „์†ก์™„๋ฃŒ ์ด๋ฒคํŠธ์— ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    ์ „์†ก ๋„์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด errorHandler ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ , ๋ชจ๋“  ์ „์†ก์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ๋ผ๋ฉด endHandler ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    ์ŠคํŠธ๋ฆผ์ด error, end ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
    ์ฆ‰ EventEmitter(์ด๋ฒคํŠธ์ด๋ฏธํ„ฐ)๋Š” ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค ์ด๋ผ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// like below
req.on('error', errorHandler()=>{})
req.on('end', endHandelr()=>{})
  • ํŒŒ์ดํ”„ : (์ŠคํŠธ๋ฆผ๋ผ๋ฆฌ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ) / ์–ด๋–ค ๊ฒƒ์˜ ์ถœ๋ ฅ์„ โžก๏ธ ๋‹ค๋ฅธ ๊ฒƒ์˜ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” '์ผ์ข…์˜ ๋นจ๋Œ€' / ์ธํ„ฐ๋„ท ์š”์ฒญ์œผ๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ โžก๏ธ ์ž…๋ ฅ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ / (์˜ˆ, ์„œ๋ฒ„๊ฐ€ ์ธํ„ฐ๋„ท์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ โžก๏ธ ๋‚˜์˜ ์ฝ”๋“œ๊ฐ€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„์„œ ์‚ฌ์šฉ!ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์›๋ฆฌ)

path ๐Ÿ’ฏ๏ธ

path.join(...paths)


__filename, __dirname ๐Ÿ’ฏ๏ธ

  • node์—์„œ๋Š” ๋ชจ๋“ˆ๋กœ ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ๊ฐœ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ, ํ˜„์žฌ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ž˜ ํŒŒ์•…ํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ
  • __filename, __dirname์€ ์‹คํ–‰์‹œ, ํ˜„์žฌ ํŒŒ์ผ๋ช…, ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝ

__filename: __filename ์€ file๋ช…์„ ํฌํ•จํ•œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ /

__dirname : __dirname ์€ file๋ช…์„ ์ œ์™ธํ•œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ / ํ˜„์žฌ ๋ชจ๋“ˆ์˜ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„ ( =path.dirname(__filename) )


JSON.parse() : JSON๋ฌธ์ž์—ด์„ ํŒŒ์‹ฑํ•ด์„œ JS ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
JSON.stringfy : JS ๊ฐ์ฒด๋ฅผ JSON๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜


์ถœ์ฒ˜ : https://p-iknow.netlify.app/node-js/path-moudle/๐Ÿ’š๏ธ

profile
delilah's journey
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€