MongoDB는 NoSQL 데이터베이스 중에서 가장 인기 있는 데이터베이스 중 하나입니다. 비관계형 데이터 모델을 사용하며, 유연한 스키마와 높은 확장성을 제공합니다. 이번 포스팅에서는 "MongoDB CRUD", "MongoDB 사용법", "NoSQL 데이터베이스"를 주제로, MongoDB를 사용하여 CRUD(Create, Read, Update, Delete) 작업을 구현하는 방법을 상세히 설명하겠습니다. 중급 개발자를 대상으로 하며, 예제를 통해 실습해 보겠습니다.
MongoDB 소개
MongoDB란?
MongoDB는 문서 지향 데이터베이스로, JSON과 유사한 BSON(Binary JSON) 형식으로 데이터를 저장합니다. MongoDB는 유연한 스키마를 제공하며, 관계형 데이터베이스의 테이블 대신 컬렉션과 문서를 사용합니다. 각 문서는 여러 필드와 값을 가질 수 있으며, 이러한 문서들은 컬렉션에 저장됩니다.
주요 특징
- 유연한 스키마: 고정된 스키마가 없어, 데이터를 유연하게 저장할 수 있습니다.
- 확장성: 수평적 확장이 용이하여, 대규모 데이터를 효율적으로 처리할 수 있습니다.
- 고성능: 대용량 데이터를 빠르게 읽고 쓸 수 있습니다.
MongoDB 설치 및 설정
MongoDB 설치
MongoDB를 설치하려면 MongoDB 공식 웹사이트에서 설치 프로그램을 다운로드하고 설치합니다. 설치가 완료되면 MongoDB 서버를 시작합니다:
mongod
MongoDB 클라이언트 설치
MongoDB와 상호작용하기 위해 Node.js 프로젝트에서 MongoDB 클라이언트를 설치합니다:
npm install mongodb
CRUD 작업 구현
이제 MongoDB를 사용하여 CRUD 작업을 구현하는 방법을 알아보겠습니다. 예제 프로젝트를 통해 각 작업을 단계별로 설명합니다.
프로젝트 설정
먼저 프로젝트 디렉토리를 설정하고 필요한 패키지를 설치합니다:
mkdir mongodb-crud
cd mongodb-crud
npm init -y
npm install mongodb express body-parser
프로젝트 구조
프로젝트의 기본 구조는 다음과 같습니다:
mongodb-crud/
├── node_modules/
├── app.js
└── package.json
MongoDB 연결
먼저 MongoDB에 연결하는 코드를 작성합니다. app.js
파일을 만들고 다음 코드를 작성합니다:
const express = require('express');
const bodyParser = require('body-parser');
const { MongoClient, ObjectId } = require('mongodb');
const app = express();
const port = 3000;
const url = 'mongodb://localhost:27017';
const dbName = 'testdb';
app.use(bodyParser.json());
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
if (err) throw err;
const db = client.db(dbName);
const collection = db.collection('items');
// CRUD 작업을 위한 라우터 설정
app.post('/items', async (req, res) => {
const item = req.body;
const result = await collection.insertOne(item);
res.status(201).send(result.ops[0]);
});
app.get('/items', async (req, res) => {
const items = await collection.find({}).toArray();
res.status(200).send(items);
});
app.get('/items/:id', async (req, res) => {
const id = req.params.id;
const item = await collection.findOne({ _id: ObjectId(id) });
if (!item) return res.status(404).send({ message: 'Item not found' });
res.status(200).send(item);
});
app.put('/items/:id', async (req, res) => {
const id = req.params.id;
const newItem = req.body;
const result = await collection.updateOne({ _id: ObjectId(id) }, { $set: newItem });
if (result.matchedCount === 0) return res.status(404).send({ message: 'Item not found' });
res.status(200).send({ message: 'Item updated' });
});
app.delete('/items/:id', async (req, res) => {
const id = req.params.id;
const result = await collection.deleteOne({ _id: ObjectId(id) });
if (result.deletedCount === 0) return res.status(404).send({ message: 'Item not found' });
res.status(200).send({ message: 'Item deleted' });
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
});
CRUD 작업
위 코드에서는 MongoDB 컬렉션에 대해 CRUD 작업을 수행하는 API 엔드포인트를 정의했습니다. 이제 각 작업을 자세히 살펴보겠습니다.
1. Create (생성)
새로운 항목을 추가하는 작업입니다.
app.post('/items', async (req, res) => {
const item = req.body;
const result = await collection.insertOne(item);
res.status(201).send(result.ops[0]);
});
Postman을 사용하여 다음과 같이 테스트할 수 있습니다:
- URL:
http://localhost:3000/items
- Method: POST
- Body: JSON 형식
{
"name": "item1",
"description": "This is item 1"
}
2. Read (읽기)
컬렉션의 모든 항목을 읽어오는 작업입니다.
app.get('/items', async (req, res) => {
const items = await collection.find({}).toArray();
res.status(200).send(items);
});
특정 항목을 읽어오는 작업입니다.
app.get('/items/:id', async (req, res) => {
const id = req.params.id;
const item = await collection.findOne({ _id: ObjectId(id) });
if (!item) return res.status(404).send({ message: 'Item not found' });
res.status(200).send(item);
});
Postman을 사용하여 다음과 같이 테스트할 수 있습니다:
- URL:
http://localhost:3000/items
- Method: GET
- URL:
http://localhost:3000/items/{id}
- Method: GET
3. Update (수정)
기존 항목을 수정하는 작업입니다.
app.put('/items/:id', async (req, res) => {
const id = req.params.id;
const newItem = req.body;
const result = await collection.updateOne({ _id: ObjectId(id) }, { $set: newItem });
if (result.matchedCount === 0) return res.status(404).send({ message: 'Item not found' });
res.status(200).send({ message: 'Item updated' });
});
Postman을 사용하여 다음과 같이 테스트할 수 있습니다:
- URL:
http://localhost:3000/items/{id}
- Method: PUT
- Body: JSON 형식
{
"name": "updated item",
"description": "This is the updated item"
}
4. Delete (삭제)
기존 항목을 삭제하는 작업입니다.
app.delete('/items/:id', async (req, res) => {
const id = req.params.id;
const result = await collection.deleteOne({ _id: ObjectId(id) });
if (result.deletedCount === 0) return res.status(404).send({ message: 'Item not found' });
res.status(200).send({ message: 'Item deleted' });
});
Postman을 사용하여 다음과 같이 테스트할 수 있습니다:
- URL:
http://localhost:3000/items/{id}
- Method: DELETE
고급 기능
인덱싱
MongoDB는 인덱스를 사용하여 검색 성능을 향상시킬 수 있습니다. 인덱스를 생성하려면 다음과 같이 합니다:
collection.createIndex({ name: 1 });
Aggregation
MongoDB의 집계 프레임워크는 복잡한 데이터 분석을 수행할 수 있게 해줍니다. 예를 들어, 특정 필드의 평균 값을 계산하려면 다음과 같이 합니다:
const averageAge = await collection.aggregate([
{ $group: { _id: null, averageAge: { $avg: "$age" } } }
]).toArray();
console.log(averageAge);
데이터 유효성 검사
데이터 유효성 검사를 통해 컬렉션에 삽입되는 데이터의 형식을 검증할 수 있습니다. Mongoose를 사용하면 스키마 기반으로 데이터를 검증할 수 있습니다:
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
age: { type: Number, min: 0 }
});
const User = mongoose.model('User', userSchema);
결론
MongoDB는 유연한 스키마와 높은 확장성을 제공하는 강력한 NoSQL 데이터베이스입니다. 이번 포스팅에서는 MongoDB를 사용하여 CRUD 작업을 구현하는 방법을 단계별로 설명하였습니다. MongoDB와 Express.js를 결합하여 효율적인 RESTful API를 구축할 수 있습니다. 이 포스팅이 MongoDB의 CRUD 작업을 이해하고 구현하는 데 도움이 되길 바랍니다.
이 포스팅이 도움이 되셨다면, 질문이나 추가 정보가 필요하시면 언제든지 댓글로 남겨주세요.