Node.Js 에서 import의 절대경로(Absolute Path) 지옥 탈출기

Posted by , February 08, 2022
NodeJS
Series ofNodeJS

최근에 Node.JS 쪽으로 개발을 진행해보고 있다.
Spring boot만 쓰다가 새롭게 해보니까 신기한게 많았다.
그리고 jQuery만 쓰고 수준 낮은 형태의 JS 개발을 했었던 내 개발 방법이 싫어서 이번에 JS도 다시 제대로 배워보고 있다.

근데 Node에서 아주 답답한게 있었다....
난 ES6 형식으로 개발하는데 모듈을 임포트할 때 아래와 같은 문제가 있었다.

import * as init from "../../config/main_init.js"
import * as auth from "../../middleware/auth.js";

저 경로 보이는가?
처음에 몇개 간단하게 쓸 때는 안거슬렸는데 점점 코드가 늘어나면서 상당히 귀찮게 되었다.

게다가 해당 파일의 위치가 변경될 경우 이 부분도 문제가 되었다.
그래서 구글에 이것저것 찾아보는데 이쪽으론 어떤 식으로 키워드를 넣어야 할지 몰라서 좀 삽질했다.

사실 간단한 패키지 하나 설치하면 끝났을 문제기도 한데...난 뭔가 더 설치하기가 좀 불편했다.
덕지덕지 쌓이기만 할 뿐더러 보안 문제가 생길수도 있을거 같아서 사람이 많이 받아서 쓰거나 가급적 안쓰는 방식으로 진행했다.


해결법 (Node 14.6.0 이상 또는 12.19.0)

위에서 나온 버전에 해당되는 경우 아주 간단하게 그리고 다른 패키지를 설치하지 않고 해결할 수 있다.
먼저 package.json에서 다음과 같이 작성한다.

{
  ...
  "license": "None",
	"type": "module",
	"imports": {
            ...
            "#middleware/*": "./some_path/src/middleware/*",
            "#config/*": "./some_path/src/config/*",
            "#route/*": "./some_path/src/route/*",
            "#entity/*": "./some_path/src/entity/*",
            "#util/*": "./some_path/src/utils/*"
            ...
	},
	"scripts": {
		"dev": " nodemon ./start.js",
  }
  ....
}

위에서 잘 봐야 할 부분은 import 부분이다. 여기서 양식은 아래와 같다.

[#지정 경로명/*] :  [실제 경로명]

앞은 **#**을 붙이고 원하는 경로명을 적고 /*  로 마무리를 적고, 뒤는 실제 경로면을 적으면 끝. 그럼 코드에서 아래와 같이 import 할 수 있다.

import * as init from "#config/main_init.js"
import * as auth from "#middleware/auth.js";

이렇게 사용이 가능하다.


해결법 (위 버전이 아닌 경우...)

이 경우에는 패키지를 설치하는게 좋다... module-alias 라는 패키지인데 이걸로 해결하는게 깔끔할듯..

여담인데 난 이 방법은 안써봤다.

참고 링크

https://stackoverflow.com/questions/33214780/how-to-have-path-alias-in-nodejs