[Node.js] 파일 시스템

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

파일 읽기

1
2
// readme.txt
this is readme.txt
1
2
3
4
5
6
7
8
9
10
// readFile.js
const fs = require('fs');

fs.readFile('./readme.txt', (err, data) => {
if (err) {
throw err;
}
console.log(data); // 버퍼로 출력
console.log(data.toString()); // 문자열로 출력
})
1
2
3
% node readFile.js
<Buffer 74 68 69 73 20 69 73 20 72 65 61 64 6d 65 2e 74 78 74 0d 0a>
this is readme.txt

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

setTimeout 같은 타이머와 process.netTick 외에도 노드는 대부분의 메서드를 비동기 방식으로 처리
특히 fs 모듈이 비동기 메서드를 많이 가지고있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// async.js
const fs = require('fs');

console.log('시작');
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());
});

console.log('끝');
1
2
3
4
5
6
7
8
% node async.js
시작

3번 this is readme.txt

1번 this is readme.txt

2번 this is readme.txt

비동기 메서드들은 백그라운드에 해당 파일을 읽으라고만 요청하고 다음 작업으로 넘어감
따라서 파일 읽기 요청만 세번 보내고 console.log('끝')을 찍음
나중에 읽기가 완료되면 백그라운드가 다시 메인 스레드에 알림을 주고 이때 콜백 함수를 실행

동기와 비동기, 블로킹과 논블로킹
노드에서는 비동기와 동기, 블로킹과 논블로킹이라는 네 용어가 혼용됨

  • 동기와 비동기 : 함수가 바로 return 되는지 여부
  • 블로킹과 논 블로킹 : 백그라운드 작업 완료 여부
    노드에서는 동기-블로킹 방식과 비동기-논블로킹 방식이 대부분
1
2
3
4
5
6
7
8
9
10
11
// sync.js
const fs = require('fs');

console.log('시작');
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());
console.log('끝');
1
2
3
4
5
6
7
8
9
% node sync.js
시작
1번 this is readme.txt

2번 this is readme.txt

3번 this is readme.txt