프로그래밍/NODEJS 강좌 BY GEMINI

주요 내장 모듈 살펴보기-path: 파일 및 디렉토리 경로 처리 (Java의 java.nio.file.Path와 유사)

lazy_web_devloper 2025. 6. 4. 09:45
728x90
반응형

3. path 모듈: 파일 및 디렉토리 경로 마법사 🪄

애플리케이션을 개발하다 보면 파일이나 디렉토리의 경로를 조합하거나, 특정 경로에서 파일 이름 또는 확장자만 추출해야 하는 경우가 많습니다. 이때 문자열을 직접 조작하는 것은 오류가 발생하기 쉽고, 특히 Windows와 macOS/Linux 같은 서로 다른 운영체제에서는 경로 구분자(Windows는 \, macOS/Linux는 /)가 달라 문제가 생길 수 있습니다.

path 모듈은 이러한 경로 관련 작업을 운영체제에 독립적인 방식으로 안전하고 일관되게 처리할 수 있도록 다양한 유틸리티 함수를 제공합니다. Java의 java.nio.file.Path 인터페이스나 java.io.File 클래스의 경로 관련 메소드들과 유사한 기능을 한다고 생각하시면 됩니다.

주요 path 모듈 함수 예시:

path 모듈을 사용하려면 먼저 require 해야 합니다.

JavaScript
 
const path = require('path');
  • path.join([...paths]): 여러 개의 경로 문자열을 운영체제에 맞는 경로 구분자(예: / 또는 \)로 연결하여 하나의 완전한 경로로 만듭니다. 인자로 전달된 경로 중 빈 문자열은 무시됩니다. . (현재 디렉토리)나 .. (상위 디렉토리) 같은 상대 경로도 올바르게 처리합니다.문자열로 직접 경로를 합치는 것 ('/' + 'users' + '/' + ...) 보다 path.join()을 사용하는 것이 훨씬 안전하고 권장됩니다.
  • JavaScript
     
    const myPath = path.join('/users', 'johndoe', 'documents', 'report.pdf');
    console.log(myPath); // macOS/Linux: /users/johndoe/documents/report.pdf
                         // Windows: \users\johndoe\documents\report.pdf (실제로는 C:\users\... 형태가 될 수 있음)
    
    const projectRoot = '/app';
    const assetsFolder = 'public/images';
    const imageName = 'logo.png';
    const imagePath = path.join(projectRoot, assetsFolder, imageName);
    console.log(imagePath); // /app/public/images/logo.png (또는 \app\public\images\logo.png)
    
    console.log(path.join('foo', 'bar', '..', 'baz/quux', '.'));
    // foo/baz/quux (또는 foo\baz\quux)
    
  • path.resolve([...paths]): 주어진 경로들을 오른쪽에서 왼쪽으로 처리하여 절대 경로를 생성합니다. 만약 오른쪽부터 처리하다가 절대 경로(예: /foo 또는 C:\bar)를 만나면 이전의 경로들은 무시됩니다. 인자가 없으면 현재 작업 디렉토리의 절대 경로를 반환합니다.path.join()은 단순히 경로들을 연결하는 반면, path.resolve()는 항상 절대 경로를 반환하려고 시도한다는 차이점이 있습니다.
  • JavaScript
     
    console.log(path.resolve('foo/bar', '/tmp/file', '..', 'a/../subfile'));
    // /tmp/subfile (또는 C:\tmp\subfile 등 실제 환경에 따라)
    
    console.log(path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif'));
    // 현재 작업 디렉토리를 기준으로 경로를 계산:
    // 예를 들어 현재 작업 디렉토리가 /home/user/project 라면,
    // /home/user/project/wwwroot/static_files/gif/image.gif
    
    console.log(path.resolve('img.jpeg'));
    // /current/working/directory/img.jpeg
    
  • path.dirname(p): 주어진 경로 p에서 디렉토리 이름 부분을 반환합니다. Java의 File.getParent()와 유사합니다.
  • JavaScript
     
    console.log(path.dirname('/users/johndoe/documents/report.pdf'));
    // /users/johndoe/documents
    
    console.log(path.dirname('config/settings.json'));
    // config
    
  • path.basename(p[, ext]): 주어진 경로 p에서 마지막 부분(파일 이름 또는 가장 마지막 디렉토리 이름)을 반환합니다. 선택적 인자 ext가 주어지고, p의 마지막 부분이 ext로 끝나면 ext를 제외한 부분을 반환합니다. Java의 File.getName()과 유사합니다.
  • JavaScript
     
    console.log(path.basename('/users/johndoe/documents/report.pdf')); // report.pdf
    console.log(path.basename('/users/johndoe/documents/report.pdf', '.pdf')); // report
    console.log(path.basename('archive.tar.gz', '.gz')); // archive.tar
    console.log(path.basename('/some/dir/')); // dir
    
  • path.extname(p): 주어진 경로 p에서 확장자 부분을 반환합니다. 경로의 마지막 부분에 .이 없거나, .으로 시작하고 다른 문자가 없으면 빈 문자열을 반환합니다.
  • JavaScript
     
    console.log(path.extname('index.html'));   // .html
    console.log(path.extname('archive.tar.gz')); // .gz (가장 마지막 확장자만)
    console.log(path.extname('image.jpeg'));   // .jpeg
    console.log(path.extname('filename'));     // '' (빈 문자열)
    console.log(path.extname('.profile'));     // '' (빈 문자열, Unix 숨김 파일의 경우)
    console.log(path.extname('folder/file.txt')); // .txt
    
  • path.isAbsolute(p): 주어진 경로 p가 절대 경로인지 여부를 boolean 값으로 반환합니다.
  • JavaScript
     
    console.log(path.isAbsolute('/foo/bar')); // true
    console.log(path.isAbsolute('foo/bar'));  // false
    console.log(path.isAbsolute('C:\\foo\\bar')); // true (Windows에서)
    
  • path.parse(p): 경로 문자열 p를 분석하여 객체 형태로 반환합니다. 객체는 root, dir, base, ext, name 속성을 가집니다.
  • JavaScript
     
    const pathObject = path.parse('/home/user/dir/file.txt');
    console.log(pathObject);
    // {
    //   root: '/',
    //   dir: '/home/user/dir',
    //   base: 'file.txt',
    //   ext: '.txt',
    //   name: 'file'
    // }
    
    console.log(path.parse('C:\\path\\dir\\file.txt'));
    // {
    //   root: 'C:\\',
    //   dir: 'C:\\path\\dir',
    //   base: 'file.txt',
    //   ext: '.txt',
    //   name: 'file'
    // }
    
  • path.format(pathObject): path.parse()가 반환하는 것과 같은 객체를 인자로 받아 경로 문자열로 조합합니다. dir과 base가 우선적으로 사용되며, 이들이 없으면 root, name, ext가 사용됩니다.
  • JavaScript
     
    const newPath = path.format({
      root: '/',
      dir: '/home/user/foo',
      base: 'bar.baz',
      // name: 'bar', // dir과 base가 있으면 무시됨
      // ext: '.baz'  // dir과 base가 있으면 무시됨
    });
    console.log(newPath); // /home/user/foo/bar.baz
    
  • path.sep: 현재 운영체제의 경로 구분자를 제공합니다. (Windows에서는 \, POSIX 시스템에서는 /)
  • path.delimiter: 현재 운영체제의 환경 변수 경로 목록 구분자를 제공합니다. (Windows에서는 ;, POSIX 시스템에서는 :)

__dirname 와 __filename

path 모듈의 일부는 아니지만, 경로를 다룰 때 매우 유용하게 사용되는 Node.js 전역 변수(실제로는 각 모듈 스코프)가 있습니다.

  • __filename: 현재 실행 중인 파일의 절대 경로를 나타내는 문자열입니다.
  • __dirname: 현재 실행 중인 파일이 위치한 디렉토리의 절대 경로를 나타내는 문자열입니다. path.dirname(__filename)과 동일한 값을 가집니다.

이 변수들은 특히 현재 파일의 위치를 기준으로 다른 파일이나 디렉토리의 경로를 지정할 때 매우 유용합니다.

JavaScript
 
// 예를 들어, 현재 파일이 /Users/me/project/app.js 라면:
console.log('Current file path:', __filename); // /Users/me/project/app.js
console.log('Current directory path:', __dirname); // /Users/me/project

// __dirname을 사용하여 같은 디렉토리 내의 다른 파일 경로 만들기
const configFile = path.join(__dirname, 'config.json');
console.log('Config file path:', configFile); // /Users/me/project/config.json

path 모듈을 사용하면 운영체제에 구애받지 않고 경로 관련 로직을 깔끔하고 안정적으로 작성할 수 있습니다.

728x90
반응형