์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋…ธ๋“œ 2ํŒ€] #5. ๋…ธ๋“œ ๊ธฐ๋Šฅ(2)

24-25/Node.js 2

by getpoorpoo 2024. 11. 8. 13:28

๋ณธ๋ฌธ

728x90

๐ŸŒŸํ‚ค์›Œ๋“œ: ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ, ๋™/๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ, fs๋ฉ”์„œ๋“œ, ์ด๋ฒคํŠธ์ฒ˜๋ฆฌ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, 


1. ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ 

1-1. fs ๋ชจ๋“ˆ

ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“ˆ

→  ํŒŒ์ผ ์ƒ์„ฑ, ์‚ญ์ œ, ์ฝ๊ฑฐ๋‚˜ ์“ฐ๊ธฐ, ํด๋” ์ง€์šฐ๊ธฐ ๊ฐ€๋Šฅ

 

const fs = require('fs');

fs.readFile('./readme.txt', (err, data) => {
  if (err) {
    throw err;
  }
  console.log(data);
  console.log(data.toString());
});

 

ํŒŒ์ผ์„ ์ฝ์€ ํ›„์— ์‹คํ–‰๋  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋„ readFile ๋ฉ”์„œ๋“œ์˜ ์ธ์ˆ˜๋กœ ๊ฐ™์ด ๋„ฃ๋Š”๋‹ค.

์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์—๋Ÿฌ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š”๋‹ค.

ํŒŒ์ผ์„ ์ฝ๋‹ค๊ฐ€ ๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๊ณ , ์ •์ƒ์ ์œผ๋กœ ์ฝ์—ˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ˜์†”์— ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

fs๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝœ๋ฐฑ ํ˜•์‹์˜ ๋ชจ๋“ˆ์ด๋ฏ€๋กœ ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋ถˆํŽธํ•˜์—ฌ fs ๋ชจ๋“ˆ์„ ํ”„๋กœ๋ฏธ์Šค ํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

const fs = require('fs').promises;

fs.readFile('./readme.txt')
  .then((data) => {
    console.log(data);
    console.log(data.toString());
  })
  .catch((err) => {
    console.error(err);
  });

 

 


2. ๋™๊ธฐ, ๋น„๋™๊ธฐ ๋ฉ”์†Œ๋“œ

๋…ธ๋“œ → ๋ณดํ†ต์€ ๋น„๋™๊ธฐ ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉํ•œ๋‹ค. Ex) setTimeout, process.nextTick

fs๋ชจ๋“ˆ → ๋™๊ธฐ ๋ฉ”์†Œ๋“œ

 

2-1. ๋น„๋™๊ธฐ ๋ฉ”์†Œ๋“œ

๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋“ค์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ํ•ด๋‹น ํŒŒ์ผ์„ ์ฝ์œผ๋ผ๊ณ ๋งŒ ์š”์ฒญํ•˜๊ณ  ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ผ ์ฝ๊ธฐ ์š”์ฒญ๋งŒ ์„ธ ๋ฒˆ์„ ๋ณด๋‚ด๊ณ  console.log('๋')์„ ์ฐ๋Š”๋‹ค. ๋‚˜์ค‘์— ์ฝ๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๊ฐ€ ๋‹ค์‹œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์— ์•Œ๋ฆฐ๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๊ทธ์ œ์„œ์•ผ ๋“ฑ๋ก๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์ˆ˜๋ฐฑ ๊ฐœ์˜ I/O ์š”์ฒญ์ด ๋“ค์–ด์™€๋„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•œ๋‹ค. ๊ทธ ํ›„๋กœ๋„ ์–ผ๋งˆ๋“ ์ง€ ์š”์ฒญ์„ ๋” ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋‚˜์ค‘์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ๊ฐ€ ๊ฐ๊ฐ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ์•Œ๋ฆฌ๋ฉด ๊ทธ๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

const fs = require('fs');

console.log('์‹œ์ž‘');
fs.readFile('./readme2.txt', (err, data) => {
  if (err) {
    throw err;
  }
  console.log('1๋ฒˆ', data.toString());
  fs.readFile('./readme2.txt', (err, data) => {
    if (err) {
      throw err;
    }
    console.log('2๋ฒˆ', data.toString());
    fs.readFile('./readme2.txt', (err, data) => {
      if (err) {
        throw err;
      }
      console.log('3๋ฒˆ', data.toString());
      console.log('๋');
    });
  });
});

 

์ด์ „ readFile์˜ ์ฝœ๋ฐฑ์— ๋‹ค์Œ readFile์„ ๋„ฃ๋Š”๋‹ค.

์ˆœ์„œ๊ฐ€ ์–ด๊ธ‹๋‚˜๋Š” ์ผ์€ ์—†๋‹ค.

 

2-2. ๋™๊ธฐ ๋ฉ”์†Œ๋“œ

๋น„๋™๊ธฐ์™€ ๋‹ค๋ฅด๊ฒŒ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์—†๋‹ค.

 ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ: ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์™„๋ฃŒ ํ™•์ธํ•œ๋‹ค.

 ๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น: ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ return๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

๋…ธ๋“œ์—์„œ๋Š” ๋™๊ธฐ-๋ธ”๋กœํ‚น ๋ฐฉ์‹๊ณผ ๋น„๋™๊ธฐ-๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์ด ๋Œ€๋ถ€๋ถ„์ด๋‹ค. ๋™๊ธฐ-๋…ผ๋ธ”๋กœํ‚น์ด๋‚˜ ๋น„๋™๊ธฐ-๋ธ”๋กœํ‚น์€ ์—†๋‹ค๊ณ  ๋ด๋„ ๋œ๋‹ค.

๋™๊ธฐ-๋ธ”๋กœํ‚น ๋ฐฉ์‹์—์„œ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ๊ณ„์† ํ™•์ธํ•˜๋ฉฐ, ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ return๋˜์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ๋๋‚˜์•ผ returnํ•œ๋‹ค. ๋น„๋™๊ธฐ-๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์—์„œ๋Š” ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ return๋˜์–ด ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ๋„˜์–ด๊ฐ€๊ณ , ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์™„๋ฃŒ ์—ฌ๋ถ€๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ๋‚˜์ค‘์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ๊ฐ€ ์•Œ๋ฆผ์„ ์ค„ ๋•Œ ๋น„๋กœ์†Œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

const fs = require('fs').promises;

console.log('์‹œ์ž‘');
fs.readFile('./readme2.txt')
  .then((data) => {
    console.log('1๋ฒˆ', data.toString());
    return fs.readFile('./readme2.txt');
  })
  .then((data) => {
    console.log('2๋ฒˆ', data.toString());
    return fs.readFile('./readme2.txt');
  })
  .then((data) => {
    console.log('3๋ฒˆ', data.toString());
    console.log('๋');
  })
  .catch((err) => {
    console.error(err);
});

toString ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” data๊ฐ€ ๋ฒ„ํผ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 


3. ํŒŒ์ผ ์ฝ๊ธฐ ์“ฐ๊ธฐ

3-1. ๋ฒ„ํผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฒ„ํผ๋ง : ์˜์ƒ์„ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์œผ๋Š” ๋™์ž‘์ด๋‹ค.

 

๋…ธ๋“œ๋Š” ํŒŒ์ผ์„ ์ฝ์„ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์— ํŒŒ์ผ ํฌ๊ธฐ๋งŒํผ ๊ณต๊ฐ„์„ ๋งˆ๋ จํ•ด๋‘๋ฉฐ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ ๋’ค ์‚ฌ์šฉ์ž๊ฐ€ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์ด๋•Œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋กœ ๋ฒ„ํผ์ด๋‹ค.

 

buffer.js

const buffer = Buffer.from('์ €๋ฅผ ๋ฒ„ํผ๋กœ ๋ฐ”๊ฟ”๋ณด์„ธ์š”');
console.log('from():', buffer);
console.log('length:', buffer.length);
console.log('toString():', buffer.toString());

const array = [Buffer.from('๋„์—„ ' ), Buffer.from('๋„์—„ ' ), Buffer.from('๋„์–ด์“ฐ๊ธฐ')];
const buffer2 = Buffer.concat(array);
console.log('concat():', buffer2.toString());

const buffer3 = Buffer.alloc(5);
console.log('alloc():', buffer3);

 

 

- Buffer ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ -

 from(๋ฌธ์ž์—ด): ๋ฌธ์ž์—ด์„ ๋ฒ„ํผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

 concat(๋ฐฐ์—ด): ๋ฐฐ์—ด ์•ˆ์— ๋“  ๋ฒ„ํผ๋“ค์„ ํ•˜๋‚˜๋กœ ํ•ฉ์นœ๋‹ค.

 alloc(๋ฐ”์ดํŠธ): ๋นˆ ๋ฒ„ํผ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋ฐ”์ดํŠธ๋ฅผ ์ธ์ˆ˜๋กœ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ํฌ๊ธฐ์˜ ๋ฒ„ํผ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

 toString(๋ฒ„ํผ): ๋ฒ„ํผ๋ฅผ ๋‹ค์‹œ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ base64๋‚˜ hex๋ฅผ ์ธ์ˆ˜๋กœ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ์ธ์ฝ”๋”ฉ์œผ๋กœ๋„ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋ฌธ์ œ์ )

๋งค๋ฒˆ ์ „์ฒด ์šฉ๋Ÿ‰์„ ๋ฒ„ํผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

 

3-2. ์ŠคํŠธ๋ฆผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์ŠคํŠธ๋ฆฌ๋ฐ :  ๋ฐฉ์†ก์ธ์˜ ์ปดํ“จํ„ฐ์—์„œ ์‹œ์ฒญ์ž์˜ ์ปดํ“จํ„ฐ๋กœ ์˜์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ธˆ์”ฉ ์ „์†กํ•˜๋Š” ๋™์ž‘์ด๋‹ค.

์ฆ‰, ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“ค๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ์— ๊ฑธ์ณ ๋‚˜๋ˆ  ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

- ํŒŒ์ผ์„ ์ฝ๋Š” ์ŠคํŠธ๋ฆผ ๋ฉ”์„œ๋“œ: createReadStream

 

const fs = require('fs');

const readStream = fs.createReadStream('./readme3.txt', { highWaterMark: 16 });
const data = [];

readStream.on('data', (chunk) => {
  data.push(chunk);
  console.log('data :', chunk, chunk.length);
});

readStream.on('end', () => {
  console.log('end :', Buffer.concat(data).toString());
});

readStream.on('error', (err) => {
  console.log('error :', err);
});

 

1. createReadStream์œผ๋กœ ์ฝ๊ธฐ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ ๋‹ค.

2. ์ธ์ˆ˜๋Š” ์˜ต์…˜ ๊ฐ์ฒด์ธ๋ฐ, highWaterMark๋ผ๋Š” ์˜ต์…˜์ด ๋ฒ„ํผ์˜ ํฌ๊ธฐ(๋ฐ”์ดํŠธ ๋‹จ์œ„)๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 64KB์ด์ง€๋งŒ, ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜๋ˆ ์„œ ๋ณด๋‚ด๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด 16B๋กœ ๋‚ฎ์ท„๋‹ค.

3. readStream์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•œ๋‹ค. -> data, end, error ์ด๋ฒคํŠธ

4. ์—๋Ÿฌ ๋ฐœ์ƒ => error ์ด๋ฒคํŠธ ํ˜ธ์ถœ, ํŒŒ์ผ ์ฝ๊ธฐ ์‹œ์ž‘ => data ์ด๋ฒคํŠธ, ํŒŒ์ผ ๋‹ค ์ฝ์œผ๋ฉด => end ์ด๋ฒคํŠธ

 

โ—ˆ ๋” ๋งŽ์€ ๋ฉ”์†Œ๋“œ๋Š” ์ฑ… ์ฐธ๊ณ ..


4. ๊ธฐํƒ€ fs ๋ฉ”์†Œ๋“œ

fs : ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์กฐ์ž‘ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

const fs = require('fs').promises;
const constants = require('fs').constants;

fs.access('./folder', constants.F_OK | constants.W_OK | constants.R_OK)
  .then(() => {
    return Promise.reject('์ด๋ฏธ ํด๋” ์žˆ์Œ');
  })
  .catch((err) => {
    if (err.code === 'ENOENT') {
      console.log('ํด๋” ์—†์Œ');
      return fs.mkdir('./folder');
    }
    return Promise.reject(err);
  })
  .then(() => {
    console.log('ํด๋” ๋งŒ๋“ค๊ธฐ ์„ฑ๊ณต');
    return fs.open('./folder/file.js', 'w');
  })
  .then((fd) => {
    console.log('๋นˆ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ ์„ฑ๊ณต', fd);
    return fs.rename('./folder/file.js', './folder/newfile.js');
  })
  .then(() => {
    console.log('์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ์„ฑ๊ณต');
  })
  .catch((err) => {
    console.error(err);
});

 

 

- 4๊ฐ€์ง€ ๋น„๋™๊ธฐ ๋ฉ”์†Œ๋“œ -

 fs.access(๊ฒฝ๋กœ, ์˜ต์…˜, ์ฝœ๋ฐฑ): ํด๋”๋‚˜ ํŒŒ์ผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ƒ์ˆ˜๋“ค(constants๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค)์„ ๋„ฃ์—ˆ๋‹ค. 

* F_OK๋Š” ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€, R_OK๋Š” ์ฝ๊ธฐ ๊ถŒํ•œ ์—ฌ๋ถ€, W_OK๋Š” ์“ฐ๊ธฐ ๊ถŒํ•œ ์—ฌ๋ถ€, ํŒŒ์ผ/ํด๋”๋‚˜ ๊ถŒํ•œ์ด ์—†๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ,  ์—๋Ÿฌ ์ฝ”๋“œ๋Š” ENOENT์ด๋‹ค.

 fs.mkdir(๊ฒฝ๋กœ, ์ฝœ๋ฐฑ): ํด๋”๋ฅผ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด๋ฏธ ํด๋”๊ฐ€ ์žˆ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋จผ์ € access ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ™•์ธํ•œ๋‹ค.

 fs.open(๊ฒฝ๋กœ, ์˜ต์…˜, ์ฝœ๋ฐฑ): ํŒŒ์ผ์˜ ์•„์ด๋””(fd ๋ณ€์ˆ˜)๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ๋‹ค. ํŒŒ์ผ์ด ์—†๋‹ค๋ฉด ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋’ค ๊ทธ ์•„์ด๋””๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ฐ€์ ธ์˜จ ์•„์ด๋””๋ฅผ ์‚ฌ์šฉํ•ด fs.read ๋˜๋Š” fs.write๋กœ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์–ด๋–ค ๋™์ž‘์„ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์“ฐ๋ ค๋ฉด w, ์ฝ์œผ๋ ค๋ฉด r, ๊ธฐ์กด ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด a์ด๋‹ค. ์•ž์˜ ์˜ˆ์ œ์—์„œ๋Š” w๋ฅผ ํ–ˆ์œผ๋ฏ€๋กœ ํŒŒ์ผ์ด ์—†์„ ๋•Œ ์ƒˆ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. r์ด์—ˆ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 fs.rename(๊ธฐ์กด ๊ฒฝ๋กœ, ์ƒˆ ๊ฒฝ๋กœ, ์ฝœ๋ฐฑ): ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ๊ธฐ์กด ํŒŒ์ผ ์œ„์น˜์™€ ์ƒˆ๋กœ์šด ํŒŒ์ผ ์œ„์น˜๋ฅผ ์ ์œผ๋ฉด ๋œ๋‹ค. ๊ผญ ๊ฐ™์€ ํด๋”๋ฅผ ์ง€์ •ํ•  ํ•„์š”๋Š” ์—†์œผ๋ฏ€๋กœ ์ž˜๋ผ๋‚ด๊ธฐ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 


 

5. ์Šค๋ ˆ๋“œ ํ’€

 fs ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•ด๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•œ๋‹ค. → ์Šค๋ ˆ๋“œ ํ’€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์Šค๋ ˆ๋“œ ํ’€ : ์ง์ ‘ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์—†์ง€๋งŒ, ๊ฐœ์ˆ˜๋Š” ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋™์‹œ์— ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ :  crypto, zlib, dns.lookup ๋“ฑ์ด ์žˆ๋‹ค.

์ฆ‰, ์Šค๋ ˆ๋“œ ํ’€ : ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. 


6. ์ด๋ฒคํŠธ

 on(์ด๋ฒคํŠธ๋ช…, ์ฝœ๋ฐฑ): ์ด๋ฒคํŠธ ์ด๋ฆ„๊ณผ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์˜ ์ฝœ๋ฐฑ์„ ์—ฐ๊ฒฐํ•œ๋‹ค. event2์ฒ˜๋Ÿผ ์ด๋ฒคํŠธ ํ•˜๋‚˜์— ์ด๋ฒคํŠธ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋‹ฌ์•„์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

 addListener(์ด๋ฒคํŠธ๋ช…, ์ฝœ๋ฐฑ): on๊ณผ ๊ธฐ๋Šฅ์ด ๊ฐ™๋‹ค.

 emit(์ด๋ฒคํŠธ๋ช…): ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด๋ฒคํŠธ ์ด๋ฆ„์„ ์ธ์ˆ˜๋กœ ๋„ฃ์œผ๋ฉด ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•ด๋’€๋˜ ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋œ๋‹ค.

 once(์ด๋ฒคํŠธ๋ช…, ์ฝœ๋ฐฑ): ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ์ด๋ฒคํŠธ์ด๋‹ค. myEvent.emit('event3')์„ ๋‘ ๋ฒˆ ์—ฐ์† ํ˜ธ์ถœํ–ˆ์ง€๋งŒ ์ฝœ๋ฐฑ์ด ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค.

 removeAllListeners(์ด๋ฒคํŠธ๋ช…): ์ด๋ฒคํŠธ์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. event4๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ–ˆ์œผ๋ฏ€๋กœ event4์˜ ์ฝœ๋ฐฑ์€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

 removeListener(์ด๋ฒคํŠธ๋ช…, ๋ฆฌ์Šค๋„ˆ): ์ด๋ฒคํŠธ์— ์—ฐ๊ฒฐ๋œ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•œ๋‹ค. ์—ญ์‹œ event5์˜ ์ฝœ๋ฐฑ๋„ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค. → ๋ฆฌ์Šค๋„ˆ๋ฅด ๊ผญ ๋„ฃ์–ด์•ผํ•œ๋‹ค.

 off(์ด๋ฒคํŠธ๋ช…, ์ฝœ๋ฐฑ): ๋…ธ๋“œ 10 ๋ฒ„์ „์—์„œ ์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ๋กœ, removeListener์™€ ๊ธฐ๋Šฅ์ด ๊ฐ™๋‹ค.

 listenerCount(์ด๋ฒคํŠธ๋ช…): ํ˜„์žฌ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋ช‡ ๊ฐœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 


 

7. ์˜ˆ์™ธ์ฒ˜๋ฆฌ

7-1. try/catch ๋ฌธ

setInterval(() => {
  console.log('์‹œ์ž‘');
  try {
    throw new Error('์„œ๋ฒ„๋ฅผ ๊ณ ์žฅ๋‚ด์ฃผ๋งˆ!');
  } catch (err) {
    console.error(err);
  }
}, 1000);

 

* ๋” ๋งŽ์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ์ฑ… ์ฐธ๊ณ ..

 


Quiz

1.  ๋™๊ธฐ, ๋น„๋™๊ธฐ ์ฝ”๋“œ์—์„œ toString์„ ์“ฐ๋Š” ์ด์œ ๋Š” data๊ฐ€ (  ) ๋•Œ๋ฌธ์ด๋‹ค.

2.  ํŒŒ์ผ์„ ์ฝ๋Š” ์ŠคํŠธ๋ฆผ ๋ฉ”์„œ๋“œ๋Š”? 

3.  ๋ณดํ†ต ๋…ธ๋“œ๋Š” ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

4.  ๋น„๋™๊ธฐ ๋ฉ”์†Œ๋“œ ์ค‘ ํด๋” ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ๋Š”?

5.  fs ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•ด๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡ ๋•Œ๋ฌธ์ธ๊ฐ€?

6.  ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•  ๋•Œ ๊ตฌ๋ฌธ์€?

7.  ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“ˆ์€?

 

Programming Quiz

8. createWriteStream์œผ๋กœ ์“ฐ๊ธฐ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค์–ด๋ณด์‹œ์˜ค.

 

9. ๋น„๋™๊ธฐ ๋ฐฉ์‹ ์ฝ”๋“œ๋ฅผ ์•Œ๋งž๊ฒŒ ์ฑ„์šฐ์‹œ์˜ค.

const fs = require('fs');
//readme2.txtํŒŒ์ผ๋กœ ์ฝ์–ด์˜ค์‹œ์˜ค.
console.log('์‹œ์ž‘');

  console.log('1๋ฒˆ', data.toString());
 
    console.log('2๋ฒˆ', );
   
      console.log('3๋ฒˆ', );
      console.log('๋');
    });
  });
});

 

 


Answer

1. ๋ฒ„ํผ 

2. createReadStream

3. ๋น„๋™๊ธฐ ๋ฉ”์†Œ๋“œ

4. fs.mkdir

5. ์Šค๋ ˆ๋“œ ํ’€

6. try/catch ๋ฌธ

7. fs๋ชจ๋“ˆ

 

8.

const fs = require('fs');

const writeStream = fs.createWriteStream('./writeme2.txt');
writeStream.on('finish', () => {
  console.log('ํŒŒ์ผ ์“ฐ๊ธฐ ์™„๋ฃŒ');
});

writeStream.write('์ด ๊ธ€์„ ์”๋‹ˆ๋‹ค.
');
writeStream.write('ํ•œ ๋ฒˆ ๋” ์”๋‹ˆ๋‹ค.');
writeStream.end();

 

 

9.

const fs = require('fs');

console.log('์‹œ์ž‘');
fs.readFile('./readme2.txt', (err, data) => {
  if (err) {
    throw err;
  }
  console.log('1๋ฒˆ', data.toString());
  fs.readFile('./readme2.txt', (err, data) => {
    if (err) {
      throw err;
    }
    console.log('2๋ฒˆ', data.toString());
    fs.readFile('./readme2.txt', (err, data) => {
      if (err) {
        throw err;
      }
      console.log('3๋ฒˆ', data.toString());
      console.log('๋');
    });
  });
});

 

 


์ถœ์ฒ˜) ์กฐํ˜„์ •, ใ€ŒNode.js ๊ต๊ณผ์„œ ๊ฐœ์ • 3ํŒใ€, ๊ธธ๋ฒ—(2022), 3์žฅ ๋…ธ๋“œ ๊ธฐ๋Šฅ

 

 

Corner node.js 2ํŒ€

Editor : Eunki



728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ