Tech Blog of Pinomaker
article thumbnail
Published 2023. 10. 11. 21:56
NestJS V10 마이그레이션 + SWC B.E/Nest JS

 

NestJS V10에서는 SWC를 사용하여 컴파일을 공식 지원합니다. 그 이외에도 다양한 변화가 있지만 그 변화는 아래의 글에 정리했으니 참고 해주세요.

 

 

Nestjs V10의 변화점

올해 NestJS에서 V10을 발표했다. 나는 좀 뒤늦게 알게 되었지만 처음 공부할 때가 V8에서 V9 막 넘어갈 때였는 데, 확실하게 업데이트가 빠른 프레임워크인 것 같다. NestJS V10에서 발표한 가장 큰 내

pinomaker.com

 

오늘은 NestJS를 V10으로 마이그레이션 한 후에 SWC를 적용하는 과정까지를 포스팅 합니다.

 

1. NestJS Project 생성하기.

 

먼저 Nest Cli를 이용하여 NestJS 프로젝트를 생성합니다.

npx nest new [project name]

 

 

Package Manager 선택이 나오는 데 저는 yarn을 사용하기에 yarn을 기준으로 포스팅 하겠습니다.

 

 

2. NestV10으로 Package 버전 변경하기

마이그레이션 하기 위해서는 공식 문서에서도 ncu(npm check updates)를 활용하여 Package 버전을 변경하라고 나와있습니다. 따라서 공식 문서에서 가이드해준 대로 ncu를 설치부터 해줍니다.

 

NCU는 package.json의 패키지들의 버전을 관리하는 툴 입니다.

 

 

npm-check-updates

Find newer versions of dependencies than what your package.json allows. Latest version: 16.14.5, last published: 7 days ago. Start using npm-check-updates in your project by running `npm i npm-check-updates`. There are 528 other projects in the npm registr

www.npmjs.com

 

해당 패키지는 특정 프로젝트에 종속되는 것이 아니기에, -g 옵션으로 전역으로 설치를 해줍니다. 만약 설치가 싫으시다면 npx를 사용하시는 방법도 있습니다.

yarn add -g npm-check-updates

 

자 이제 Project의 터미널을 열고 아래와 같이 입력합니다.

ncu -u -f /^@nestjs/

 

자 이제 Package를 V10으로 변경하는 과정은 끝났습니다. package.json 파일에 들어가면 NestJS 관련 패키지들의 버전이 10으로 변경되어있음을 확인이 가능합니다.

 

3. SWC 적용하기

NestJS의 패키지들을 V10으로 변경한 후 SWC를 사용하는 방법은 매우 간단합니다.

 

먼저 nest-cli.json 파일의 compilerOptions 옵션에 builder : swc만 추가합니다.

{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "deleteOutDir": true,
    "builder": "swc"
  }
}

 

마지막으로는 2가지의 패키지를 추가로 설치하면 됩니다.

yarn add -D @swc/cli @swc/core

 

이제 터미널에 해당 명령어를 입력하면 프로젝트가 실행됩니다.

nest start -b swc

 

 

4. 적용하면서 생긴 문제점

 

해당 포스팅은 새로운 프로젝트를 만들어서 진행해서 막히는 부분이 없었으나 기존에 NestJS + Typeorm의 프로젝트를 V10으로 마이그레이션 하면서 2가지의 문제를 해결했었다.

 

(1) Can't Not Find Module

나는 기존에 tsconfig.json에서 절대 경로를 설정하여 절대 경로를 사용하고 있었으나, 이상하게도 절대 경로를 사용하면 모듈들을 찾지 못 하는 이슈들이 발견 되어 모든 경로를 다시 상대 경로로 수정하는 작업을 진행했다.

 

찾아보니 아직은 모듈이 불안정해서 절대 경로를 인식하지 못 하는 거 같긴 한데, 이 점은 차차 업데이트 되면 좋겠다.

 

(2) Typeorm에서 Model들의 순환 참조

Typeorm와 같은 ORM을 사용할 경우에 SWC는 순환 참조를 잘 처리하지 못 하기에 다음과 같이 해결해야한다고 한다. Ralation으로 모델을 감싸서 참조하는 방식으로 변경하였다.

 

// ** v9
@OneToMany(() => WorkspaceUser, (worksapceUser) => worksapceUser.user)
workspaceUser: WorkspaceUser[];

// ** v10 + swc
@OneToMany(() => WorkspaceUser, (worksapceUser) => worksapceUser.user)
workspaceUser: Relation<WorkspaceUser>[];

profile

Tech Blog of Pinomaker

@pinomaker

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!