쌓고 쌓다

[node] path 내장 모듈 본문

프로그래밍/node.js

[node] path 내장 모듈

승민아 2023. 1. 23. 17:42

__firename, __dirname

노드는 __filename, __dirname 키워드로 현재 파일명과 파일 경로 정보를 제공한다.

 

study.js

console.log(__filename)
console.log(__dirname)

 

study.js 경로
실행 결과

__filename은 파일명까지 포함하여 나오고, __dirname은 파일의 위치까지만 나온다.

 

+ ES모듈에서는 __filename, __dirname을 사용할 수 없다. 대신 import.meta.url로 경로를 가져온다.

filename.mjs

console.log(import.meta.url)
console.log('__filename은 에러 발생')
console.log(__filename)

ES모듈에서 __filename 사용 불가

 

path 내장 모듈

위의 __filename을 사용할 때 윈도가 아니라면 \ 대신 /로 폴더 경로가 구분될 수 있다. 운영체제별로 경로 구분자가 다르다.

경로를 이용해 정보를 처리하는데 문자열로 반환되기도 하고, \ 나 / 같은 경로 구분자 문제도 있다.

이것을 해결해주는 모듈이 path 모듈이다.

폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈이라고 생각하자.

 

운영 체제별로 구분자가 다른데 크게 윈도 타입과 POSIX 타입으로 구분된다.

POSIX에 유닉스 기반의 운영체제로 맥과 리눅스가 속한다.

  • 윈도: C:\User\ME 처럼 \로 구분함.
  • POSIX: /home/lsm 처럼 /로 구분함.

 

require 함수로 path 모듈을 불러오자.(CommonJS 모듈 방법) string 변수에는 __filename 결과가 들어간다.

const path = require('path')
const string = __filename

__filename 결과 : C:\Users\ME\Desktop\forNodejs\study.js

 

 

이제 아래의 속성 및 메소드 결과들을 보자.

path.sep

 

경로의 구분자이다. 윈도는 \, POSIX는 /가 나온다.

console.log('path.sep: ', path.sep)

실행 결과 => path.sep: \

 

path.delimiter

환경 변수의 구분자이다. process.env.PATH

console.log('path.delimiter:', path.delimiter)

실행 결과 => path.delimiter: ;

process.env에 대해 글 끝에 설명 추가.

 

path.dirname(경로)

파일이 위치한 폴더 경로를 보여준다.

console.log('path.dirname():', path.dirname(string))

실행 결과 => path.dirname(): C:\Users\ME\Desktop\forNodejs

 

path.extname(경로)

파일의 확장자를 보여준다.

console.log('path extname():', path.extname(string))

실행 결과 => path extname(): .js

 

path.basename(경로, 확장자)

파일의 이름(확장자 포함)을 출력. 파일 이름만 표시한다면 두 번째 인수(확장자)에 파일의 확장자를 넣는다.

console.log('path.basename():', path.basename(string))
console.log('path.basename - extname:', path.basename(string, path.extname(string)))

실행 결과 => path.basename(): study.js
                      path.basename - extname: study

 

path.parse(경로)

파일의 경로를 root, dir, base, ext, name으로 분리한다.

console.log('path.parse():', path.parse(string))

실행 결과 =>

path.parse() 실행 결과

 

path.format(객체)

path.parse()한 객체의 결과를 다시 파일 경로로 합칠 수 있다.

console.log('path.format():', path.format({
    dir: 'C:\\Users\\ME\\Desktop\\forNodejs',
    name: 'study',
    ext: '.js'
}))

실행 결과 => path.format(): C:\Users\ME\Desktop\forNodejs\study.js  

 

path.normalize(경로)

/나 \를 올바르지 않게 혼용하거나 여러 번 사용했을 때 정상적인 경로로 변환해 준다.

console.log('path.normalize():', path.normalize('C:\\users////Me//Destop//forNodejs///study.js'))

실행 결과 => path.normalize(): C:\users\Me\Destop\forNodejs\study.js

 

path.isAbsolute(경로)

파일의 경로가 절대경로인지 상대경로인지 true, false를 반환합니다.

console.log('path.isAbsolute(C\\):', path.isAbsolute('C:\\'))
console.log('path.isAbsolute(./home):', path.isAbsolute('./home'))

path.isAbsolute() 실행 결과

 

path.relative(경로1, 경로2)

경로1에서 경로2로 가는 방법을 보입니다.

console.log('path.relative():', path.relative('C:\\users\\me\\destop\\forNodejs\\study.js', 'C:\\'))

실행 결과 => path.relative(): ..\..\..\..\..

 

path.join(경로, ...)

여러 인수를 넣어 하나의 경로로 합칠 수 있다. 상대 경로 ..와 현재 위치 .도 처리한다.

console.log('path.join():', path.join(__dirname, '..', '..', '\\forNodejs'))

실행 결과 => path.join(): C:\Users\ME\forNodejs

__dirname의 결과는 C:\Users\ME\Desktop\forNodejs 이다. 여기서 부모 디렉터리로 2번 이동했으니

C:\Users\ME 위치가 된다. 여기서 '\\forNodejs'로 이동하였으니 ME에서 forNodejs 디렉토리로 이동한게 결과가 된다.

 

path.resolve(경로, ...)

path.join과 비슷하지만 차이가 있다.

/를 만나면 path.join은 상대 경로로 처리하고, path.resolve는 절대 경로로 인식해서 앞의 경로를 무시하고 처리한다.

console.log('path.resolve():', path.resolve(__dirname, '..', '..', '\\forNodejs', 'study.js'))

실행 결과 => path.resolve(): C:\forNodejs\study.js

 '//forNodejs'인수전까지는 join에서 설명한 경로와 일치한다. 그런데 '//forNodejs' 폴더로 이동하는데

resolve 메소드에서는 절대경로로 인식하기에 앞의 경로는 무시하고 forNodejs 디렉터리로 처리해 버린 것이다.

*절대 경로는 루트 폴더(윈도의 C:\나 POSIX의 /)나 노드 프로세스가 실행되는 위치가 기준이 되기에 solve에서 C:\로 시작한 것이다.

 

+ join과 resolve의 차이

path.join('/a', '/b', 'c') // 결과: /a/b/c
path.resolve('/a', '/b', 'c') // 결과: /b/c

 

+ 어떨 때 \\를 쓰고 \를 사용할까?

윈도 경로를 표현할 때 \\를 사용한다. 기본적으로 \를 사용하지만 자바스크립트에서 \는 특수문자 이므로

\를 두 개 붙여서 \\로 경로를 표시해야 한다. \n은 줄 바꿈이라는 뜻인데 C:\node의 경로처럼 의도하지 않은 에러가 발생할 수 있다. 그래서 C:\\node로 경로를 표시해야 한다.

 

 

+ 윈도에서 POSIX 스타일 경로

윈도에서 POSIX 스타일 경로를 사용할 때 path.posix.sep이나 path.posix.join()과 같이 사용한다.

POSIX에서 윈도 스타일은 path.win32.sep이나 path.win32.join()과 같이 사용한다.

 

노드는 require.main 파일을 기준으로 상대경로를 인식하므로  require.main 파일과 다른 디렉터리의 파일이 상대경로를 갖고 있다면 예상과 달리 작동할 수 있다.

*require.main은 노드 실행 시 첫 모듈을 가리킨다.

node require로 실행했다면 require.js가 require.main이 된다.

require.main === module로 현재 파일이 첫 모듈인지 알 수 있음.

Comments