비동기를 공부하다가 오류가 생겨서 __dirname을 공부하던 중 완전하게 알고가자란 마음으로 경로와 관련된 것을 정리해본다.
__dirname, __filename, process.cwd()
에 대해 nodejs docs에서는 아래와 같이 말한다.
__dirname
: 소스파일을 포함하는 폴더까지 절대경로로 나타낸다. 위의 경우로 예를 들면 app.js
는 working driectory/src/app.js
에 있으므로 __dirname은 working dirctory/src
가 된다.
It returns the directory name of the directory containing the source code file.
__filename
: dirname에서 source file을 포함한 것을 나타낸다. 이 또한 위의 경우로 예시를 들면 filename은 working directory/src/app.js
이다. 즉, app.js 파일이름까지 포함한 절대경로를 나타낸다.
The file name of the current module. This is the current module file's absolute path with symlinks resolved.
process.cwd()
: 현재 작업경로(current working directory; 편히, package.json
이 포함된 root경로)를 나타낸다. 하지만, 혼자 공부해봤을 때는 node를 실행시킨 경로가 더 정확하다고 생각한다.
returns the current working directory of the Node.js process
tree structure
.learn-express
├── package-lock.json
├── package.json
└── src
└── doodle.js
💡 아 그리고 폴더 구조를 보여주기 위해서
node_modules
는 어떻게 제거하면 되나 했는데-I
option을 쓰면 된다.
👉🏻 $ tree -I node_modules
showPath.js
const fs = require("fs");
const path = require("path");
console.log(`__dirname ->`, __dirname);
console.log(`__filename ->`, __filename);
console.log(`process.cwd() ->`, process.cwd());
출력
혼자 이것저것 해보다 보면 __dirname
과 __filename
의 차이점은 명확하게 알 수 있다. 하지만, __dirname과 process.cwd의 차이점은 확연히 보이지 않는다. 이에 대한 차이점은 아래 표로 정리했다.
__dirname | process.cwd() |
---|---|
소스 코드파일을 포함하는 폴더의 절대 경로를 나타낸다. | 현재 작업경로를 나타낸다. |
모듈에 대한 local 범위를 가진다. | global 객체 범위를 가진다. |
소스코드 파일이 포함된 경로를 나타낸다. | node 명령어를 실행시킨 경로에 따라 달라진다. |
위의 showPath.js를 가지고 node command
를 working directory가 아닌 한 단계 위인 부모 디렉토리에서 실행하면 __dirname과 process.cwd()의 차이점을 알 수 있다.
$ node learn-express/src/showPath.js
출력
이제 출력을 보면 process.cwd()는 node command를 실행한 딱 그 경로
를 나타내고 __dirname은 소스파일을 가지고 있는 폴더
까지 나타난다.
__dirname을 그냥 현재 디렉토리로만 알고 있었는데 이를 이용해서 파일을 읽어오려니까 오류가 나서 정리하게 됐다. 이번 기회에 더 확실하게 경로에 대한 것을 잡을 수 있었으며, 뭔가 migration을 해보지는 않았지만 migration을 하게 될 때 헷갈리지 않고 유용하게 잘 쓸 수 있을 거 같아서 뿌듯하다!!🎉