파일 시스템 사용하기

김무연·2023년 12월 12일

Backend

목록 보기
20/49

fs

파일 시스템에 접근하는 모듈

  • 파일/폴더 생성, 삭제, 읽기, 쓰기 가능
  • 웹 브라우저에서는 제한적이었으나 노드는 권한을 가지고 있어 가능!!
  • 파일 읽기 예제
const fs = require('fs');

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

위 단순히 data의 결과만 보면 buffer 01 f4 이런 식으로 나와 있는데 이는 컴퓨터가 읽기 위한 010101같은 데이터이다. 따라서 이걸 우리가 알 수 있게 문자열로 바꾸어 주는 줘야 하니 toString()으로 문자로 변환해준다.

위와 같은 callback 함수를 promise로 변환하려면 fs 자체에서 기능이 있다

const fs = require('fs').promise

처럼 뒤에 .promise를 붙여 주면 바로 prmoise로 쓸 수 있게 된다

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

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

writeFile

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

fs.writeFile('ch05/readme22.txt', '글이 입력됩니다')
  .then(() => {
    return fs.readFile('ch05/readme22.txt')
  })
  .then((data) => {
    console.log(data.toString())
  })
  .catch((err) => {
    throw err;
  })

동기(sync) 메서드와 비동기(async) 메서드

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

fs.readFile 들이 비동기 함수이기 때문에 아래와 같은 코드에서 순서대로 실행되지 않고, 동시에 실행된다

const fs = require('fs');

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

순서에 맞게 호출하려면?

  • 제공해주는 동기함수를 써야한다
  • readFileSync
const fs = require('fs');

let data = fs.readFileSync('./ch05/readme.txt')
console.log('1번', data.toString())
data = fs.readFileSync('./ch05/readme.txt')
console.log('2번', data.toString())
data = fs.readFileSync('./ch05/readme.txt')
console.log('3번', data.toString())
data = fs.readFileSync('./ch05/readme.txt')
console.log('4번', data.toString())
data = fs.readFileSync('./ch05/readme.txt')
  • 위 처럼 하면 동기적, 순차적으로 실행이 된다
  • 사람이 보기는 편하지만, 하나가 끝나고 시작이 되기 때문에 비효율 적이다.
  • 때문에 서버를 셋팅하거나 시작할 때, 동기 작업을 쓰고, 다른 대부분의 작업은 비동기 작업을 하는 것이 좋다
  • 즉 작업은 비동기로 진행이 되면서 순서를 지켜주는 것이 좋다
const fs = require('fs');

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


하지만 위와 같이 진행할 경우 callBack 지옥이 발생. 따라서 promise로 깔끔하게 바꾸어 줌

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

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

더 줄이기 위해 async / await 로 변환

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


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

main()

profile
Notion에 정리된 공부한 글을 옮겨오는 중입니다... (진행중)

0개의 댓글