파일 시스템(fs 모듈)

ClassBinu·2024년 4월 4일

Node.js 교과서

목록 보기
5/19

fs모듈

브라우저에서는 일부를 제외하고 파일 시스템 접근이 금지되어 있지만,
노드에서는 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 메서드

// 파일 삭제
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=개수

0개의 댓글