브라우저에서는 일부를 제외하고 파일 시스템 접근이 금지되어 있지만,
노드에서는 fs모듈로 파일 시스템 접근 가능!
const fs = require("fs");
// 파일 읽기
fs.readFile("./hello.txt", "utf-8", (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});
// 파일 쓰기
fs.writeFile("hi.txt", "Hi, world!", (err) => {
if (err) throw err;
console.log("파일에 데이터 쓰기 완료");
});
// 동기적으로 파일 읽기
// 하지만 이건 대량 요청 시 성능 문제가 생김(왜냐면 동기 진행으로 대기가 발생)
let data = fs.readFileSync('./hello.txt');
파일 읽기/쓰기 방식은
1. 버퍼
2. 스트림
방식이 있다.
버퍼링: 데이터를 모아서 한번에 처리함
파일 크기만큼 메모리에 공간을 마련해 둠.
이때 이 메모리에 저장된 자료가 버퍼
버퍼 클래스로 버퍼를 직접 다룰 수 있음.
const buffer = Buffer.from('버퍼');
버퍼 클래스의 인스턴스로 여러 메서드를 활용할 수 있음.
// 버퍼 생성 및 데이터 쓰기
const buffer = Buffer.from("Hello, World!"); // 기본적으로 utf8로 인코딩
console.log(buffer); // <Buffer 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21>
console.log(buffer.toString()); // Hello, World!
copyBuffer = Buffer.alloc(13);
buffer.copy(copyBuffer);
console.log(copyBuffer.toString()); // Hello, World!
buffer.write("Hi, World!");
console.log(buffer.toString()); // Hi, World!ld! (기존 버퍼의 내용이 변경됨, 근데 앞에만 변경돼서 뒤에는 남아있음)
console.log(buffer.length); // 13 (문자 길이가 아니라 버퍼의 바이트 길이)
버퍼의 단점은 해당 파일 크기 만큼의 버퍼를 확보해야 한다는 것.
그래서 버퍼를 조금만 확보하고 데이터를 수시로 처리하는 게 스트림
조금씩 나누는 단위를 청크라고하고, 기본값을 64KB
스트리밍: 데이터를 조금씩 바로바로 처리함.
const fs = require("fs");
// 'input.txt' 파일을 읽기 위한 스트림 생성
const readableStream = fs.createReadStream("hello.txt", {
encoding: "utf8",
highWaterMark: 16,
});
// 데이터를 읽을 준비가 되면 'data' 이벤트가 발생하고, 읽은 데이터(chunk)가 콜백 함수로 전달됩니다.
readableStream.on("data", function (chunk) {
console.log(`Received ${chunk.length} bytes of data.`);
console.log(chunk);
});
// 파일의 끝에 도달하면 'end' 이벤트가 발생합니다.
readableStream.on("end", function () {
console.log("End of file has been reached.");
});
// 에러가 발생하면 'error' 이벤트가 발생합니다.
readableStream.on("error", function (error) {
console.error("Error:", error.message);
});

// 파일 삭제
fs.unlink('./file.txt', (err) => {
if (err) throw err;
console.log('파일이 삭제되었습니다.');
});
// file.txt 파일이 삭제됩니다.
// 디렉토리 생성
fs.mkdir('./new-directory', (err) => {
if (err) throw err;
console.log('디렉토리가 생성되었습니다.');
});
// 'new-directory'라는 이름의 새로운 디렉토리가 생성됩니다.
// 디렉토리 삭제
fs.rmdir('./new-directory', (err) => {
if (err) throw err;
console.log('디렉토리가 삭제되었습니다.');
});

비동기 메서드는 백그라운드에서 스레드 풀을 통해 실행됨.
기본 값은 4.
그래서 4개씩 묶어서 처리하고, 끝나면 다시 백그라운드에 있는 작업을 4개씩 가져와서 처리.
스레드 풀은 직접 컨트롤할 수 없지만, 환경변수로 개수를 조절할 수는 있음.
UV_THREADPOOL_SIZE=개수