...

Path ๋ชจ๋
path ๋ชจ๋์ ์ด์์ฒด์ ๋ณ๋ก ๊ฒฝ๋ก ๊ตฌ๋ถ์๊ฐ ๋ฌ๋ผ ์๊ธฐ๋ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ๋ค.
๋ฌธ์ ๋ ์ด์์ฒด์ ๋ณ๋ก ๋ฌ๋ผ์ง๋ ๊ตฌ๋ถ์์ ๋ํ ์ด์๋ ๋ค์๊ณผ ๊ฐ๋ค.
ํฌ๊ฒ Windows, POSIX ๋ก ๊ฐ๋ฆฌ๋๋ฐ, POSIX๋ ์ ๋์ค ๊ธฐ๋ฐ์ ์ด์์ฒด์ ๋ฅผ ๋งํ๊ณ , macOS ์ Linux ๊ฐ ์ด์ ์ํด์๋ค.
- Windows: C:\Users\ano ์ฒ๋ผ \ ๋ฅผ ์ฌ์ฉํด ํด๋๋ฅผ ๊ตฌ๋ถํ๋ค.
- POSIX: /Users/ano ์ฒ๋ผ / ๋ฅผ ์ฌ์ฉํด ํด๋๋ฅผ ๊ตฌ๋ถํ๋ค.
path ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ํด๋์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ฝ๊ฒ ์กฐ์ํ ์ ์์ด ์์ ๊ฐ์ ๊ฒฝ๋ก ๊ตฌ๋ถ์ ์ด์๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ๊ณ , ์ด์ธ์ ํ์ผ๋ช ์์ ํ์ผ๋ช , ํ์ฅ์๋ฅผ ๋ณ๋๋ก ๋์ด์ ํ์ฉํ ์ ์ ์ ์๋ค.
path ๋ชจ๋ method
path ๋ชจ๋์ ๋ด์ฅ ๋ชจ๋์ด๋ฏ๋ก ๋ณ๋ npm ์ค์น์์ด ์๋ ์ฒ๋ผ ๋ถ๋ฌ์ ์ฌ์ฉํ ์ ์๋ค.
const path = require('path');
- path.sep: ๊ฒฝ๋ก์ ๊ตฌ๋ถ์์ ๋๋ค. Windows๋ \, POSIX๋ /์ ๋๋ค.
- path.delimiter: ํ๊ฒฝ ๋ณ์์ ๊ตฌ๋ถ์์ ๋๋ค. process.env.PATH๋ฅผ ์ ๋ ฅํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ๊ฒฝ๋ก๊ฐ ์ด ๊ตฌ๋ถ์๋ก ๊ตฌ๋ถ๋์ด ์์ต๋๋ค. Windows๋ ์ธ๋ฏธ์ฝ๋ก (;)์ด๊ณ POSIX๋ ์ฝ๋ก (:)์ ๋๋ค.
- path.dirname(๊ฒฝ๋ก): ํ์ผ์ด ์์นํ ํด๋ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- path.extname(๊ฒฝ๋ก): ํ์ผ์ ํ์ฅ์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- path.basename(๊ฒฝ๋ก, ํ์ฅ์): ํ์ผ์ ์ด๋ฆ(ํ์ฅ์ ํฌํจ)์ ๋ณด์ฌ์ค๋๋ค. ํ์ผ์ ์ด๋ฆ๋ง ํ์ํ๊ณ ์ถ๋ค๋ฉด basename์ ๋ ๋ฒ์งธ ์ธ์๋ก ํ์ผ์ ํ์ฅ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
- path.parse(๊ฒฝ๋ก): ํ์ผ ๊ฒฝ๋ก๋ฅผ root, dir, base, ext, name์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
- path.format(๊ฐ์ฒด): path.parse()ํ ๊ฐ์ฒด๋ฅผ ํ์ผ ๊ฒฝ๋ก๋ก ํฉ์นฉ๋๋ค.
- path.normalize(๊ฒฝ๋ก): /๋ \๋ฅผ ์ค์๋ก ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๊ฑฐ๋ ํผ์ฉํ์ ๋ ์ ์์ ์ธ ๊ฒฝ๋ก๋ก ๋ณํํด์ค๋๋ค.
- path.isAbsolute(๊ฒฝ๋ก): ํ์ผ์ ๊ฒฝ๋ก๊ฐ ์ ๋๊ฒฝ๋ก์ธ์ง ์๋๊ฒฝ๋ก์ธ์ง true๋ false๋ก ์๋ ค์ค๋๋ค.
- path.relative(๊ธฐ์ค๊ฒฝ๋ก, ๋น๊ต๊ฒฝ๋ก): ๊ฒฝ๋ก๋ฅผ ๋ ๊ฐ ๋ฃ์ผ๋ฉด ์ฒซ ๋ฒ์งธ ๊ฒฝ๋ก์์ ๋ ๋ฒ์งธ ๊ฒฝ๋ก๋ก ๊ฐ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค๋๋ค.
- path.join(๊ฒฝ๋ก, .. .): ์ฌ๋ฌ ์ธ์๋ฅผ ๋ฃ์ผ๋ฉด ํ๋์ ๊ฒฝ๋ก๋ก ํฉ์ณ์ค๋๋ค. ์๋๊ฒฝ๋ก์ธ ..(๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ)๊ณผ .(ํ ์์น)๋ ์์์ ์ฒ๋ฆฌํด์ค๋๋ค.
- path.resolve(๊ฒฝ๋ก, .. .): path.join()๊ณผ ๋น์ทํ์ง๋ง ์ฐจ์ด๊ฐ ์์ต๋๋ค.

path.resolve([โฆpaths])
์ฌ๋ฌ ์ธ์๋ฅผ ๋ฃ์ผ๋ฉด ๊ฒฝ๋ก๋ฅผ ๋ฌถ์ด root ๊ฒฝ๋ก๋ฅผ ๊ณ ๋ คํ ์๋ก์ด ๊ฒฝ๋ก๋ฅผ ๋ฐํํ๋ค.
path.join()๊ณผ ๋น์ทํ๋ฐ resolve๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์๋ค.
์ค๋ฅธ์ชฝ ์ธ์ ๋ถํฐ ์ฝ์ด๊ฐ๋ฉฐ ์ ๋๊ฒฝ๋ก๋ฅผ ๋ง๋ ๋ค.
// ์ธ์ c ๋ถํฐ ์ฝ์ด ๋ค์ธ๋ค.
path.resolve('/a', 'b', 'c');
// Returns: /a/b/c
// /a ๋ฃจํธ ํด๋๊ฐ ์๋ ๊ฒฝ์ฐ root folder ๊น์ง์ ๊ฒฝ๋ก๋ฅผ ๋ถ์ฌ์ ๋ฐํํจ
// ํ์ฌ ํด๋น ํ์ผ์ ์คํ์ํค๋ ๊ฒฝ๋ก๊ฐ User/ano/temp/directory.js ๋ผ๋ฉด
path.resolve('/a', 'b', 'c');
// Returns: User/ano/temp/a ๋ฅผ ๋ฐํ
์ค๋ฅธ์ชฝ ์ธ์ ๋ถํฐ ์ฝ๋ค๊ฐ /folder_nmae ํํ์ ๊ฒฝ๋ก(path)๊ฐ ๋ฑ์ฅํ๋ฉด ์ ๋ ๊ฒฝ๋ก๋ก ์ธ์ํด์ ๊ทธ ๊ฒฝ๋ก(path)๋ฅผ ๋ฐ๋ก ๋ฐํํ๋ค.
๋ฐ๋ผ์ ์ ๋ ๊ฒฝ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ ์๋๊ฒฝ๋ก ํํ์ ํ๊ธฐ(./folder_name) ๋ฅผ ํด์ ์ ๋ ๊ฒฝ๋ก๊ฐ ์๋์ ํ์คํ๊ฒ ๊ตฌ๋ถํด์ผ ํ๋ค.
// /b๊ฐ ์ ๋๊ฒฝ๋ก ์ด๋ฏ๋ก /b/c๊ฐ ๋ฐํ๋๊ณ '/a'๋ ๋ฌด์๋๋ค.
path.resolve('/a', '/b', 'c');
// Returns: /b/c
// /c ๊ฐ ์ ๋๊ฒฝ๋ก ์ด๋ฏ๋ก '/a', '/b' ๋ ๋ฌด์๋๋ค
path.resolve('/a', '/b', '/c');
// Returns: /c
์ ๋ฌ๋ ์ธ์์ ์กฐํฉ์ผ๋ก ์ ๋๊ฒฝ๋ก๊ฐ ์์ฑ๋์ง ์์ผ๋ฉด working directory๋ฅผ ์ถ๊ฐํ์ฌ ์ ๋๊ฒฝ๋ก๋ฅผ ๋ง๋ ๋ค.
// ์ ๋ฌ๋ ์ธ์์ '/folder_name' ํํ์ ์ธ์๊ฐ ์์ผ๋ฏ๋ก, working directory๋ฅผ ์ถ๊ฐํ์ฌ ์ ๋๊ฒฝ๋ก ์์ฑ
path.resolve('a', 'b', 'c'); // {current_working_directory}/a/b/c
๋ฆฌํดํ๋ ๊ณผ์ ์์ ๊ฒฝ๋ก ๊ตฌ๋ถ์(sperator) ๋ฅผ ์ด์์ฒด์ ์ ๋ง๊ฒ nomalize ํ๋ค.
path.resolve('a, b, c');
// Returns:
// WINDOW: 'C:a\b\c'
// POSIX(mac, linux): '/a/b/c'
// /a ๋ฅผ WINDOW์์ ์ฌ์ฉํ๋ฉด ๊ฒฝ๋ก๊ตฌ๋ถ์๋ฅผ ๋ฐ๊ฟ์ ๋ฐํํด์ค๋ค.
path.resolve('/a');
// Returns: C:\a
// \a๋ฅผ POSIX(mac, linux) ์์ ์ฌ์ฉํ๋ฉด ๊ฒฝ๋ก ๊ตฌ๋ถ์๋ฅผ ๋ฐ๊ฟ์ ๋ฐํํด์ค๋ค.
path.resolve('\a')
// Returns: /a
์ด๋ค ์ธ์๋ ์ ๋ฌํ์ง ์๋๋ค๋ฉด ํ์ฌ working directory ๋ฅผ ๋ฐํํ๋ค.
ํ์ฌ ์์ ์ค์ธ ํ์ผ์ด /Users/ano/directory.js ๋ผ๋ฉด Users/ano ๋ฅผ ๋ฐํํ๋ค.
// User/ano/directory.js ์์ ์คํ๋๋ค๋ฉด working directory ๋ฅผ ๋ฐํ
console.log(path.resolve(''));
// Returns: `/User/ano`
๊ฒฐ๋ก ์ ์ผ๋ก path.resolve ๋ ์ ๋ฌ๋ ์ธ์๋ฅผ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฝ์ผ๋ฉฐ ์๋๋ก์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌ๋ถํ๊ณ ์ ๋๊ฒฝ๋ก๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ค.
path.join([โฆpaths])
์ฌ๋ฌ ์ธ์๋ฅผ ๋ฃ์ผ๋ฉด ํ๋์ ๊ฒฝ๋ก๋ฅผ ํฉ์ณ ๋ฐํํ๋ค.
์๋๊ฒฝ๋ก๋ฅผ ํ์ํ๋ .. ์ ํ ์์น๋ฅผ ํ์ํ๋ . ๋ ๋ฐ์ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค.
path.join('/foo', 'bar', 'baz/asdf', 'quux');
// Returns: '/foo/bar/baz/asdf/quux'
// ๋ง์ง๋ง ์ธ์์ .. ๊ฐ ํ์ฌ ์์น๋ณด๋ค ํ๋จ๊ณ ์ ์์ ํด๋๋ฅผ ์๋ฏธํ๋ฏ๋ก
// '/foo/bar/baz/asdf/quux' ๋ณด๋ค ํ ๋จ๊ณ๊ฐ ์ ํด๋์ ๊ฒฝ๋ก๊ฐ ๋ฐํ๋จ
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// Returns: '/foo/bar/baz/asdf'
// __dirname : User/ano/temp/direcotory
// ์๋๊ฒฝ๋ก์ ์ ๋๊ฒฝ๋ก๋ฅผ ์ธ์๋ก ์ ๋ฌํ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ฐ์ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํจ
// ๋ ๋จ๊ณ ์ฌ๋ผ๊ฐ User/ano ์์ /workspace ํด๋๋ก ๋ด๋ ค๊ฐ ๋ค์ /ano ํด๋๋ฅผ ์ฐพ์
path.join(__dirname, '..', '..','workspace', '.', '/ano');
// Returns: User/ano/workspace/ano
path.sep
๊ฒฝ๋ก์ ๊ตฌ๋ถ์(seperator) ์ด๋ค.
Windows๋ \ , POSIX ๋ / ๊ฐ์ ๋ด๊ณ ์๋ค.
path.delimiter
ํ๊ฒฝ ๋ณ์์ ๊ตฌ๋ถ์์ด๋ค.
ํ์์ ๋ก์ปฌํ๊ฒฝ์์ process.env.PATH ๋ฅผ ์กฐํํ๋ฉด
/Users/ano/.nvm/versions/node/v10.10.0/bin:/usr/local/opt/node@8/bin:/usr/local/opt/php@7.2/sbin:/usr/local/opt/php@7.2/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/opt/fzf/bin
๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋๋ฐ ์ฌ๊ธฐ์ ํ๊ฒฝ ๋ณ์๋ฅผ ๊ตฌ๋ถํ๋ ๊ตฌ๋ถ์๋ก :, colon ์ด ์ฐ์ด๊ณ ์๋ค.
Windows ๋ ์ธ๋ฏธ์ฝ๋ก (;)์ ์ฌ์ฉํ๊ณ , POSIX ๋ ์ฝ๋ก (:)์ ์ฌ์ฉํ๋ค.
path.dirname(paths)
ํ์ฌ ํ์ผ์ด ์์นํ ํด๋ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฌ์ค๋ค.
// __filename : '/Users/ano/temp/directory.js'
path.dirname(__filename);
// Returns: '/Users/ano/temp'
path.extname(paths)
ํ์ผ์ ํ์ฅ์๋ฅผ ๋ณด์ฌ์ค๋ค.
// __filename : '/Users/ano/temp/directory.js'
path.extname(__filename);
// Returns: '.js'
path.basenaem(path[, ext])
ํ์ผ์ ์ด๋ฆ(ํ์ฅ์ ํฌํจ)์ ๋ณด์ฌ์ค๋ค.
ํ์ผ์ ์ด๋ฆ๋ง ํ์ํ๊ณ ์ถ๋ค๋ฉด basnme ์ ๋ ๋ฒ์งธ ์ธ์๋ก ํ์ผ์ ํ์ฅ์(ext)๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
// __filename : '/Users/ano/temp/directory.js'
path.basename(__filename);
// Returns: 'directory.js'
// path.extname(__filename): '.js'
path.basename(__filename, path.extname(__filename));
// Returns: 'directory'
path.parse()
ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ธ์๋ก ๋ฐ์, root, dir, base, ext, name์ผ๋ก ๋ถ๋ฆฌํ ํ ํด๋น ๋ด์ฉ์ ๋ด์ ๊ฐ์ฒด๊ฐ์ ๋ฆฌํดํ๋ค.
// On Windows:
path.parse('C:\\path\\dir\\file.txt');
// Returns:
// { root: 'C:\\',
// dir: 'C:\\path\\dir',
// base: 'file.txt',
// ext: '.txt',
// name: 'file' }
โโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโ
โ dir โ base โ
โโโโโโโโฌ โโโโโโโโฌโโโโโโค
โ root โ โ name โ ext โ
" C:\ path\dir \ file .txt "
โโโโโโโโดโโโโโโโโโโโโโโโดโโโโโโโดโโโโโโ
("" ์์ ์๋ ๋ชจ๋ ๊ณต๋ฐฑ์ ๋ฌด์๋๋ค.)
path.format(pathObject)
path.parse() ํ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์ ํฉ์ณ์ ๊ฒฝ๋ก ๋ฌธ์์ด(string)์ ๋ฆฌํดํ๋ค.
// __filename : '/Users/ano/temp/directory.js'
// path.prase(__filename) Returns:
/*
{
root: "/",
dir: "/Users/ano/temp",
base: "directory.js",
ext: ".js",
name: "directory"
}
*/
path.format(path.parse(__filename));
// Returns: '/Users/ano/temp/directory.js'
path.normalize(path)
/ ๋ \ ๋ฅผ ์ค์๋ก ์ฌ๋ฌ๋ฒ ์ฌ์ฉํ๊ฑฐ๋ ํผ์ฉํ ๊ฒฝ์ฐ ์ ์์ ์ธ ๊ฒฝ๋ก๋ก ๋ณํํด์ค๋ค.
path.nomalize('\\Users///ano\\\temp/directory.js');
// Returns: '/Users/ano/temp/directory.js'
path.isAbsolute(path)
ํ์ผ์ ๊ฒฝ๋ก๊ฐ ์ ๋๊ฒฝ๋ก์ธ์ง, ์๋๊ฒฝ๋ก์ธ์ง true or false ๋ก ๋ฐํํด์ค๋ค.
// '/Users/ano/temp/directory.js'
path.isAbsolute('/Users'); //Returns: true
path.isAbsolute('./ano'); //Returns: false
path.relative(from, to)
๋ ๊ฒฝ๋ก๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ฉด, ์ฒซ๋ฒ์งธ ๊ฒฝ๋ก์์ ๋๋ฒ์งธ ๊ฒฝ๋ก๋ก ๊ฐ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ๊ณผ๋ก ๋ฆฌํดํ๋ค.
// '/Users/ano/temp/directory.js'
path.relative('/Users/ano/temp/directory.js', '/Users');
// Returns: '../../..'
// ์ฒซ๋ฒ์งธ ๊ฒฝ๋ก์์ ๋ฆฌํด๊ฐ์ด ์ ์ํ ๋๋ก ๊ฒฝ๋ก๋ก ๊ฐ๋ฉด ๋๋ฒ์งธ ๊ฒฝ๋ก๋ก ๊ฐ๊ฒ๋๋ค๋ ๋ป.
path.posix, path.win32
์ข ์ข Windows ์์ POSIX ์คํ์ผ์, POSIX ์์ Windows ์คํ์ผ์ ์ฌ์ฉํ ๋๊ฐ ์๋ค.
- ๊ทธ๋ฐ ๊ฒฝ์ฐ์ Windows ์์๋ path.posix.sep, path.posix.join() ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋๊ณ ,
- POSIX ์์๋ path.win32.sep, path.win32.join() ๋ฅผ ํ์ฉํ๋ฉด ๋๋ค.
ํน์ด์ฌํญ
Windows ํ๊ฒฝ์์ \\ ์ \๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
Windows ํ๊ฒฝ์์ ๊ธฐ๋ณธ์ ์ผ๋ก \ ํ๋๋ฅผ ์จ์ ๊ฒฝ๋ก๋ฅผ ํํํ๋ค.
ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ์์ด์์ \ ๊ฐ ํน์๋ฌธ์์ด๊ธฐ ๋๋ฌธ์ \๋ฅผ ํ๋ ๋ ๋ถ์ฌ \\ ํน์๋ฌธ์๊ฐ ์๋ ๊ฒฝ๋ก๋ก ์ฐ์ธ๋ค๋ ๊ฒ์ ํ๊ธฐํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด \n์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ค๋ฐ๊ฟ์ด๋ผ๋ ๋ป์ด๋ค.
๋ฐ๋ผ์ C:\node ์ ๊ฐ์ ๊ฒฝ๋ก์์ ์๋์น ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก C:\\node๋ก ํ์ํ๋ค.
์๋๊ฒฝ๋ก์ ์ ๋ ๊ฒฝ๋ก
์ ๋๊ฒฝ๋ก๋ ๋ฃจํธ ํด๋(Windows์ C:\ ๋ POSIX ์ /)๋ ๋ ธ๋ ํ๋ก์ธ์ค๊ฐ ์คํ๋๋ ์์น๊ฐ ๊ธฐ์ค์ด ๋๋ค.
์๋๊ฒฝ๋ก๋ ํ์ฌ ํ์ผ์ด ๊ธฐ์ค์ด ๋๋ค. ํ์ฌ ํ์ผ๊ณผ ๊ฐ์ ๊ฒฝ๋ก๋ฉด ์ ํ๋(.) ๋ฅผ ํ์ฌ ํ์ผ๋ณด๋ค ํ ๋จ๊ณ ์์ ๊ฒฝ๋ก๋จ ์ ๋๊ฐ (..) ๋ฅผ ์ฌ์ฉํด ํํํ๋ค.
/Users/ano/temp/directory ์์ /Users ๋ก ๊ฐ๊ณ ์ถ๋ค๋ฉด ์ ๋๊ฒฝ๋ก์์๋ ๊ทธ๋ฅ /Users ๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค. ์๋ ๊ฒฝ๋ก์์๋ ../../.. ๋ฅผ ํด์ผ 3 ๋๋ ํ ๋ฆฌ ์๋ก ์ฌ๋ผ๊ฐ /Users ๊ฐ ๋๋ค.
Reference
https://p-iknow.netlify.app/node-js/path-moudle/
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.