캡스톤디자인

Next.js, Nest.js 시작하기

비숑주인 2024. 11. 21. 16:31

나는 다음과 같은 구조로 프로젝트 폴더를 생성했다. 

프로젝트/
├── client/         # Next.js 프로젝트
└── server/         # Nest.js 프로젝트

 

Next.js는 실행 명령이 npm run dev이고 Nest.js는 실행 명령이 npm run start:dev 여서 한번에 실행 할 수 있도록 합치기로 했다. 

 

먼저 루트 디렉토리에 concurrently를 설치한다

npm init -y
npm install concurrently --save-dev

 

그리고 루트 디렉토리의 package.json에 다음과 같이 설정해준다. 

{
  "name": "your-project-name",
  "version": "1.0.0",
  "scripts": {
    "client": "cd client && npm run dev",
    "server": "cd server && npm run start:dev",
    "dev": "concurrently \"npm run server\" \"npm run client\""
  },
  "devDependencies": {
    "concurrently": "^8.2.0"
  }
}

 

이렇게 하면 아래 명령어로 프론트와 백을 동시에 실행할 수 있다

 

npm run dev

 

근데 나는 서버 자체는 열리는데 아래와 같은 에러가 떴다...

 

이 오류는 포트 충돌 문제를 나타난다고 한다. Next.js와 Nest.js가 모두 기본적으로 3000번 포트를 사용하려고 하기 때문에 발생하는 에러인 것이다. 나는 CORS 설정으로 프론트와 백의 서버를 분리해줬다. 

 

CORS(Cross-Origin Resource Sharing)는 웹 브라우저의 보안 정책 중 하나이며, 다른 출처(도메인, 포트, 프로토콜)의 리소스를 요청할 때 발생하는 제한을 관리하는 메커니즘이다. 

 

예를 들어:
프론트엔드: http://localhost:3000
백엔드: http://localhost:3001


이렇게 포트가 다른 경우, 프론트엔드에서 백엔드로 API 요청을 보낼 때 CORS 에러가 발생할 수 있다. 
이 때 app.enableCors()를 사용하여 이러한 CORS 제한을 해제할 수 있다. 

 

그럼 왜 프론트와 백이 같은 서버에서 돌리면 안되는가? React와 Flask로 개발할 때는 잘만 돌렸는데!!

Next.js와 React+Flask의 구조는 조금 다르다고 한다. 

 

React+Flask 구조

프로젝트/
├── static/          # React 빌드 파일들이 여기로 들어감
├── templates/       # Flask의 템플릿
└── app.py          # Flask 서버

 

- React는 빌드하면 정적 파일들(HTML, CSS, JS)이 생성됨
- Flask가 이 정적 파일들을 서빙하면서 동시에 API 서버 역할도 수행
결과적으로 하나의 서버에서 모든 것을 처리


Next.js + Nest.js 구조

프로젝트/
├── client/         # Next.js 프로젝트
└── server/         # Nest.js 프로젝트

 

- Next.js는 서버사이드 렌더링(SSR)을 지원하는 독립적인 서버
- 자체적으로 서버 기능이 있어서 라우팅, 페이지 렌더링 등을 처리
- 개발 시 실시간 코드 수정과 새로고침(Hot Reload) 기능을 위해 별도 서버가 필요


물론 프로덕션 환경에서는 밑의 방법들로 Next.js와 Nest.js를 같은 서버에서 돌릴 수 있다

1. Next.js를 빌드해서 정적 파일 생성
2. Nest.js에서 이 정적 파일들을 서빙
3. 하나의 포트에서 모든 것을 처리


하지만 개발 환경에서는 빠른 빌드, 독립적인 에러 처리 등등  여러가지 이유로 분리하는 것이 좋다고 한다.