이번 강좌에서는 Node.js의 Express 프레임워크를 사용하여 데이터 모델링 및 스키마 정의에 대해 알아보겠습니다. 데이터 모델링은 애플리케이션이 데이터를 어떻게 구조화할지를 정의하는 과정이며, 스키마는 이 구조를 구체화하는 역할을 합니다. 본 강좌는 MongoDB와 Mongoose를 사용하여 예제 코드를 진행하며, 데이터의 CRUD(Create, Read, Update, Delete) 작업을 포함합니다.
목차
1. 데이터 모델링의 중요성
데이터 모델링은 애플리케이션의 구조를 결정짓는 중요한 과정입니다. 잘 설계된 데이터 모델은 다음과 같은 장점을 제공합니다:
- 수정 용이성: 데이터 구조가 명확하게 정의되면 수정이 쉬워집니다.
- 유지보수: 일관된 데이터 구조는 유지보수를 용이하게 합니다.
- 효율성: 최적화된 데이터 모델은 성능을 개선할 수 있습니다.
2. MongoDB와 Mongoose 소개
MongoDB는 NoSQL 데이터베이스로, 데이터가 JSON 형식으로 저장됩니다. Mongoose는 MongoDB를 Node.js와 연결해주는 ODM(Object Data Modeling) 라이브러리입니다. Mongoose를 통해 데이터 모델을 쉽게 정의하고, CRUD 연산을 수행할 수 있습니다.
Mongoose 설치 및 설정
npm install mongoose
간단한 서버 설정
javascript
const express = require('express');
const mongoose = require('mongoose');
const app = express();
app.use(express.json());
mongoose.connect('mongodb://localhost:27017/mydatabase', {
useNewUrlParser: true,
useUnifiedTopology: true,
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
3. 데이터 스키마 정의
Mongoose를 사용하면 모델을 정의하고, 각 모델이 어떻게 데이터를 구조화할지를 설정할 수 있습니다. 예를 들어, 블로그 애플리케이션을 설계한다고 가정해보겠습니다.
블로그 게시물 모델 정의하기
javascript
const postSchema = new mongoose.Schema({
title: {
type: String,
required: true,
trim: true,
},
content: {
type: String,
required: true,
},
author: {
type: String,
required: true,
},
createdAt: {
type: Date,
default: Date.now,
},
tags: [String],
});
const Post = mongoose.model('Post', postSchema);
위의 스키마에서 각 필드의 유형과 제약 조건을 정의했습니다. required
속성은 필드가 반드시 필요함을 나타내고, trim
속성은 문자열의 공백을 제거합니다.
4. 기본 CRUD 작업
데이터 모델이 정의되면 CRUD 작업을 통해 데이터를 관리할 수 있습니다. 다음은 각 작업에 대한 예제입니다.
1) Create: 새로운 블로그 게시물 추가
javascript
app.post('/posts', async (req, res) => {
try {
const newPost = new Post(req.body);
await newPost.save();
res.status(201).send(newPost);
} catch (error) {
res.status(400).send(error);
}
});
2) Read: 모든 블로그 게시물 조회
javascript
app.get('/posts', async (req, res) => {
try {
const posts = await Post.find({});
res.send(posts);
} catch (error) {
res.status(500).send(error);
}
});
3) Update: 블로그 게시물 수정
javascript
app.patch('/posts/:id', async (req, res) => {
try {
const post = await Post.findByIdAndUpdate(req.params.id, req.body, { new: true, runValidators: true });
if (!post) {
return res.status(404).send();
}
res.send(post);
} catch (error) {
res.status(400).send(error);
}
});
4) Delete: 블로그 게시물 삭제
javascript
app.delete('/posts/:id', async (req, res) => {
try {
const post = await Post.findByIdAndDelete(req.params.id);
if (!post) {
return res.status(404).send();
}
res.send(post);
} catch (error) {
res.status(500).send(error);
}
});
5. 결론
이번 강좌에서는 Express와 Mongoose를 이용한 데이터 모델링 및 스키마 정의에 대해 알아보았습니다. 직관적인 데이터 구조는 애플리케이션의 효율성 및 유지보수성을 높여 줍니다. Mongoose를 활용한 CRUD 작업을 통해 데이터의 생성, 조회, 수정, 삭제를 쉽게 수행할 수 있습니다.
이로써 데이터 모델링의 기본 개념과, Express 애플리케이션에서 이를 구현하는 방법을 배웠습니다. 다음 강좌에서는 더 복잡한 데이터 관계와 고급 Mongoose 기능에 대해 알아보겠습니다.