sequelizerc ESM적용

송인재·2023년 12월 18일
0
post-thumbnail

개요


데이터베이스의 관련 정보들을 담고 있는 config 파일의 경우 json파일로 정보들을 하드코딩하게 된다면 내 관련 정보들이 git에 올라가므로, js파일로 변환한 후, env파일을 불러오는 방식으로 관리해야했다.

그리고 배포하려고 하니, 아래와 같이 오류가 났다.

sequelize-cli 파일에서 config.json을 찾고 있는데, 이를 찾지 못하고 있었다.
이를 해결하기 위해서는 .sequelizerc 을 아래와 같이 작성하면 됐다.

const path = require("path");

module.exports = {
  "config": path.resolve("src/config", "config.js"),
  "models-path": path.resolve("src", "models"),
};

하지만 이러한 방식을 작성함에도 이러한 오류가 뜰 것이다.

그 이유는 sequelize-cli의 라이브러리에서 sequelizerc를 불러올때 아래와 같이 CJS(commonjs) 형식으로 불러오기 때문이다.

node_modules/sequelize-cli/lib/core/yargs.js

function loadRCFile(optionsPath) {
  const rcFile = optionsPath || _path.default.resolve(_process.default.cwd(), '.sequelizerc');
  const rcFileResolved = _path.default.resolve(rcFile);
  return _fs.default.existsSync(rcFileResolved) ? JSON.parse(JSON.stringify(require(rcFileResolved))) : {};
}

ESM(ES Modules) 방식은 CJS(CommonJs) 방식을 읽어낼 수 있지만,
CJS는 ESM 방식을 읽어낼 수 없다.

왜냐하면 CJS 방식은 코드가 실행될 때 모듈을 로드하고 ESM 방식은 코드가 실행되기 전에 모듈을 로드하기 때문이다.

해결방법


이를 해결하기 위한 방법은 생각보다 간단하다.
CJS 방식으로 바꾸면 된다!!!
정확히는 CJS 방식으로 컴파일 한 뒤, 이를 .sequelizerc 에 연결하면 된다.

tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
  }

이와같이 작성한뒤, npx tsc 명령어로 빌드한 뒤에
이에 맞게 .sequelizerc 파일 경로를 바꾸면 된다.

const path = require("path");

module.exports = {
  config: path.resolve("dist/config", "config.js"),
  "models-path": path.resolve("dist", "models"),
};

그렇게 한다면 아래와 같이, 성공코드를 맛 볼 수 있을것이다:)

해결을 위한 우여곡절(TMI)


처음엔 그저 GPT에 물어봐서 해결하려했다.
하지만 GPT에게 물어보면 볼 수록 산으로 가는 기분...

그리고 에러 코드 자체를 구글에 가져다 붙이니,
나의 오류 상황에 맞는 글을 찾을 수 없었다.
오히려 또 산으로 간 기분이었다.

그러다가 exports field가 정답이라고 생각해서,
이를 열심히 파보며 공부해봤지만,
공부하면 할수록 올바른 정답같아 보이진 않았다.

그래서 오류 log를 보며, 어떤 파일에서 오류가 나고 있는지를 확인하고
node_modules에서 해당 라이브러리의 코드를 하나하나 곱씹어보며 읽어봤고

해당 라이브러리에서 sequlizerc의 path를 읽어낸 뒤에,
해당 path를 require하는 것을 알아낼 수 있었고,

결국엔 사용하지 않았던 exports field를 공부하며
CJS방식에서 ESM방식을 require 할 수 없다는 것을 깨달았기에
CJS방식으로 돌릴 방법을 찾다가, 해결을 하게 되었다!

이제부터는 쉽게 외부의 도움으로 해결하려하지 말고,
오류의 원인을 스스로 생각해보고 그에 맞게 해결책을 생각해보자!

profile
꿈을 꾸고 도전하기🌟

0개의 댓글