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());
});
- readFile은 읽을 파일명과 콜백함수를 매개변수로 받으며, 노드에서의 콜백함수의 매개변수는 err,data순이다.
- toString()을 적용하지 않는다면 결과값은 2진법을 16진법으로 바꾼 값이 출력된다.
const fs = require('fs').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;
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;
});
- 비동기를 유지하면서 await같이 동기적으로 제어할 수 있는 것이 중요함.
- 동기적으로 실행하는 것과는 동시성에서 큰 차이가 있음
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;
}
}