Node.js - File System / async,sync

ryan·2022년 5월 7일
0
post-custom-banner

fs (file system)

  • 파일 시스템에 접근하는 모듈
  • 파일/폴더 생성, 삭제, 읽기, 쓰기 가능
  • 웹 브라우저는 제한적이지만 노드는 권한을 가지고 있음.
    • csv excel pdf word 한글을 읽을 수도 있음
const fs = require('fs');

readfile method

fs.readFile('./readme.txt', (err, data) => {
  if (err) {
    throw err;
  }
  console.log(data);
  console.log(data.toString());
  // result <Buffer 48 65 6c 6c 6f 2e 20 77 6f 72 6c 64 2e>
  // result Hello. world.
});
  • readFile은 읽을 파일명과 콜백함수를 매개변수로 받으며, 노드에서의 콜백함수의 매개변수는 err,data순이다.
  • toString()을 적용하지 않는다면 결과값은 2진법을 16진법으로 바꾼 값이 출력된다.
const fs = require('fs').promises; // promises 적용

fs.readFile('./readme.txt')
    .then((data)=>{
      console.log(data);
      console.log(data.toString())
    })
    .catch((err)=>{throw err;});
  • 콜백헬을 방지하기 위해 자체적으로 제공하는 기능인 promises를 이용하거나 util.promises를 이용할 수 있다.

동기 메서드와 비동기 메서드

  • 동기와 비동기 : 백그라운드 작업 완료 확인 여부
  • 블로킹과 논 블로킹 : 함수가 바루 return 되는지 여부
  • 노드에서는 대부분 동기-블로킹 방식과 비동기-논 블로킹 방식임.

동기 메서드

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());
  • node에서의 동기 작업은 말 그대로 순서대로 작업을 실행한다. 서버의 경우, 동기 메서드로 구현을 하면 상당히 비효율적이기 때문에 동기 메서드는 주로 서버가 실행되기 전 서버를 초기화할 때 한 번 실행한다.

비동기 메서드

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());
});
  • 위와 같이 실행했을 때 모두 비동기로 작업되지만 작업이 완료되는 순서를 특정할 수 없다는 단점이 있음.

비동기 메서드 promise / async,await

const fs = require('fs').promises; // promises 적용

fs.readFile('./readme.txt')
  .then((data) => {
    console.log('1번', data.toString());
  })
  .then((data) => {
    console.log('2번', data.toString());
  })
  .then((data) => {
    console.log('3번', data.toString());
  })
  .then((data) => {
    console.log('4번', data.toString());
  })
  .catch((err) => {
    throw err;
  });
// result 1번n\ 2번n\ 3번n\ 4번
  • 비동기를 유지하면서 await같이 동기적으로 제어할 수 있는 것이 중요함.
    • 동기적으로 실행하는 것과는 동시성에서 큰 차이가 있음
// async 적용
async function rf() {
  try {
    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());
  } catch {
    throw err;
  }
}
profile
프론트엔드 개발자
post-custom-banner

0개의 댓글