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 모듈의 중요성과 활용 사례
- 설정 파일 처리: JSON, YAML 등의 설정 파일을 읽고 쓰기
- 로깅: 로그 파일 생성 및 관리
- 데이터 저장: 임시 데이터 또는 캐시를 파일로 저장
- 정적 파일 제공: 웹 서버에서 HTML, CSS, 이미지 등의 파일 제공
- 파일 업로드 처리: 사용자가 업로드한 파일을 서버에 저장
- 파일 변환/처리: 파일 내용 읽기, 변환 후 새 파일로 저장
파일 시스템 작업은 I/O 관련 작업이므로, 대부분의 fs 메서드에는 동기식과 비동기식 버전이 모두 있습니다. 프로덕션 환경에서는 성능과 확장성을 위해 비동기 메서드를 사용하는 것이 권장됩니다.