[Node.JS] 기본적인 파일 입출력

진실·2021년 7월 2일
0

1. sync method & async method

1.1 async method

const fs = require('fs');

console.log('시작');

fs.readFile('./readme2.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('./readme2.txt', (err, data)=>{
  if(err){
    throw err;
  }
  console.log('3번', data.toString());
});

console.log('끝');

위 코드의 출력 결과는 아래와 같습니다.

시작
끝
2번 저를 읽어주세요.
3번 저를 여러 번 읽어보세요
1번 저를 여러 번 읽어보세요

1번 2번 3번 순서대로 출력되지 않습니다.

✔  그 이유는 fs.readFile method가 asynchronous method이기 때문입니다.

첫번째 readFile함수는 readme2.txt 읽기를 시작만 하고 다음으로 넘어갑니다. 읽기가 끝난 다음에야 callback을 수행하는 것이죠. 그 다음 readme.txt와 readme2.txt 읽기도 마찬가지입니다.

위 코드를 다시 돌려보면 출력되는 순서가 다를 것입니다. 코드를 돌려볼때마다 파일을 읽는 속도가 조금씩 다르기 때문입니다.

순서대로 실행되게 하려면?

방법은 간단합니다. readFilesync 메서드를 사용하면 됩니다.

1.2 sync method

const fs = require('fs');

console.log('시작');

let data = fs.readFileSync('./readme2.txt');
console.log('1번', data.toString());

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

data = fs.readFileSync('./readme2.txt');
console.log('3번', data.toString());

console.log('끝');

위 코드의 출력 결과는 아래와 같습니다.

시작
1번 저를 여러 번 읽어보세요
2번 저를 읽어주세요.
3번 저를 여러 번 읽어보세요
끝

❕ 순서대로 출력됩니다.
readFileSync 메서드를 사용하니 코드도 훨씬 깔끔해졌습니다.

하지만 동기 메서드는 거의 사용되지 않습니다. 수백개의 파일을 읽는데 하나의 파일을 다 읽어야만 다음 코드로 넘어가는 것은 시간이 너무 오래걸리기 때문입니다.
따라서 비동기 메서드를 사용하는 것이 권장됩니다.

비동기 메서드로 순서대로 출력되게 하려면?

1.3 비동기 메서드로 순서대로 수행

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

console.log('시작');

fs.readFile('./readme2.txt')
.then((data)=>{
  console.log('1번', data.toString());
  return fs.readFile('./readme.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.log(err);
});

위 코드의 실행 결과는 아래와 같습니다.

1번 저를 여러 번 읽어보세요
2번 저를 읽어주세요.
3번 저를 여러 번 읽어보세요
끝

이렇게 하면 readFile이라는 비동기 메서드로도 순서대로 수행할 수 있습니다. readme2.txt를 읽은 후 성공적으로 읽어졌다면, readme2.txt의 내용을 출력하고 readme.txt를 읽습니다. 성공적으로 읽어졌다면 다음 then으로 넘어가 내용을 출력하고 다시 readme2.txt를 읽고 내용을 출력하고 끝을 출력합니다.

❕ promise를 이용해서 비동기 메서드를 순서대로 수행할 수 있습니다

이 포스팅의 예시 코드는 Node.js교과서(조현영, 길벗)에서 발췌했습니다.

profile
반갑습니다.

0개의 댓글