Node.js 인터뷰 질문 13

질문: 파일 시스템(fs) 모듈의 용도를 설명해주세요.

답변:

파일 시스템(fs) 모듈은 Node.js의 핵심 모듈 중 하나로, 파일 시스템과 상호 작용할 수 있는 API를 제공합니다. 이 모듈을 사용하면 파일 읽기/쓰기, 디렉토리 생성/삭제, 파일 권한 변경 등 파일 시스템 관련 작업을 수행할 수 있습니다.

fs 모듈의 주요 기능

1. 파일 읽기

동기식 읽기:

const fs = require("fs");

try {
  // 파일 전체 내용을 한 번에 읽기
  const data = fs.readFileSync("file.txt", "utf8");
  console.log(data);
} catch (err) {
  console.error("파일 읽기 오류:", err);
}

비동기식 읽기:

const fs = require("fs");

// 콜백 함수를 사용한 비동기 읽기
fs.readFile("file.txt", "utf8", (err, data) => {
  if (err) {
    console.error("파일 읽기 오류:", err);
    return;
  }
  console.log(data);
});

프로미스 기반 읽기 (Node.js 10 이상):

const fs = require("fs").promises;

fs.readFile("file.txt", "utf8")
  .then((data) => console.log(data))
  .catch((err) => console.error("파일 읽기 오류:", err));

스트림을 사용한 읽기:

const fs = require("fs");

const readStream = fs.createReadStream("largefile.txt", { encoding: "utf8" });
readStream.on("data", (chunk) => {
  console.log(`Received ${chunk.length} bytes of data.`);
});
readStream.on("end", () => {
  console.log("파일 읽기 완료");
});
readStream.on("error", (err) => {
  console.error("파일 읽기 오류:", err);
});

2. 파일 쓰기

동기식 쓰기:

const fs = require("fs");

try {
  fs.writeFileSync("output.txt", "안녕하세요!", "utf8");
  console.log("파일 쓰기 완료");
} catch (err) {
  console.error("파일 쓰기 오류:", err);
}

비동기식 쓰기:

const fs = require("fs");

fs.writeFile("output.txt", "안녕하세요!", "utf8", (err) => {
  if (err) {
    console.error("파일 쓰기 오류:", err);
    return;
  }
  console.log("파일 쓰기 완료");
});

파일 추가하기:

const fs = require("fs");

fs.appendFile("log.txt", "새로운 로그 항목\n", (err) => {
  if (err) {
    console.error("파일 추가 오류:", err);
    return;
  }
  console.log("로그 항목 추가 완료");
});

스트림을 사용한 쓰기:

const fs = require("fs");

const writeStream = fs.createWriteStream("output.txt");
writeStream.write("첫 번째 줄\n");
writeStream.write("두 번째 줄\n");
writeStream.end();

writeStream.on("finish", () => {
  console.log("파일 쓰기 완료");
});
writeStream.on("error", (err) => {
  console.error("파일 쓰기 오류:", err);
});

3. 디렉토리 작업

디렉토리 생성:

const fs = require("fs");

// 단일 디렉토리 생성
fs.mkdir("new-folder", (err) => {
  if (err) {
    console.error("디렉토리 생성 오류:", err);
    return;
  }
  console.log("디렉토리 생성 완료");
});

// 중첩 디렉토리 생성 (재귀적)
fs.mkdir("parent/child/grandchild", { recursive: true }, (err) => {
  if (err) {
    console.error("중첩 디렉토리 생성 오류:", err);
    return;
  }
  console.log("중첩 디렉토리 생성 완료");
});

디렉토리 내용 읽기:

const fs = require("fs");

fs.readdir("folder", (err, files) => {
  if (err) {
    console.error("디렉토리 읽기 오류:", err);
    return;
  }
  console.log("디렉토리 내용:", files);
});

4. 파일/디렉토리 정보 및 관리

파일 정보 얻기:

const fs = require("fs");

fs.stat("file.txt", (err, stats) => {
  if (err) {
    console.error("파일 정보 얻기 오류:", err);
    return;
  }
  console.log("파일 크기:", stats.size);
  console.log("파일 생성 시간:", stats.birthtime);
  console.log("마지막 수정 시간:", stats.mtime);
  console.log("파일인가?", stats.isFile());
  console.log("디렉토리인가?", stats.isDirectory());
});

파일/디렉토리 이름 변경:

const fs = require("fs");

fs.rename("old-name.txt", "new-name.txt", (err) => {
  if (err) {
    console.error("이름 변경 오류:", err);
    return;
  }
  console.log("이름 변경 완료");
});

파일/디렉토리 삭제:

const fs = require("fs");

// 파일 삭제
fs.unlink("file-to-delete.txt", (err) => {
  if (err) {
    console.error("파일 삭제 오류:", err);
    return;
  }
  console.log("파일 삭제 완료");
});

// 디렉토리 삭제 (비어 있을 때만)
fs.rmdir("empty-folder", (err) => {
  if (err) {
    console.error("디렉토리 삭제 오류:", err);
    return;
  }
  console.log("디렉토리 삭제 완료");
});

// 디렉토리와 내용 모두 삭제 (Node.js 12 이상)
fs.rm("folder", { recursive: true }, (err) => {
  if (err) {
    console.error("재귀적 삭제 오류:", err);
    return;
  }
  console.log("재귀적 삭제 완료");
});

fs 모듈의 중요성과 활용 사례

  1. 설정 파일 처리: JSON, YAML 등의 설정 파일을 읽고 쓰기
  2. 로깅: 로그 파일 생성 및 관리
  3. 데이터 저장: 임시 데이터 또는 캐시를 파일로 저장
  4. 정적 파일 제공: 웹 서버에서 HTML, CSS, 이미지 등의 파일 제공
  5. 파일 업로드 처리: 사용자가 업로드한 파일을 서버에 저장
  6. 파일 변환/처리: 파일 내용 읽기, 변환 후 새 파일로 저장

파일 시스템 작업은 I/O 관련 작업이므로, 대부분의 fs 메서드에는 동기식과 비동기식 버전이 모두 있습니다. 프로덕션 환경에서는 성능과 확장성을 위해 비동기 메서드를 사용하는 것이 권장됩니다.

results matching ""

    No results matching ""