개요
이 튜토리얼에서는 MongoDB 에 연결하는 Next.js 애플리케이션 만드는 방법을 학습 . 또한 Next.js 애플리케이션을 호스팅하는 플랫폼인 Vercel에 애플리케이션 배포 방법도 학습 .
참고
이 튜토리얼에서는 Next.js가 버전 13에 도입한 앱 라우터 대신 Next.js 페이지 라우터 를 사용합니다.
전제 조건
시작하기 전에 다음 단계를 완료하세요.
MongoDB 시작하기 가이드 완료하여 새 Atlas 계정을 설정하다 하고 샘플 데이터를 새 무료 계층 MongoDB deployment 에 로드합니다.
클러스터의 연결 문자열 가져오고 이 튜토리얼의 뒷부분에서 사용할 수 있도록 저장합니다.
Vercel 웹사이트방문하여 Vercel 계정을 생성합니다.
Node.js 버전 18 이상을 다운로드합니다.
튜토리얼
이 튜토리얼에서는 다음 단계를 가이드합니다.
Next.js 애플리케이션 만듭니다.
MongoDB Next.js에 연결합니다.
Next.js에서 MongoDB 쿼리합니다.
Vercel에 애플리케이션 배포합니다.
Next.js 애플리케이션 만들기
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 연결 문자열 제공하지 않았기 때문에 페이지에 오류 메시지가 표시됩니다.
MongoDB Next.js에 연결
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 에 연결되어 있지 않습니다"라는 메시지가 표시되면 연결 문자열 확인하고 데이터베이스 사용자 및 네트워크 연결이 올바르게 구성되었는지 확인합니다.
Next.js에서 MongoDB 쿼리
Next.js는 데이터를 조회 하는 여러 가지 방법을 지원합니다. API 엔드포인트를 생성하거나, 페이지에 대해 서버 측 렌더링 함수를 실행 , 빌드 시 데이터를 가져와 정적 페이지를 생성할 수 있습니다. 이 튜토리얼에서는 세 가지 방법의 예시를 모두 보여줍니다.
예시 1: MongoDB 용 Next.js API 엔드포인트 만들기
새 API 엔드포인트 경로를 만들려면 pages 디렉토리 에 api 디렉토리 만듭니다. api 디렉토리 에 생성하는 각 파일 개별 API 엔드포인트가 됩니다.
api 디렉토리 에 movies.tsx라는 새 파일 만듭니다. 이 엔드포인트는 MongoDB 데이터베이스에서 영화 목록을 반환합니다. movies.tsx 파일 에 다음 코드를 추가합니다.
1 import clientPromise from "../../lib/mongodb"; 2 import { NextApiRequest, NextApiResponse } from 'next'; 3 4 export 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 경로를 추가합니다.
예시 2: MongoDB 사용하는 Next.js 페이지
getServerSideProps() 메서드를 사용하여 Next.js 페이지로 직접 데이터를 가져올 수 있습니다. 이 메서드는 Next.js 페이지를 사용할 때 사용할 수 있습니다.
getServerSideProps() 메서드는 Next.js 페이지가 서버 측 렌더링을 사용하여 로드하도록 합니다. 페이지가 로드될 때마다 getServerSideProps() 메서드가 백엔드 에서 실행되고, 데이터를 가져와서 props를 통해 React 구성 요소로 보냅니다. getServerSideProps() 내부의 코드는 클라이언트 로 전송되지 않습니다.
pages 디렉토리 에 movies.tsx라는 새 파일 만듭니다. 다음 코드는 getServerSideProps() 를 사용하여 MongoDB 쿼리 방법을 보여줍니다.
1 import clientPromise from "../lib/mongodb"; 2 import { GetServerSideProps } from 'next'; 3 4 interface Movie { 5 _id: string; 6 title: string; 7 metacritic: number; 8 plot: string; 9 } 10 11 interface MoviesProps { 12 movies: Movie[]; 13 } 14 15 const 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 35 export default Movies; 36 37 export 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() 메서드는 페이지가 호출될 때마다 실행됩니다. 데이터가 자주 변경되지 않는 경우 대신 정적 페이지 생성을 사용합니다.
예시 3: MongoDB 사용한 Next.js 정적 생성
정적 페이지 생성을 사용하여 빌드 시 페이지를 미리 렌더링할 수 있습니다. 이 방법은 데이터가 자주 변경되지 않을 때 유용합니다.
pages 디렉토리 에 top.tsx라는 새 파일 만듭니다. 다음 코드는 getStaticProps() 를 사용하여 MongoDB database 에서 최고 평점을 받은 영화 1,000편을 렌더링하는 방법을 보여줍니다.
1 import { ObjectId } from "mongodb"; 2 import clientPromise from "../lib/mongodb"; 3 import { GetStaticProps } from "next"; 4 5 interface Movie { 6 _id: ObjectId; 7 title: string; 8 metacritic: number; 9 plot: string; 10 } 11 12 interface TopProps { 13 movies: Movie[]; 14 } 15 16 export 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 36 export 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 파일 확인합니다.
Vercel에 애플리케이션 배포
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 버튼을 클릭한 다음 어디에서든 액세스 허용 버튼을 클릭합니다.
추가 리소스
이 튜토리얼의 개념에 대한 자세한 내용은 다음 리소스를 참조하세요.