들어가기 전에
Nest.js는 Node.js 진영에서 널리 쓰이고 있는 서버 프레임워크이다.
그리고 이런 서버를 클라우드 환경에 배포하기 위해서는 AWS EC2, Oracle Cloud 등의 컴퓨팅 인스턴스 위에 올리는 방법이 정석이겠다.
하지만 Nest.js는 서버리스를 지원하고, Vercel은 서버리스를 지원한다.
이를 이용해서 무료로 간단히 Vercel에 서버를 배포할 수 있다.
방법
방법 자체는 간단하다.
프로젝트 최상단에 vercel.json
을 만들고 다음과 같이 작성한다.
{
"version": 2,
"builds": [
{
"src": "src/main.ts",
"use": "@vercel/node"
}
],
"routes": [
{
"src": "/(.*)",
"dest": "src/main.ts",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
]
}
]
}
그 후 npm install -g vercel
을 실행한 후, 프로젝트 최상단 경로에서 vercel .
를 실행하면 완성된다.
트러블슈팅
Cannot find module
배포를 했지만 다음과 같은 오류가 떠서 처음에 큰 고생을 했다.
Vercel에서 로그를 확인해보니 아래와 같은 에러 로그가 있었다.
2023-08-18T17:52:14.322Z undefined ERROR Cannot find module 'src/infra/prisma/PrismaService'
Require stack:
- /var/task/src/feed/feed.module.js
- /var/task/src/app.module.js
- /var/task/src/main.js
2023-08-18T17:52:14.323Z undefined ERROR Did you forget to add it to "dependencies" in `package.json`?
RequestId: 059dec36-4319-4851-9c23-3ecf01978f18 Error: Runtime exited with error: exit status 1
Runtime.ExitError
분명 잘 존재하는 모듈을 발견하지 못하고 있다고 에러가 떴다.
왜;;인지 도저히 알기가 어려워 많이 헤맸는데, 문제는 내 import 문에 있었다.
import { PrismaService } from '@/infra/prisma/PrismaService';
다음과 같이 path alias를 사용해서 절대 경로로 import 하는 경우 Vercel이 경로를 인식을 못하는 이슈였다.
src/infra/prisma/PrismaService
처럼 @를 안 쓰고 절대경로로 쓰더라도 마찬가지였다.
상대경로로 작성해야 한다!
Swagger 페이지 404 에러 (아직 미해결)
다른 페이지는 잘 나오지만 Swagger 페이지만 아무것도 안 나오는 이슈 (404 에러)가 발생한다.
Uncaught ReferenceError: SwaggerUIBundle is not defined
at window.onload
개발자 도구를 켜보면 이런 로그가 나온다.