내장 path 모듈은 파일 경로를 운영체제 간에 올바르게 만들고 조작합니다. /로 경로 문자열을 수동으로 연결하면 (\를 사용하는) Windows에서 깨지고 엣지 케이스를 잘못 처리합니다. path는 이 모든 것을 안정적으로 처리합니다.
// ❌ fragile, OS-dependent, error-prone
const filePath = baseDir + "/" + "sub" + "/" + fileName;
// breaks on Windows (\), doubles slashes if baseDir ends in /, etc.
import path from "path";
// ✅ uses the correct separator for the OS, normalizes slashes
const filePath = path.join(baseDir, "sub", fileName);
// Linux/Mac: baseDir/sub/file.txt Windows: baseDir\sub\file.txt
path.join은 OS에 맞는 구분자를 삽입하고, 중복/끝부분 슬래시를 정리하며, ../. 세그먼트를 해석합니다.
path.resolve("src", "app.js"); // → ABSOLUTE path from the cwd
path.basename("/a/b/file.txt"); // "file.txt"
path.dirname("/a/b/file.txt"); // "/a/b"
path.extname("file.txt"); // ".txt"
path.parse("/a/b/file.txt"); // { dir, base, name, ext }
path.sep; // "/" or "\" depending on OS
// CommonJS — built-in globals
const configPath = path.join(__dirname, "config.json");
// ES Modules — __dirname doesn't exist; derive it from import.meta.url
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
현재 파일 기준으로(CommonJS의 __dirname 또는 ESM의 동등 코드) 경로를 만드는 것이 파일을 참조하는 안전한 방법입니다. 프로세스가 어디서 시작되었는지와 무관합니다.
path.join → just joins segments (relative stays relative)
path.resolve → produces an ABSOLUTE path (resolves from cwd / right-to-left)
문자열 연결 대신 path를 사용하면 파일 처리 코드가 크로스 플랫폼하고 견고해집니다. Mac/Linux에서 작성한 코드가 Windows에서 깨지거나 연결이 잘못된 경로를 만들어 내는 것은 흔한 버그 원인입니다.
작은 습관이지만 신뢰성에 큰 이점을 주며, join과 resolve의 차이, ESM에서 __dirname을 얻는 방법을 아는 것은 파일 시스템을 다루는 모든 Node 프로젝트의 일상적인 경로 요구를 충족합니다.