더북(TheBook)

Note ≣ join과 resolve의 차이

path.joinpath.resolve 메서드는 비슷해 보이지만 동작 방식이 다릅니다. /를 만나면 path.resolve는 절대경로로 인식해서 앞의 경로를 무시하고, path.join은 상대경로로 처리합니다. 코드로 보면 이해하기 쉽습니다.

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

Note ≣ 어떤 때 \를 사용하고 어떤 때 \를 사용하나요?

콘솔 결과를 보면, 어떤 때는 \를 사용하고 어떤 때는 그냥 \를 사용해 윈도 경로를 표시했습니다. 기본적으로 경로는 \ 하나를 사용해서 표시합니다. 하지만 자바스크립트 문자열에서는 \가 특수 문자이므로 \를 두 개 붙여 경로를 표시해야 합니다. 예를 들어 \n은 자바스크립트 문자열에서 줄바꿈이라는 뜻이므로. C: ode와 같은 경로에서 의도하지 않은 오류가 발생할 수 있습니다. 이때는 C:\node처럼 표시해야 합니다.

path 모듈은 위와 같은 경우에 발생하는 문제를 알아서 처리합니다. 이는 윈도에서 path 모듈이 꼭 필요한 이유이기도 합니다.

Note ≣ 상대경로와 절대경로

절대경로는 루트 폴더(윈도의 C:\나 POSIX의 /)나 노드 프로세스가 실행되는 위치가 기준이 됩니다.

상대경로는 현재 파일이 기준이 됩니다. 현재 파일과 같은 경로이면 점 하나(.)를, 현재 파일보다 한 단계 상위 경로이면 점 두 개(..)를 사용해 표현합니다.

C:\users\zerocho\path.js에서 C:\로 가고 싶다면 절대경로에서는 그냥 C:\를 입력하면 됩니다. 하지만 상대경로에서는 ..\..을 해야 두 디렉터리 위로 올라가 C:\가 됩니다.

가끔 윈도에서 POSIX 스타일 경로를 사용할 때가 있고, 그 반대일 때도 있습니다. 이러한 경우 윈도에서는 path.posix.sep이나 path.posix.join()과 같이 사용하면 되고, POSIX에서는 path.win32.sep이나 path.win32.join()과 같이 사용하면 됩니다.

노드는 require.main 파일을 기준으로 상대경로를 인식합니다. 따라서 require.main과는 다른 디렉터리의 파일이 상대경로를 갖고 있다면 예상과 다르게 동작할 수 있습니다. 이 문제는 path 모듈을 통해 해결할 수 있습니다. fs 모듈을 살펴볼 때 한 번 더 짚고 넘어가겠습니다.

path 모듈 이전까지는 중요하다고 생각하는 API만 추려서 예제에 넣었습니다. 하지만 path 모듈은 속성 하나하나가 모두 유용하므로 전부 넣었습니다. path 모듈은 앞으로 노드 프로그래밍을 하면서 매우 자주 쓰게 될 모듈 중 하나입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.