Node path.join() vs path.resolve()

들어가기

Vue나 Webpack등을 보면 Node의 Path모듈을 자주 사용하는 것을 볼수 있다.

이 Path 모듈은 Node의 내장모듈로서 javascript에서 폴더나 파일의 경로를 쉽게 문자열로 만들어주는 유틸리티 모듈이다.

특히 Windows 타입과 POSIX(Linux, macOS)타입으로 경로구분자가 다른수 있는데, 이 Path 모듈을 사용하면 여기에 대한 고민을 할 필요가 없어진다.

Path 모듈에는 다양한 메소드가 있으나, 보통 인자로 path를 받고 메소드별로 적절하게 문자열 형태의 path를 리턴하는 형태이다.

이 글에서는 Node의 path패키지 메서드중 여러개의 경로를 인자로 받아 하나의 경로로 합쳐주는 join과 resolve에 대해 정리해 보겠다.

Path.join()

메소드명처럼 인자로 받은 경로들을 하나로 합쳐서 문자열 형태로 path를 리턴한다.

1
2
3
4
5
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// Returns: '/foo/bar/baz/asdf'

path.join('foo', {}, 'bar');
// throws 'TypeError: Path must be a string. Received {}'

재미있는 점은 첫 번째 예제의 맨 마지막 인자이다.

.. 은 현재경로에서 한단계 위의 상위경로를 의미한다.

따라서 /foo/bar/baz/asdf/quux 이 상태의 경로에서 마지막에 합쳐진 .. 로 인해 quux의 한 단계 위 경로로 이동하게 되어 quux가 결과값에 제외된 것이다.

즉, .. 의 왼쪽에 있는 한 개의 경로인자는 제외된다.

Path.resolve()

resolve도 join과 마찬가지로 인자로 받은 경로들을 하나로 합쳐러 문자열 헝태로 리턴한다.

하지만 다른점은 전달받은 경로인자들의 맨 오른쪽 부터 왼쪽으로 경로인자들을 합쳐나간다는 것이다.

그리고 경로인자들을 합쳐나가는중 / 를 만나면 절대경로로 인식해서 나머지 경로 인자들을 무시한다.

만약 / 를 끝까지 만나지 못하면 /현재경로/생성된경로 형태로 결과를 리턴한다.

1
2
3
4
5
6
7
8
9
path.resolve('/foo/bar', './baz');
// Returns: '/foo/bar/baz'

path.resolve('/foo/bar', '/tmp/file/');
// Returns: '/tmp/file'

path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// if the current working directory is /home/myself/node,
// this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'

여기서도 .. 의 왼쪽에 있는 한 개의 경로인자는 제외된다. 이 특성은 Path 모듈의 메소드 전반에 적용되는 룰인것 같다.

참고자료

https://nodejs.org/api/path.html