[Node.js 교과서] 2-10. 파일 시스템
fs (FileSystem)
파일 시스템에 접근하는 모듈
(1) 파일/폴더 생성, 삭제, 읽기, 쓰기 가능
(2) 웹 브라우저에서는 파일 접근이 제한적이었으나 Node JS는 권한을 가지고 있음
(3) 파일 읽기 예제 (결과의 버퍼는 뒤에서 설명함)
const fs = require('fs');
fs.readFile('./read.txt', (err, data) => {
if(err) {
throw err;
}
console.log(data)
console.log(data.toString())
})
//<Buffer ec 9d b4 ed 8c 8c ec 9d bc ec 9d 84 20 ec 9d bd ec 96 b4 ec a3 bc ec 84 b8 ec 9a 94 2e 0d 0a>
//이파일을 읽어주세요.
Promise를 이용할 수 도 있음
const fs2 = require('fs').promises;
fs2.readFile('./read.txt')
.then((data) => {
console.log(data)
console.log(data.toString())
})
.catch((err) => {
throw err;
})
//<Buffer ec 9d b4 ed 8c 8c ec 9d bc ec 9d 84 20 ec 9d bd ec 96 b4 ec a3 bc ec 84 b8 ec 9a 94 2e 0d 0a>
//이파일을 읽어주세요.
글을 작성할 수 도 있음
const fs = require('fs').promises;
fs.writeFile('./writeMe.txt', '글이 입력됩니다.')
.then(() => {
})
.catch((err) => {
throw err;
})
위의 기본 코드에 then을 이용하여 작성 후, 읽게 promise 체이닝도 구성 가능
const fs = require('fs').promises;
fs.writeFile('./writeMe.txt', '글이 입력됩니다.2')
.then(() => {
return fs.readFile('./writeMe.txt')
})
.then((data)=> {
console.log(data.toString())
})
.catch((err) => {
throw err;
})
파일 시스템 - 비동기, 동기
위 코드에서의 파일 읽는 작업은 비동기 이기 때문에 순서대로 실행되어도 결과는 순서대로 받지 않을 수 있음
아래 코드와 같이 1,2,3,4 번 읽기 작업을 순서대로 실행시켜도
const fs = require('fs');
fs.readFile('./read.txt', (err, data) => {
if(err) { throw err;}
console.log('1번', data.toString())
})
fs.readFile('./read.txt', (err, data) => {
if(err) { throw err;}
console.log('2번', data.toString())
})
fs.readFile('./read.txt', (err, data) => {
if(err) { throw err;}
console.log('3번', data.toString())
})
fs.readFile('./read.txt', (err, data) => {
if(err) { throw err;}
console.log('4번', data.toString())
})
아래와 같이 결과는 순서대로 아닐 수 있음
그 이유는 파일 읽기 작업은 백그라운드에서 실행되므로 1,2,3,4 작업이 동시에 실행되어서 먼저 끝나는건 운영체제 OS만 알 수 있음
아래에서는 동기로 파일시스템을 실행하므로
결과는 순서대로 출력
const fs = require('fs');
let data = fs.readFileSync('./read.txt')
console.log('1번' , data.toString())
data = fs.readFileSync('./read.txt')
console.log('2번' , data.toString())
data = fs.readFileSync('./read.txt')
console.log('3번' , data.toString())
data = fs.readFileSync('./read.txt')
console.log('4번' , data.toString())
// 1번 이파일을 읽어주세요.
// 2번 이파일을 읽어주세요.
// 3번 이파일을 읽어주세요.
// 4번 이파일을 읽어주세요.
결론적으로
어플리케이션의 상황을 보고 파일시스템 구현을 동기로 할지 비동기로 할지 결정해야함
하지만 대부분의 상황에서는 비동기-논블로킹이 더 효율적이므로 promise와 then을 이용해서 순서를 맞추어서 설계를 해야
왜냐면 동기-블로킹의 경우 순서대로 실행되면 첫번째 작업을 하는동안에 다른 작업을 위한 코드는 아예 실행조차 안됨
호출한 순간에 다른 작업 못하고 대기하다가 첫 번째 일이 끝나야지만 두번째 작업이 실행될 수 있음
반면 비동기인 경우에는 여러개의 작업을 순차적으로 실행하면 백그라운드로 이 작업들이 넘어가서 병렬로 실행이 되고
끝나는 순서대로 태스크 큐를 거쳐서 call stack으로 작업이 넘어감
그러므로 promise와 then과 같이 비동기 작업 순서를 맞춰주는 작업을 통해서
효율적인 비동기 -논블로킹을 사용하자