Server/Node.js

[node.js] File-System(promise, async/await)

thals0 2022. 9. 24. 09:02
728x90

πŸ“Œ file-system

: node의 λͺ¨λ“ˆμ΄λΌ commonJS λ°©μ‹μœΌλ‘œ 뢈러 올 수 있음 

const fs = require('fs');

βœ… readFile

: νŒŒμΌμ„ 읽을 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ†Œλ“œ  

 

νŒŒμΌμ„ μ½λŠ” 것도 μ‹œκ°„μ΄ ν•„μš”ν•œ μž‘μ—…μ΄λ―€λ‘œ -> callback μ‚¬μš©

fs.readFile('νŒŒμΌμœ„μΉ˜','μœ λ‹ˆμ½”λ“œν¬λ§·',callback(err, data) {})

err : 파일 읽기가 잘 μ•ˆλ˜μ—ˆμ„ λ•Œ, error μ½”λ“œ λ°˜ν™˜ 

data: 파일 읽기가 잘 λ˜μ—ˆμ„ λ•Œ, 읽은 data λ°˜ν™˜

const fs = require('fs');
fs.readFile('readme.txt', 'utf-8', (err, data) => {
  if (err) {
    console.log(err);
  } else {
    console.log(data);
  }
});

 

βœ… writeFile

: νŒŒμΌμ„ 읽을 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ†Œλ“œ

fs.writeFile('νŒŒμΌμœ„μΉ˜, data, 'μœ λ‹ˆμ½”λ“œν¬λ§·, callback(err) {})

writeFile은 dataλŠ” μ—†κ³ , μ“°κΈ°κ°€ 잘 μ•ˆλ˜μ—ˆμ„ λ•Œ err λ°˜ν™˜

const fs = require('fs');
const str = '파일 μ“°κΈ°κ°€ μ •μƒμ μœΌλ‘œ λ˜λŠ”μ§€ ν…ŒμŠ€νŠΈ ν•©λ‹ˆλ‹€.';
fs.writeFile('readme.txt', str, 'utf-8', (err) => {
  if (err) {
    console.log(err);
  } else {
    console.log('writefile succeed');
  }
});

 

πŸ“Œ file-system with Promise

  • callback 방식은 μ‚¬μš© 및 μ½”λ“œ 가독성이 λ–¨μ–΄μ§€κΈ° λ•Œλ¬Έμ— FSλŠ” μ• μ΄ˆμ— promiseλ°©μ‹μ˜ κΈ°λŠ₯을 제곡
  • κΈ°μ‘΄ λ©”μ†Œλ“œλͺ… 뒀에 syncλ₯Ό 뢙이면 promise 방식을 μ‚¬μš©ν•˜μ—¬ λ™κΈ°μ μœΌλ‘œ μž‘λ™
  • 단, syncκ°€ 뢙은 λ©”μ†Œλ“œλŠ” 더 이상 callback ν•¨μˆ˜κ°€ ν•„μš” μ—†μœΌλ―€λ‘œ μ•ˆμ¨μ€˜λ„λ¨

πŸ“ 1,2,3,4λ²ˆμ„ μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•˜κΈ° μœ„ν•œ κΈ°μ‘΄ callback 방식 μ½”λ“œ

const fs = require('fs');
fs.readFile('./readme.txt', (err, data) => {
  if (err) {
    throw err;
  }
  console.log('1번', data.toString());
  fs.readFile('./readme.txt', (err, data) => {
    if (err) {
      throw err;
    }
    console.log('2번', data.toString());
    fs.readFile('./readme.txt', (err, data) => {
      if (err) {
        throw err;
      }
      console.log('3번', data.toString());
      fs.readFile('./readme.txt', (err, data) => {
        if (err) {
          throw err;
        }
        console.log('4번', data.toString());
      });
    });
  });
});

 

πŸ“promise λ°©μ‹μœΌλ‘œ κ΅¬ν˜„

const fs = require('fs');

let data = fs.readFileSync('./readme.txt');
console.log('1번', data.toString());
data = fs.readFileSync('./readme.txt');
console.log('2번', data.toString());
data = fs.readFileSync('./readme.txt');
console.log('3번', data.toString());
data = fs.readFileSync('./readme.txt');
console.log('4번', data.toString());

 

πŸ”« ν•˜μ§€λ§Œ, syncκ°€ 뢙은 μ½”λ“œλŠ” μ„œλ²„ μƒμ—μ„œ μž‘λ™ ν•  λ•Œ μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 경우 빈번 

-> fs μ“Έ λ•ŒλŠ” fs.promiseλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©ν•΄μ•Όν•¨ 

fs.promise 슀슀둜 성곡 μ—¬λΆ€λ₯Ό νŒλ‹¨ν•˜μ—¬ resolve, rejectλ₯Ό λ°˜ν™˜

 

πŸ“Œ promise 

promiseλŠ” μΌμ’…μ˜ class μ΄λ―€λ‘œ new μ‚¬μš© 

const promise = new Promise(function(resolve, reject) {});
  • resolve, rejectλΌλŠ” 2개의 λ§€κ°œλ³€μˆ˜λ₯Ό μ½œλ°±ν•¨μˆ˜λ‘œ λ°›μ•„μ„œ μ‚¬μš©
  • promiseκ°€ ν• λ‹Ήλ˜λ©΄ 이 promiseλŠ” resolve λ˜λŠ” reject ν•¨μˆ˜κ°€ callback이 될 λ•Œ κΉŒμ§€ λ¬΄ν•œ λŒ€κΈ°
  • resolve: promiseκ°€ μ •μƒμ μœΌλ‘œ 이행 λ˜μ—ˆμ„ 경우 μ‚¬μš© / then으둜 λ°›μŒ
  • reject: promiseκ°€ μ •μƒμ μœΌλ‘œ μ΄ν–‰λ˜μ§€ μ•Šμ•˜μ„ 경우 μ‚¬μš© / catch둜 λ°›μŒ
  • resolve, reject λŠ” 데이터λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 보낼 수 있음 

resolve, rejectκ°€ μ‚¬μš©λ˜μ§€ μ•ŠμœΌλ©΄ promiseλŠ” ν•΄λ‹Ή 콜백이 λ‚˜μ˜¬ λ•Œ κΉŒμ§€ pending μƒνƒœκ°€ λ˜μ–΄ κΈ°λ‹€λ¦Ό

 

πŸ“ μœ„μ˜ κΈ°λ³Έ μ½”λ“œλ₯Ό fs.promise둜 λ³€ν™˜

const fs = require('fs').promises;
fs.readFile('./readme.txt')
  .then((data) => {
    console.log('1번', data.toString());
    return fs.readFile('./readme.txt');
  })
  .then((data) => {
    console.log('2번', data.toString());
    return fs.readFile('./readme.txt');
  })
  .then((data) => {
    console.log('3번', data.toString());
    return fs.readFile('./readme.txt');
  })
  .then((data) => {
    console.log('4번', data.toString());
  })
  .catch((err) => {
    throw err;
  });

 

πŸ“Œ async/await

function μ•žμ— asyncλ₯Ό 뢙이면 ν•΄λ‹Ή ν•¨μˆ˜λŠ” 항상 Promise λ°˜ν™˜

asyncκ°€ 뢙은 ν•¨μˆ˜μ—μ„œ return을 μ“°λ©΄ μ•„λž˜μ™€ λ™μΌν•œ 역할을 함 

async function f1() {
  return 1;
}
function f2() {
  return Promise.resolve(1);
}

asyncκ°€ 뢙은 ν•¨μˆ˜ λ‚΄λΆ€μ—λŠ” await μ‚¬μš© κ°€λŠ₯ 

awaitλŠ” promiseκ°€ κ²°κ³Ό(resolve, reject)λ₯Ό κ°€μ Έλ‹€ 쀄 λ•Œ κΉŒμ§€ κΈ°λ‹€λ¦Ό

(단, asyncλŠ” ν•¨μˆ˜μ— λΆ™μ—¬μ•Ό ν•˜λ―€λ‘œ λ³„λ„μ˜ ν•¨μˆ˜ 내뢀에 κΈ°λŠ₯을 μ •μ˜ν•˜κ³  ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό μ™ΈλΆ€μ—μ„œ ν•œλ²ˆ μ‚¬μš©ν•΄ μ€˜μ•Όν•¨)

 

πŸ“μ½”λ“œ μ˜ˆμ‹œ

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

async function main() {
  let data = await fs.readFile('./readme.txt');
  console.log('1번', data.toString());
  data = await fs.readFile('./readme.txt');
  console.log('2번', data.toString());
  data = await fs.readFile('./readme.txt');
  console.log('3번', data.toString());
  data = await fs.readFile('./readme.txt');
  console.log('4번', data.toString());
}

main();

 

πŸ“Œ routing

: λ„€νŠΈμ›Œν¬ μƒμ—μ„œ 데이터λ₯Ό 보낼 λ•Œ 졜적의 경둜λ₯Ό μ„ νƒν•˜λŠ” κ³Όμ • 

 

βœ… file-system으둜 DBκ΅¬ν˜„

database.json 파일 생성 ν›„ μ½”λ“œ μž‘μ„±

getPosts() : database.jsonμ—μ„œ 데이터λ₯Ό μ½μ–΄μ„œ λ³€μˆ˜λ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” ν•¨μˆ˜

savePosts(): λ³€κ²½ 사항을 database.json에 μ €μž₯ν•˜λŠ” ν•¨μˆ˜

const fs = require('fs');

async function getPosts() {
  const jsonPosts = await fs.promises.readFile('database.json', 'utf-8');
  return JSON.parse(jsonPosts).posts;
}

async function savePosts(posts) {
  const content = {
    posts,
  };
    return fs.promises.writeFile('database.json’, JSON.stringify(content), 'utf-8');
}

 

 

728x90