내일배움캠프 TIL (230304): typeorm-extension seed로 dummy data 넣기

Jiumn·2023년 3월 4일
0

typeorm-extension seed로 dummy data 넣기

현재 typeorm 0.3.0 버전에서는 typeorm-seeding 모듈을 사용할 수 없기 때문에 대신 typeorm-extension의 seed 기능을 사용해야 한다.

typeorm-extension 공식문서를 참고하여 dataSource.ts 파일과 seeds 안에 seeder 파일을 작성한 후 npm run seed 명령어로 실행해봤다. 다른 코드에는 문제가 없었는데 경로 지정이 잘못 되어 몇 시간 동안 애를 먹었다. 같은 에러를 겪는 분들께 도움이 될까 하여 남긴다.

cannot find module 'entity 경로' error 발생

cannot find module 에러는 보통 해당 모듈의 이름이나 경로를 인식할 수 없을 때 발생한다. 자주 봤던 에러라서 dataSource 파일과 seeder 파일에 import된 entity 경로를 계속 살펴봤는데, 해당 코드 위에는 에러 표시가 안 떠서 한참을 헤맸다.

구글링을 하다가 typeorm-extension은 절대경로를 이해하지 못해서 package.json의 script(seed 실행 명령문)에 '-r tsconfig-paths/register'를 추가해줘야 한다는 내용을 발견했다.

"seed": "ts-node -r tsconfig-paths/register ./node_modules/typeorm-extension/dist/cli/index.js seed",

아래는 변경 전 내 프로젝트의 seed script다.

"seed": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js seed -d ./dataSource.ts",

혹시나해서 이 script 중간에 '-r tsconfig-paths/register'를 넣어줬더니 seed가 정상 작동되는 것이었다 ❕

팀원과 원인을 분석해보니 역시 문제는 경로 지정에 있었다.

seed를 삽입하는 script(npm run seed)는 서버와는 별도로 작동된다. 따라서 실행되는 seeder 파일과 dataSource 파일을 기준으로 위치한 entity의 상대경로를 입력해줘야 하는 것이다.

즉, dataSource 파일에서 실행을 한다면 dataSource 파일을 기준으로 entity의 위치를 경로로 잡아야 하는 것이다.

dataSource.ts
- 변경 전

import { WorkShop } from 'src/entities/workshop';
  • 변경 후
import { WorkShop } from './src/entities/workshop';

workshop.seeder.ts

  • 변경 전
import { WorkShop } from 'src/entities/workshop';
  • 변경 후
import { WorkShop } from '../../entities/workshop';

위와 같이 변경하고 script에 삽입했던 -r tsconfig-paths/register를 지워주자 역시나 정상 작동했다.

'TypeError: seeder is not a constructor' error 발생

그런데 추가로 발생한 문제는 분명히 정상적으로 sql 쿼리 실행이 된 후 TypeError: seeder is not a constructor라는 에러 메시지가 뜨는 것이었다.

seeder는 database > seeds 하위에 있는 seed를 삽입해주는 파일 안에 있는 클래스다. 이번에는 seeder가 정상적으로 작동하지 않는 것으로 보였다.

seeds 폴더를 잘 살펴보니 폴더 안에 파일이 두 개였다. 정상작동되는 파일과 내용이 빈 파일이 있어서 후자를 삭제했더니 에러 문구가 나타나지 않았다.

seeds 폴더 안에 있는 seeder를 모두 실행하라고 명령했는데 하나는 빈 파일이라서 seeder를 찾을 수 없으니 발생한 오류였던 것이다.

profile
Back-End Wep Developer. 꾸준함이 능력이다. Node.js, React.js를 주로 다룹니다.

0개의 댓글