Docs Menu
Docs Home
/ /

MongoDB React 와 통합

이 가이드 에서는 MERN 스택 사용하는 React 웹 애플리케이션 만드는 방법을 학습 수 있습니다. MERN 스택 MongoDB, Express, React 및 Node.js를 사용하는 웹 개발 프레임워크 이며 다음과 같은 계층으로 구성되어 있습니다.

  • 데이터베이스 계층: MongoDB 데이터 저장 및 검색을 제공합니다.

  • 애플리케이션 계층: Express 와 Node.js는 서버 측 로직의 중간 계층 구성합니다.

  • 프레젠테이션 계층: React 사용자 인터페이스와 프론트엔드 상호 작용을 구현합니다.

React 애플리케이션 데이터를 MongoDB 에 저장하면 문서 데이터 모델 사용하여 복잡한 쿼리 표현식을 빌드 수 있습니다. 문서 모델의 유연성으로 중첩된 데이터 구조를 저장 하고 애플리케이션 설계를 빠르게 반복할 수 있습니다. MongoDB의 수평 확장 기능을 사용하여 애플리케이션 쉽게 확장할 수도 있습니다.

MongoDB 사용한 MERN 스택 동적이고 진화하는 데이터 구조가 필요한 애플리케이션을 지원합니다. 따라서 이 프레임워크 실시간 대시보드나 콘텐츠를 지속적으로 업데이트 한 페이지짜리 애플리케이션과 같은 실제 애플리케이션에 적합하게 설계되었습니다.

이 튜토리얼에서는 MERN 스택 사용하여 웹 애플리케이션 빌드 방법을 보여줍니다. 애플리케이션 샘플 레스토랑 데이터에 액세스하고, 데이터를 쿼리하고, 로컬에서 호스팅되는 사이트 에 결과를 표시합니다. 이 튜토리얼에는 MongoDB Atlas 에서 호스팅되는 MongoDB cluster 에 연결하고 데이터베이스 의 데이터에 액세스하고 표시하는 방법에 대한 지침도 포함되어 있습니다.

React 없이 Node.js 운전자 사용하여 MongoDB 에 연결하려는 경우 Node.js 드라이버 시작하기 가이드 참조하세요.

이 섹션의 단계에 따라 프로젝트 종속성을 설치하고, Atlas cluster 만들고, 애플리케이션 디렉토리를 설정하다 .

1

Quick Start 애플리케이션을 생성하려면 개발 환경에 다음 소프트웨어가 설치되어 있어야 합니다.

전제 조건
참고 사항

최신 LTS 또는 최신 릴리스 버전을 다운로드합니다.

코드 편집기

이 튜토리얼에서는 Visual Studio Code를 사용하지만 원하는 편집기를 사용할 수 있습니다.

터미널 앱 및 셸

MacOS 사용자의 경우 터미널 또는 유사한 앱을 사용하세요. Windows 사용자의 경우 PowerShell을 사용하세요.

2

MongoDB Atlas 는 MongoDB 배포를 호스팅하는 완전 관리형 클라우드 데이터베이스 서비스입니다. MongoDB deployment 없는 경우,MongoDB 시작하기 튜토리얼을 완료하여 무료로 MongoDB cluster 생성할 수 있습니다( 크레딧 카드 필요 없음). MongoDB 시작하기 튜토리얼에서는 sample_restaurants 이 튜토리얼에서 사용되는 데이터베이스 포함하여 샘플 데이터 세트를 클러스터 에 로드하는 방법도 보여줍니다.

MongoDB cluster 에 연결하려면 연결 URI를 사용해야 합니다. 연결 URI를 조회 방법을 학습 MongoDB 시작하기 튜토리얼의 연결 문자열 추가하기 섹션을 참조하세요.

연결 string 을 안전한 위치 에 저장합니다.

3

터미널에서 다음 명령을 실행하여 react-quickstart라는 프로젝트 디렉토리 만듭니다.

mkdir react-quickstart
cd react-quickstart

그런 다음 react-quickstart 디렉토리 에서 다음 명령을 실행 server 이라는 이름의 백엔드 폴더를 만들고 package.json 파일 초기화합니다.

mkdir server
cd server
npm init -y
4

디렉토리 의 package.json 파일 로 react-quickstart/server 이동합니다. 재사용을 위해 JavaScript 코드를 패키징하는 표준 형식인 ECMAScript 모듈을 사용하려면 필드 지정하는 기존 줄을 "type" 다음 줄로 바꾸세요.

"type": "module",

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

npm install mongodb express cors

이 명령은 MongoDB, Express 웹 프레임워크 및 교차 출처 리소스 공유 가능하게 하는 cors Node.js 패키지 설치합니다.

프로젝트 구조 및 종속성을 설정한 후 이 섹션의 단계에 따라 웹 서버 구성하고 MongoDB 에 연결합니다.

1

react-quickstart/server 디렉토리 에 server.js 라는 파일 만들고 다음 코드를 붙여넣습니다.

react-quickstart/ 서버/ 서버.js
import express from "express";
import cors from "cors";
import restaurants from "./routes/restaurant.js";
const PORT = process.env.PORT || 5050;
const app = express();
app.use(cors());
app.use(express.json());
app.use("/restaurant", restaurants);
// start the Express server
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
2

server 디렉토리 에서 다음 변수를 저장하는 config.env 파일 만듭니다.

MONGODB_URI=<connection URI>
PORT=5050

자리 표시자를 <connection URI> 이전 단계에서저장한 연결 URI로 바꿉니다.

3

server 디렉토리 에서 routes이라는 하위 디렉토리를 만듭니다. routes 하위 디렉토리에 restaurant.js 라는 파일 만들고 다음 코드를 붙여넣습니다.

react-quickstart/ 서버/routes/restaurant.js
import express from "express";
import db from "../db/connection.js";
// Creates an instance of the Express router, used to define our routes
const router = express.Router();
// Gets a list of all the restaurants
router.get("/", async (req, res) => {
let collection = await db.collection("restaurants");
let results = await collection.find({}).toArray();
res.send(results).status(200);
});
// Lists restaurants that match the query filter
router.get("/browse", async (req, res) => {
try {
let collection = await db.collection("restaurants");
let query = {
borough: "Queens",
name: { $regex: "Moon", $options: "i" },
};
let results = await collection.find(query).toArray();
res.send(results).status(200);
} catch (err) {
console.error(err);
res.status(500).send("Error browsing restaurants");
}
});
export default router;

이 파일 sample_restaurants 데이터베이스 의 restaurants 컬렉션 에 액세스하고 다음 GET 엔드포인트를 정의합니다.

  • /: 샘플 컬렉션 에서 모든 레스토랑을 조회합니다.

  • /browse: 쿼리 기준과 일치하는 레스토랑을 조회하며, 이름에 "Moon" 라는 단어가 포함된 퀸즈의 레스토랑을 필터링합니다.

애플리케이션의 백엔드를 설정한 후 이 섹션의 단계에 따라 React 구성하고 프론트엔드 구성 요소를 추가합니다.

1

디렉토리 에서 다음 react-quickstart 명령을 실행 Vite를 사용하여 React 템플릿 파일을 추가합니다.

npm create vite@latest client

이 명령은 일련의 구성 질문에 응답하라는 메시지를 표시합니다. 각 질문에 대해 드롭다운 메뉴에서 다음 응답을 선택합니다.

  • 프레임워크선택 : React

  • 변형 선택: JavaScript

  • Rolldown-vite(실험 단계)를 사용하시겠습니까?: 아니요

  • npm 으로 설치하고 지금 시작하시겠습니까?: 아니요

명령을 실행 하면 프로젝트 에 프런트엔드 스캐폴딩이 포함된 client 디렉토리 생깁니다.

2

이 샘플 애플리케이션 UI 서식 지정에 Tailwind CSS 프레임워크 사용합니다. 설치하려면 이전 단계에서 만든 client 디렉토리 로 이동하여 다음 명령을 실행 .

npm install tailwindcss @tailwindcss/vite

설치 후 vite.config.js 파일 로 이동합니다. 강조 표시된 줄에 표시된 대로 가져오기 문과 plugins 배열 업데이트하여 @tailwindcss/vite 플러그인을 추가합니다.

react-quickstart/ 클라이언트/vite.config.js
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
// https://vite.dev/config/
export default defineConfig({
plugins: [
react(),
tailwindcss()
],
})

그런 다음 client/src/index.css 파일 로 이동하여 다음 가져오기 성명서 추가합니다.

@import "tailwindcss";
3

React 에 대한 클라이언트 사이드 페이지 라우팅을 활성화 하려면 client 디렉토리 에서 다음 명령을 실행 하여 react-router-dom 패키지 설치합니다.

npm install -D react-router-dom
4

client/src/main.jsx 파일 로 이동하여 다음 코드를 붙여넣습니다.

react-quickstart/ 클라이언트/src/main.jsx
import * as React from "react";
import * as ReactDOM from "react-dom/client";
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import App from "./App";
import RestaurantList from "./components/RestaurantList";
import "./index.css";
const router = createBrowserRouter([
{
path: "/",
element: <App />,
children: [
{
path: "/",
element: <RestaurantList />,
},
],
},
{
path: "/browse",
element: <App />,
children: [
{
path: "/browse",
element: <RestaurantList />,
},
],
},
]);
ReactDOM.createRoot(document.getElementById("root")).render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>,
);

이 파일 클라이언트 사이드 라우팅을 구성하고 다음 경로를 정의합니다.

  • /: /restaurant/ API 엔드포인트를 호출하여 모든 레스토랑을 표시하는 RestaurantList 구성 요소를 렌더링합니다.

  • /browse: /restaurant/browse API 엔드포인트를 호출하여 필터링된 레스토랑을 표시하는 RestaurantList 구성 요소를 렌더링합니다.

5

client 디렉토리 에서 다음 명령을 실행하여 두 개의 파일이 포함된 components 라는 새 폴더를 만듭니다.

mkdir src/components
cd src/components
touch Navbar.jsx RestaurantList.jsx

Navbar.jsx 파일 필수 구성 요소에 연결되는 탐색 모음을 구성합니다. 이 파일 에 다음 코드를 붙여넣습니다.

react-quickstart/ 클라이언트/src/components/Navbar.jsx
import { NavLink } from "react-router-dom";
export default function Navbar() {
return (
<div>
<nav className="flex justify-between items-center mb-6">
<NavLink to="/">
<img
alt="MongoDB logo"
className="h-10 inline"
src="https://d3cy9zhslanhfa.cloudfront.net/media/3800C044-6298-4575-A05D5C6B7623EE37/4B45D0EC-3482-4759-82DA37D8EA07D229/webimage-8A27671A-8A53-45DC-89D7BF8537F15A0D.png"
></img>
</NavLink>
</nav>
</div>
);
}

RestaurantList.jsx 파일 레스토랑의 보기 구성 요소로, 레스토랑 정보를 검색하고 표시합니다. 이 파일 에 다음 코드를 붙여넣습니다.

react-quickstart/ 클라이언트/src/components/RestaurantList.jsx
import { useEffect, useState } from "react";
import { useLocation } from "react-router-dom";
const Restaurant = (props) => (
<tr className="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted">
<td className="p-4 align-middle [&:has([role=checkbox])]:pr-0">
{props.restaurant.name}
</td>
<td className="p-4 align-middle [&:has([role=checkbox])]:pr-0">
{props.restaurant.borough}
</td>
<td className="p-4 align-middle [&:has([role=checkbox])]:pr-0">
{props.restaurant.cuisine}
</td>
</tr>
);
export default function RestaurantList() {
const [restaurants, setRestaurants] = useState([]);
const location = useLocation();
// Fetches the restaurants from the database
useEffect(() => {
async function getRestaurants() {
// Determines which endpoint to call based on current route
const endpoint =
location.pathname === "/browse"
? "http://localhost:5050/restaurant/browse"
: "http://localhost:5050/restaurant/";
const response = await fetch(endpoint);
if (!response.ok) {
const message = `An error occurred: ${response.statusText}`;
console.error(message);
return;
}
const restaurants = await response.json();
setRestaurants(restaurants);
}
getRestaurants();
return;
}, [location.pathname]);
// Maps each restaurant on the table
function restaurantList() {
return restaurants.map((restaurant) => {
return <Restaurant restaurant={restaurant} key={restaurant._id} />;
});
}
// Retrieves the dynamic title based on current route
const getTitle = () => {
return location.pathname === "/browse"
? 'Filtered Restaurants (Queens, containing "Moon")'
: "All Restaurants";
};
// Displays the restaurants table
return (
<>
<h3 className="text-lg font-semibold p-4">{getTitle()}</h3>
<div className="border rounded-lg overflow-hidden">
<div className="relative w-full overflow-auto">
<table className="w-full caption-bottom text-sm">
<thead className="[&_tr]:border-b">
<tr className="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted">
<th className="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0">
Name
</th>
<th className="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0">
Borough
</th>
<th className="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0">
Cuisine
</th>
</tr>
</thead>
<tbody className="[&_tr:last-child]:border-0">
{restaurantList()}
</tbody>
</table>
</div>
</div>
</>
);
}

마지막으로 client/src/App.jsx 파일 로 이동합니다. 이 파일 기본 레이아웃 구성 요소이며 Navbar 구성 요소가 각 페이지 상단에서 하위 구성 요소 위에 렌더링되도록 합니다. 이 파일 에 다음 코드를 붙여넣습니다.

react-quickstart/ 클라이언트/src/App.jsx
import { Outlet } from "react-router-dom";
import Navbar from "./components/Navbar";
const App = () => {
return (
<div className="w-full p-6">
<Navbar />
<Outlet />
</div>
);
};
export default App;

마지막으로 이 섹션의 단계에 따라 애플리케이션 실행 하고 렌더링된 레스토랑 데이터를 확인합니다.

1

react-quickstart/server 디렉토리 로 이동하여 다음 명령을 실행 서버 시작합니다.

node --env-file=config.env server

성공적인 하면 이 명령은 다음 정보를 출력합니다.

Pinged your deployment. You successfully connected to MongoDB!
Server listening on port 5050
2

별도의 터미널 창 에서 react-quickstart/client 디렉토리 로 이동합니다. 다음 명령을 실행하여 React 프론트 엔드를 시작합니다.

npm run dev

성공적인 하면 이 명령은 다음 정보를 출력합니다.

VITE v7.2.4 ready in 298 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h + enter to show help
3

이전 단계에서 검색한 http://localhost:5173/ URL 엽니다. 초기 방문 페이지에는 컬렉션 의 모든 sample_restaurants.restaurants 레스토랑 목록이 표시됩니다.

모든 레스토랑이 표시되는 랜딩 페이지

그런 다음 http://localhost:5173/browse URL 로 이동하여 및 name borough 필드 쿼리 와 일치하는 레스토랑을 확인합니다.

일치하는 레스토랑을 표시하는 웹 페이지

빠른 시작 튜토리얼을 완료하신 것을 축하드립니다!

이 단계를 완료하면 MongoDB deployment 에 연결하고, 샘플 레스토랑 데이터에 대해 쿼리 실행하고, 검색된 결과를 렌더링하는 React 웹 애플리케이션 갖게 됩니다.

React, MongoDB 및 MERN 스택 에 대해 자세히 학습 다음 리소스를 참조하세요.

돌아가기

이슈 & 도움말

이 페이지의 내용