Typescript main.js moved under src dir?

들어가며

Nest.js + TypeORM + PostgreSQL
Nest JS에 DB를 연동해 보자

위 포스트에서 Nest.js와 TypeORM을 연동했습니다. Railway를 사용해 실제 Production 환경에 배포해 보았습니다. 다음은 Deploy Log입니다.

$ cross-env NODE_ENV=production node dist/main
node:internal/modules/cjs/loader:988
throw err;
^
Error: Cannot find module '/app/dist/main'
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:985:15)
at Function.Module._load (node:internal/modules/cjs/loader:833:27)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:22:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
yarn run v1.22.19

???????

문제 상황

Build까지는 문제 없이 잘 진행되었습니다. 오류를 자세히 보면 cross-env NODE_ENV=production node dist/main에서 문제가 생겼는데, 오류 내용을 더 읽다 보면 main 스크립트를 찾을 수가 없다고 나옵니다. main을 찾아보면 dist/src 디렉터리에 있습니다. package.json에 정의된 start:prod 스크립트는 main 스크립트를 dist 디렉터리에서 찾고 있었습니다. 기존에는 main 파일이 dist 디렉터리에 있어서 문제가 없었는데, 뭐가 문제여서 dist/src 디렉터리로 이동했을까요?

참고

작업 당시 Production 환경에 배포되어 있던 Commit입니다.

GitHub - majority-elite/dobiemon at 1ee94a1e1d32f559ba1bcd534c92a4d6e014289b
Contribute to majority-elite/dobiemon development by creating an account on GitHub.

문제가 된 Pull Request입니다. fix: locate dist main.js correctly Commit 직전까지 문제가 발생하고 있었습니다.

feat: integrate postgreSQL database for bill by Godbell · Pull Request #18 · majority-elite/dobiemon
automatically creates/syncs schema written as entities.

바뀐 거라고는 이전 포스트에서 작성한 내용들 뿐입니다. 그 중 무언가 차이가 있기 때문에 문제가 발생하는 것이겠죠?

구원자

Adding ormconfig to project changes build output in dist directory · Issue #1139 · nestjs/typeorm
Is there an existing issue for this? I have searched the existing issues Current behavior After adding an ormconfig to a project it changes the build output in the dist directory. Prior the project...

저와 똑같은 문제를 겪고 있는 Issue를 발견했습니다. 질문 내용은 다음과 같습니다.

After adding an ormconfig to a project it changes the build output in the dist directory.

ormconfig 파일을 추가한 뒤로 dist 디렉터리 내 빌드 결과물이 달라집니다.

답변 내용은 다음과 같습니다.

This will be true if you use ormconfig.ts. If it is a js file, the dist structure will not change (assuming you never import the js file). This is how Typescript works to ensure the dist directory has the same file import paths.

ormconfig.ts를 사용하고 있다면 정상적인 현상입니다. 만약 (해당 파일이) js 파일이었다면 dist 디렉터리 내 구조는 바뀌지 않았을 겁니다 (해당 파일을 어디선가 import한 적이 없다면 말이죠). dist 디렉터리가 같은 파일 import 경로를 보장하도록 하기 위해 Typescript가 사용하는 방식입니다.

즉, 기존에는 프로젝트의 src 디렉터리의 하위에만 Typescript 파일을 생성해 사용하다가, ormconfig.ts 파일을 src 디렉터리 밖에 생성한 것이 문제의 원인이라는 것입니다. Typescript가 공통된 src 디렉터리를 생략하고 있었던 겁니다.

결론

문제의 원인은 Typescript 파일이 존재하는 최상위 디렉터리 위치였습니다. 해결하는 방법은 두 가지가 있는데, 문제가 된 ormconfig.ts 파일을 src 파일 안으로 옮기거나, package.jsonstart:prod 스크립트에서 main 파일을 dist/src에서 찾도록 하는 방법이 있습니다. 저는 후자를 선택했습니다.