File System

기초/Node.js|2021. 9. 22. 21:40

fs(file system)

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

파일 및 폴더의 존재여부 확인부터 생성/삭제/읽기/쓰기가 가능하다.

브라우저에서는 파일 시스템에 접근할 수 없지만 노드에서는 접근 가능하다.

→ 그렇기 때문에 보안상의 이슈를 주의해야 함.

 

readFile

//fs.js
const fs = require("fs");

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

위 코드를 작성하고 실행하면 같은 폴더(./)에 있는 readme.txt를 읽어온다. 

% node fs.js
//console.log(data)의 결과
<Buffer ec a0 80 eb a5 bc 20 ec 9d bd ec 96 
b4 ec a3 bc ec 84 b8 ec 9a 94 ec 98 b7>

//console.log(data.toString())의 결과
저를 읽어주세요옷

<Buffer ... more bytes> 이 부분은 컴퓨터가 다루는 0과 1로 된 데이터를 나타낸다.

사람이 읽을 수 있게 data.toString()을 사용해 주면 된다.

 

프로미스를 지원하게 하고 싶으면?

util.promisify로 해당 함수를 감싸는 방법이 있다.

또는, file system의 경우에는 아래처럼 좀 더 간편하게 만들 수도 있음.

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

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

 

writeFile

아래 코드를 실행하면 실행 파일과 같은 폴더에 writeme.txt라는 파일이 생성되고

그 파일 내에는 "글이 입력돼욧" 이 입력되어 저장된다.

const fs = require("fs").promises;
fs.writeFile("./writeme.txt", "글이 입력돼욧")
  .then(() => {
  })
  .catch((err) => {
    throw err;
  });
  
  //생성한 파일을 바로 읽어올 수도 있다.
const fs = require("fs").promises;
fs.writeFile("./writeme.txt", "글이 입력돼욧")
  .then(() => {
    return fs.readFile("./writeme.txt");
  })
  .then((data) => {
    console.log(data.toString()); //글이 입력돼욧
  })
  .catch((err) => {
    throw err;
  });

 

동기와 비동기

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());
});

//결과
//% node async.js
//2번 저를 읽어주세요옷
//4번 저를 읽어주세요옷
//3번 저를 읽어주세요옷
//1번 저를 읽어주세요옷

위 코드는 실행할 때마다 순서가 달라진다.

정해진 순서대로 실행하고 싶다면 어떻게 해야 할까?

 

1. 동기 방식을 사용한다

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());

단, 이런 방식은 실행할 양이 많을수록 순서대로 진행되어야 하는 작업이 쌓여서 서버에 부담을 준다.

서버가 실행된 이후에는 비동기 방식을 사용하여야 한다.

 

2. 비동기 방식으로 동기 작업 구현

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());
      });
    });
  });
});

 

동기 방식의 코드와는 무슨 차이가 있는가?

동시에 여러 가지를 실행했을 때, 각각이 백그라운드로 넘어가서 동시에 진행된다.

순서대로 동시에 실행되도록 구현할 수 있음!

 

단, 위 방식으로 구현하면... 코드가 많이 번잡해진다.

이럴 때 프로미스를 활용함.↓

const fs = require("fs").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;
  });

참조 : 제로초(zerocho)님 인프런 강의

'기초 > Node.js' 카테고리의 다른 글

예외 처리하기  (0) 2021.09.22
crypto, util  (0) 2021.09.21
os와 path  (0) 2021.09.21