Node.js의 fs 모듈은 File System을 다루는 내장 모듈입니다.
파일이나 디렉토리의 생성, 읽기, 쓰기, 삭제, 복사, 이동 등 다양한 작업을 수행할 수 있게 해줍니다.
비동기/동기 방식 둘 다 지원하며, 매우 자주 사용되는 핵심 모듈입니다.
Table of Contents
모듈 사용법
이 모듈을 사용하려면 require로 모듈을 불러와야 합니다.
const fs = require('fs');
동기 vs 비동기
- fs.readFile (비동기)
- fs.readFileSync (동기)
Node.js에서는 메소드 호출 시 비동기 방식을 권장하지만 경우에 따라 동기 방식이 필요한 경우도 있습니다.
주로 CLI 스크립트나 초기화로직 같은 경우가 이에 해당됩니다.
fs 파일 읽기
// 비동기 방식
fs.readFile('파일경로.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
// 동기 방식
const data = fs.readFileSync('파일경로.txt', 'utf8');
console.log(data);
readFile() 메소드는 파일을 읽을 때 사용할 수 있습니다.
첫 번째 매개변수로 파일의 경로를 전달하고, 두 번째 매개변수로 인코딩이나 flag를 전달합니다.
마지막 매개변수로 전달한 콜백 함수에서는 파일을 읽은 결과를 받을 수 있습니다.
resdFileSync() 메소드가 비동기 방식과 다른 점은 파일 읽기 결과를 리턴 값으로 전달한다는 점 입니다.
fs 파일 쓰기
// 비동기 방식
fs.writeFile('파일경로.txt', '내용', 'utf8', (err) => {
if (err) throw err;
console.log('파일이 저장됨');
});
// 동기 방식
fs.writeFileSync('파일경로.txt', '내용', 'utf8');
writeFile() 메소드로 파일에 내용을 쓸 수 있습니다.
매개변수로 파일의 경로와 쓸 내용, 옵션을 전달하고 콜백 함수로 저장 결과를 볼 수 있습니다.
기존에 파일이 있었다면 기본적으로 덮어쓰기를 하지만 옵션을 통해 쓰기 행동을 지정할 수 있습니다.
fs 파일 존재 여부 확인
fs.exists('파일.txt', (exists) => {
console.log(exists ? '있음' : '없음');
});
먼저 exists() 메소드를 사용해 해당 파일이 존재하는지 확인할 수 있습니다.
하지만 이는 예전 방식으로 추천하지는 않습니다.
fs.access('파일.txt', fs.constants.F_OK, (err) => {
if (err) {
console.log('파일 없음');
} else {
console.log('파일 있음');
}
});
권장하는 방법은 access() 메소드를 사용하여 파일의 상태를 확인하는 것 입니다.
fs 파일 삭제
fs.unlink('파일경로.txt', (err) => {
if (err) throw err;
console.log('파일 삭제됨');
});
파일을 삭제하려면 unlink() 메소드를 통해 제거 작업을 진행할 수 있습니다.
fs 디렉토리 생성/삭제
fs.mkdir('새폴더', { recursive: true }, (err) => {
if (err) throw err;
});
fs.rmdir('폴더', (err) => {
if (err) throw err;
});
디렉토리의 생성은 mkdir() 메소드로, 삭제는 rmdir() 메소드로 가능합니다.
여기서 Node 14 이상 버전에서는 rm() 메소드를 통해서도 옵션에 따라 디렉토리 제거가 가능합니다.
파일/디렉토리 이름 변경
fs.rename('old.txt', 'new.txt', (err) => {
if (err) throw err;
});
파일이나 디렉토리의 이름을 변경하려면 rename() 메소드를 사용하면 됩니다.
다른 메소드들과 마찬가지로 콜백 함수를 통해 작업 결과를 알 수 있습니다.
파일/디렉토리 복사
fs.cp('원본.txt', '복사본.txt', (err) => {
if (err) throw err;
});
Node 16 이상 버전에서는 cp() 메소드를 통해 파일이나 디렉토리를 복사할 수 있습니다.
Promise 기반으로 사용
const fs = require('fs').promises;
async function readFile() {
try {
const data = await fs.readFile('test.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
}
Promise 기반의 fs를 불러와 async/await 구문을 사용할 수도 있습니다.
await 구문을 사용하면 비동기로 작업을 수행하는 readFile() 메소드를 콜백 함수 없이 사용할 수 있습니다.
파일 작업 결과는 리턴 값으로 받고 오류는 try/catch 구문으로 확인합니다.
정리
fs 모듈은 File System에 관련된 작업을 하는 모듈로 파일이나 디렉토리의 읽기, 쓰기, 삭제 등의 작업을 수행할 수 있습니다.
필요에 따라 비동기, 동기 방식을 선택할 수 있고 Promise까지 적용할 수 있습니다.