Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs Menu
Docs Home
/ /

튜토리얼: Vercel에 Next.js 애플리케이션 배포

이 튜토리얼에서는 MongoDB 에 연결하는 Next.js 애플리케이션 만드는 방법을 학습 . 또한 Next.js 애플리케이션을 호스팅하는 플랫폼인 Vercel에 애플리케이션 배포 방법도 학습 .

참고

이 튜토리얼에서는 Next.js가 버전 13에 도입한 앱 라우터 대신 Next.js 페이지 라우터 를 사용합니다.

시작하기 전에 다음 단계를 완료하세요.

이 튜토리얼에서는 다음 단계를 가이드합니다.

  • Next.js 애플리케이션 만듭니다.

  • MongoDB Next.js에 연결합니다.

  • Next.js에서 MongoDB 쿼리합니다.

  • Vercel에 애플리케이션 배포합니다.

1

with-mongodb 예시 템플릿을 사용하여 MongoDB 통합이 가능한 Next.js 애플리케이션 만들 수 있습니다.

MongoDB 통합을 사용하여 새 Next.js 애플리케이션 만들려면 터미널에서 다음 명령을 실행 .

npx create-next-app --example with-mongodb sample_mflix

이 명령은 npx create-next-app--example with-mongodb 매개 변수를 사용하여 MongoDB 통합 예시 에서 애플리케이션 만듭니다. sample_mflix 은 애플리케이션 의 이름입니다. 원하는 경우 다른 이름을 사용합니다.

명령이 완료되면 다음 명령을 실행 하여 프로젝트 디렉토리 로 이동합니다.

cd sample_mflix

다음 명령을 실행 하여 npm 종속성을 설치합니다.

npm install

Next.js 애플리케이션 시작하려면 다음 명령을 실행 .

npm run dev

애플리케이션 빌드된 후 브라우저에서 localhost:3000 로 이동합니다. 아직 MongoDB 연결 문자열 제공하지 않았기 때문에 페이지에 오류 메시지가 표시됩니다.

2

Next.js 애플리케이션 디렉토리 env.local.example 파일 이 포함되어 있습니다. 이 파일 이름을 env.local (으)로 바꾸고 엽니다. 파일 MONGODB_URI라는 하나의 속성 포함되어 있습니다.

MongoDB 연결 문자열 MONGODB_URI 속성 의 값으로 설정합니다. env.local 파일 은 다음 예시 와 유사합니다.

MONGODB_URI=<Your connection string>

구성을 확인하려면 터미널에서 다음 명령을 실행 하여 Next.js 애플리케이션 다시 시작합니다.

npm run dev

애플리케이션 이 빌드되면 브라우저에서 localhost:3000 로 이동합니다. with-mongodb Next.js 애플리케이션 시작 페이지가 표시됩니다.

'MongoDB 에 연결되었습니다'라는 메시지가 표시되면 연결이 성공적인 것입니다. "MongoDB 에 연결되어 있지 않습니다"라는 메시지가 표시되면 연결 문자열 확인하고 데이터베이스 사용자 및 네트워크 연결이 올바르게 구성되었는지 확인합니다.

3

Next.js는 데이터를 조회 하는 여러 가지 방법을 지원합니다. API 엔드포인트를 생성하거나, 페이지에 대해 서버 측 렌더링 함수를 실행 , 빌드 시 데이터를 가져와 정적 페이지를 생성할 수 있습니다. 이 튜토리얼에서는 세 가지 방법의 예시를 모두 보여줍니다.

새 API 엔드포인트 경로를 만들려면 pages 디렉토리 에 api 디렉토리 만듭니다. api 디렉토리 에 생성하는 각 파일 개별 API 엔드포인트가 됩니다.

api 디렉토리 에 movies.tsx라는 새 파일 만듭니다. 이 엔드포인트는 MongoDB 데이터베이스에서 영화 목록을 반환합니다. movies.tsx 파일 에 다음 코드를 추가합니다.

1import clientPromise from "../../lib/mongodb";
2import { NextApiRequest, NextApiResponse } from 'next';
3
4export default async (req: NextApiRequest, res: NextApiResponse) => {
5 try {
6 const client = await clientPromise;
7 const db = client.db("sample_mflix");
8 const movies = await db
9 .collection("movies")
10 .find({})
11 .sort({ metacritic: -1 })
12 .limit(10)
13 .toArray();
14 res.json(movies);
15 } catch (e) {
16 console.error(e);
17 }
18}

앞의 코드는 metacritic 평점을 기준으로 sample_mflix 데이터베이스 의 상위 10 영화를 내림차순으로 반환하는 API 엔드포인트를 만듭니다. res.json 메서드는 브라우저에 JSON 형식의 영화 배열 을 제공합니다. localhost:3000/api/movies(으)로 이동하면 브라우저에 데이터베이스 에서 반환된 영화 목록이 표시됩니다.

api 디렉토리 에 추가 파일을 생성하여 더 많은 API 경로를 추가합니다.

getServerSideProps() 메서드를 사용하여 Next.js 페이지로 직접 데이터를 가져올 수 있습니다. 이 메서드는 Next.js 페이지를 사용할 때 사용할 수 있습니다.

getServerSideProps() 메서드는 Next.js 페이지가 서버 측 렌더링을 사용하여 로드하도록 합니다. 페이지가 로드될 때마다 getServerSideProps() 메서드가 백엔드 에서 실행되고, 데이터를 가져와서 props를 통해 React 구성 요소로 보냅니다. getServerSideProps() 내부의 코드는 클라이언트 로 전송되지 않습니다.

pages 디렉토리 에 movies.tsx라는 새 파일 만듭니다. 다음 코드는 getServerSideProps() 를 사용하여 MongoDB 쿼리 방법을 보여줍니다.

1import clientPromise from "../lib/mongodb";
2import { GetServerSideProps } from 'next';
3
4interface Movie {
5 _id: string;
6 title: string;
7 metacritic: number;
8 plot: string;
9}
10
11interface MoviesProps {
12 movies: Movie[];
13}
14
15const Movies: React.FC<MoviesProps> = ({ movies }) => {
16 return (
17 <div>
18 <h1>Top 20 Movies of All Time</h1>
19 <p>
20 <small>(According to Metacritic)</small>
21 </p>
22 <ul>
23 {movies.map((movie) => (
24 <li key={movie._id}>
25 <h2>{movie.title}</h2>
26 <h3>{movie.metacritic}</h3>
27 <p>{movie.plot}</p>
28 </li>
29 ))}
30 </ul>
31 </div>
32 );
33};
34
35export default Movies;
36
37export const getServerSideProps: GetServerSideProps = async () => {
38 try {
39 const client = await clientPromise;
40 const db = client.db("sample_mflix");
41 const movies = await db
42 .collection("movies")
43 .find({})
44 .sort({ metacritic: -1 })
45 .limit(20)
46 .toArray();
47 return {
48 props: { movies: JSON.parse(JSON.stringify(movies)) },
49 };
50 } catch (e) {
51 console.error(e);
52 return { props: { movies: [] } };
53 }
54};

Movies 페이지 구성 요소는 getServerSideProps() 메서드에서 프롭을 수신하고 해당 데이터를 사용하여 페이지를 렌더링합니다. 이 페이지에는 인기 영화 제목, 메타크리틱 평점 및 줄거리가 표시됩니다.

참고

getServerSideProps() 메서드는 페이지가 호출될 때마다 실행됩니다. 데이터가 자주 변경되지 않는 경우 대신 정적 페이지 생성을 사용합니다.

정적 페이지 생성을 사용하여 빌드 시 페이지를 미리 렌더링할 수 있습니다. 이 방법은 데이터가 자주 변경되지 않을 때 유용합니다.

pages 디렉토리 에 top.tsx라는 새 파일 만듭니다. 다음 코드는 getStaticProps() 를 사용하여 MongoDB database 에서 최고 평점을 받은 영화 1,000편을 렌더링하는 방법을 보여줍니다.

1import { ObjectId } from "mongodb";
2import clientPromise from "../lib/mongodb";
3import { GetStaticProps } from "next";
4
5interface Movie {
6 _id: ObjectId;
7 title: string;
8 metacritic: number;
9 plot: string;
10}
11
12interface TopProps {
13 movies: Movie[];
14}
15
16export default function Top({ movies }: TopProps) {
17 return (
18 <div>
19 <h1>Top 1000 Movies of All Time</h1>
20 <p>
21 <small>(According to Metacritic)</small>
22 </p>
23 <ul>
24 {movies.map((movie) => (
25 <li key={movie._id.toString()}>
26 <h2>{movie.title}</h2>
27 <h3>{movie.metacritic}</h3>
28 <p>{movie.plot}</p>
29 </li>
30 ))}
31 </ul>
32 </div>
33 );
34}
35
36export const getStaticProps: GetStaticProps<TopProps> = async () => {
37 try {
38 const client = await clientPromise;
39
40 const db = client.db("sample_mflix");
41
42 const movies = await db
43 .collection("movies")
44 .find({})
45 .sort({ metacritic: -1 })
46 .limit(1000)
47 .toArray();
48
49 return {
50 props: { movies: JSON.parse(JSON.stringify(movies)) },
51 };
52 } catch (e) {
53 console.error(e);
54 return {
55 props: { movies: [] },
56 };
57 }
58};

localhost:3000/top(으)로 이동하면 브라우저에 영화 목록이 표시됩니다.

개발 모드 에서는 애플리케이션 이 getServerSideProps() 메서드와 유사할 때마다 getStaticProps() 메서드를 호출합니다. 프로덕션 모드 에서는 /top 페이지가 사전 렌더링되고 거의 즉시 로드됩니다.

Next.js 애플리케이션 프로덕션 모드 로 실행 하려면 먼저 빌드 . 그런 다음 start 명령을 실행 빌드된 애플리케이션 제공 . 터미널에서 다음 명령을 실행합니다.

npm run build
npm run start

npm run start 명령을 실행 하면 Next.js가 프로덕션 모드 에서 애플리케이션 제공합니다. Next.js는 페이지를 정적으로 제공하기 때문에 /top 경로 액세스 할 때마다 getStaticProps() 메서드가 실행 는 않습니다. 사전 렌더링된 정적 페이지를 보려면 .next/server/pages/top.html 파일 확인합니다.

4

Vercel에서 MongoDB 사용하여 Next.js 애플리케이션 배포합니다. 배포 전에 이전 단계의 애플리케이션 코드를 GitHub 리포지토리 에 커밋 해야 합니다. GitHub 계정을 만들고 리포지토리에 커밋하는 방법을 배우려면 GitHub 설명서를 참조하세요.

코드를 리포지토리에 커밋 후 Vercel 로 이동하여 로그인. Vercel 대시보드 에서 Import Project (프로젝트 가져오기) 버튼을 클릭한 다음 Import Git Repository(Git 리포지토리 가져오기)를 클릭합니다.

GitHub 리포지토리 URL 입력하고 계속을 클릭합니다. 다음 화면에서 env.local 파일 의 변수를 추가합니다.

배포 버튼을 클릭합니다. Vercel은 Next.js 애플리케이션 자동으로 빌드하고 배포합니다. 완료되면 애플리케이션 에 액세스 할 수 있는 URL 을 받게 됩니다.

참고

Vercel은 동적 IP 주소를 사용하므로 MongoDB Atlas 대시보드 의 모든 IP 주소 에서 데이터에 액세스 하려면 예외를 추가해야 합니다. 이렇게 하려면 네트워크 액세스 탭으로 이동하여 Add IP Address 버튼을 클릭한 다음 어디에서든 액세스 허용 버튼을 클릭합니다.

이 튜토리얼의 개념에 대한 자세한 내용은 다음 리소스를 참조하세요.

돌아가기

Prisma 와 통합

이 페이지의 내용