File System
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 |