개발을 하다 보면 파일이나 폴더가 존재하는지를 빠르게 확인해야 하는 경우가 많습니다. 예를 들어, 설정 파일이 있는지 확인하거나, 로그 파일을 만들기 전에 해당 파일이 이미 존재하는지를 판단하고 싶을 수 있습니다.
이럴 때 가장 간단하게 사용할 수 있는 함수가 바로
기본 사용법
const fs = require('fs');
if (fs.existsSync('./config.json')) {
console.log('설정 파일이 존재합니다.');
} else {
console.log('설정 파일이 없습니다.');
}언제 사용하면 좋을까?
- 애플리케이션 초기 구동 시 설정 파일이 있는지 검사
- 특정 경로에 폴더가 없으면 새로 만들기 전 조건 확인
- 로그 파일 또는 캐시 파일 사전 확인
- CLI 도구에서 사용자 입력 경로 검증
이처럼 빠르게 경로 존재 여부를 파악해야 하는 경우에 유용하며, 별도의 에러 처리를 하지 않아도 되어 코드가 단순해집니다.
주의할 점
Node.js 공식 문서에서는
- 이 함수는 동기 함수이기 때문에, 실행되는 동안 이벤트 루프를 블로킹합니다. 특히 서버 코드에서는 성능 저하로 이어질 수 있습니다.
fs.access() 나fs.promises.access() 와 같은 비동기 방식이 더 안전하고 유연한 처리를 가능하게 합니다.
예: 비동기 대안
const fs = require('fs');
fs.access('./config.json', fs.constants.F_OK, (err) => {
if (err) {
console.log('파일이 없습니다.');
} else {
console.log('파일이 존재합니다.');
}
});또는 Promise 기반으로:
const fs = require('fs').promises;
async function checkFile() {
try {
await fs.access('./config.json');
console.log('존재함');
} catch {
console.log('존재하지 않음');
}
}그럼에도 불구하고 언제 쓰면 괜찮을까?
- CLI 도구나 스크립트성 코드처럼 실행 시간이 짧고, 동기 방식이 허용되는 환경
- 서버 시작 시 초기 검사 정도의 용도 (단, 빈번히 호출되면 안 됨)
- 테스트 코드나 개발용 스크립트 작성 시
마무리
용도에 맞게, 그리고 호출 빈도를 고려해서 적절하게 사용한다면 충분히 유용한 도구가 될 수 있습니다.