nodejs

fs.existsSync

개발을 하다 보면 파일이나 폴더가 존재하는지를 빠르게 확인해야 하는 경우가 많습니다. 예를 들어, 설정 파일이 있는지 확인하거나, 로그 파일을 만들기 전에 해당 파일이 이미 존재하는지를 판단하고 싶을 수 있습니다.


이럴 때 가장 간단하게 사용할 수 있는 함수가 바로 fs.existsSync입니다. 이름 그대로, 주어진 경로의 파일 또는 디렉토리가 "존재하는지 여부"를 동기적으로 반환해줍니다.


기본 사용법

fs-existsSync
const fs = require('fs');
 
if (fs.existsSync('./config.json')) {
  console.log('설정 파일이 존재합니다.');
} else {
  console.log('설정 파일이 없습니다.');
}

fs.existsSync는 인자로 받은 경로의 파일 또는 폴더가 존재하면 true를, 존재하지 않으면 false를 반환합니다.


언제 사용하면 좋을까?

  • 애플리케이션 초기 구동 시 설정 파일이 있는지 검사
  • 특정 경로에 폴더가 없으면 새로 만들기 전 조건 확인
  • 로그 파일 또는 캐시 파일 사전 확인
  • CLI 도구에서 사용자 입력 경로 검증

이처럼 빠르게 경로 존재 여부를 파악해야 하는 경우에 유용하며, 별도의 에러 처리를 하지 않아도 되어 코드가 단순해집니다.


주의할 점

Node.js 공식 문서에서는 fs.existsSync의 사용을 지양할 것을 권장하기도 합니다. 그 이유는 다음과 같습니다:

  1. 이 함수는 동기 함수이기 때문에, 실행되는 동안 이벤트 루프를 블로킹합니다. 특히 서버 코드에서는 성능 저하로 이어질 수 있습니다.
  2. fs.access()fs.promises.access()와 같은 비동기 방식이 더 안전하고 유연한 처리를 가능하게 합니다.

예: 비동기 대안

fs-existsSync
const fs = require('fs');
 
fs.access('./config.json', fs.constants.F_OK, (err) => {
  if (err) {
    console.log('파일이 없습니다.');
  } else {
    console.log('파일이 존재합니다.');
  }
});

또는 Promise 기반으로:

fs-existsSync
const fs = require('fs').promises;
 
async function checkFile() {
  try {
    await fs.access('./config.json');
    console.log('존재함');
  } catch {
    console.log('존재하지 않음');
  }
}

그럼에도 불구하고 언제 쓰면 괜찮을까?

fs.existsSync는 다음과 같은 경우에는 여전히 유용하게 쓰일 수 있습니다:

  • CLI 도구나 스크립트성 코드처럼 실행 시간이 짧고, 동기 방식이 허용되는 환경
  • 서버 시작 시 초기 검사 정도의 용도 (단, 빈번히 호출되면 안 됨)
  • 테스트 코드나 개발용 스크립트 작성 시

마무리

fs.existsSync는 매우 간단하고 직관적인 API로, 파일이나 폴더가 존재하는지를 빠르게 확인할 수 있습니다. 다만 이벤트 루프를 블로킹한다는 단점이 있으므로, 실시간성이 중요한 서버 코드에서는 비동기 방식의 fs.access 또는 fs.promises.access를 사용하는 것이 더 안전합니다.


용도에 맞게, 그리고 호출 빈도를 고려해서 적절하게 사용한다면 충분히 유용한 도구가 될 수 있습니다.


참고 문서