elice/WIL
[week_06] MongoDB์ Mongoose
๊ฑด๋ง๋
2022. 2. 16. 22:16
1. MongoDB
- ๋ํ์ ์ธ NoSQL, Document DB
RDB | NoSQL |
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค (Relational DataBase) - ์๋ฃ๋ค์ ๊ด๊ณ๋ฅผ ์ฃผ์ํ๊ฒ ๋ค๋ฃธ - SQL ์ง์์ด ์ฌ์ฉ โก ๋ฐ์ดํฐ ๊ตฌ์กฐํ |
- ๊ตฌ์กฐํ๋ ์ง์์ด ์ฌ์ฉ X (Non SQL / Not Only SQL) - ์๋ฃ ๊ฐ์ ๊ด๊ณ์ ์ด์ X - ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํ X โก ์ ์ฐํ๊ฒ ๋ฐ์ดํฐ ์ ์ฅ |
- DDL์ด๋ ๋ฐ์ดํฐ ๊ตฌ์กฐํ ๋ฑ์ ์ฌ์ ์์ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ ๊ฐ๋ฅ
- Database ํ๋ ์ด์์ Collection์ ๊ฐ์ง ์ ์๋ ์ ์ฅ์
- Collection ํ๋ ์ด์์ Document๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ, SQL์ table๊ณผ ์ ์ฌ
- Document ์ ์ฅ๋๋ ์๋ฃ, SQL์ row์ ์ ์ฌ
- ObjectID document์ ์ ์ผํ ๊ธฐ ๊ฐ, SQL์ primary key์ ์ ์ฌ, ์๋์ผ๋ก ์์ฑ๋๋ ๋์ ๊ฐ
2. Mongoose ODM
- Object Data Modeling
- MongoDB์ Collection์ ์ง์คํ์ฌ ๊ด๋ฆฌํ๋๋ก ๋์์ฃผ๋ ํจํค์ง
- Collection์ ๋ชจ๋ธํํ์ฌ, ๊ด๋ จ ๊ธฐ๋ฅ๋ค์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค๋ค.
โจ Mongoose ODM ์ฌ์ฉ ์์
1. ์คํค๋ง ์ ์
2. ๋ชจ๋ธ ๋ง๋ค๊ธฐ
3. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ
4. ๋ชจ๋ธ ์ฌ์ฉ
2-1. ์คํค๋ง ์ ์ํ๊ธฐ
- Collection์ ์ ์ฅ๋ Document์ ์คํค๋ง๋ฅผ Code-Level์์ ๊ด๋ฆฌํ ์ ์๋๋ก ์คํค๋ง ์์ฑ ๊ฐ๋ฅ
- ๋ค์ํ ํ์ ๋ฏธ๋ฆฌ ์ง์ ํ, ์์ฑ/์์ ์์ ์ ๋ฐ์ดํฐ ํ์ ์ฒดํฌ ๊ธฐ๋ฅ ์ ๊ณต
- timestamps ์ต์ : ์์ฑ/์์ ์๊ฐ ์๋ ๊ธฐ๋ก
const { Schema } = require('mongoose');
const PostSchema = new Schema({
title: String,
content: String,
}, {
timestamps: true,
});
module.exports = PostSchema;
2-2. ๋ชจ๋ธ ๋ง๋ค๊ธฐ
- ์์ฑ๋ ์คํค๋ง๋ฅผ mongoose์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ธ๋ก ๋ณํ
- ๋ชจ๋ธ์ ์ด๋ฆ์ ์ง์ ํ์ฌ Populate ๋ฑ์์ ํด๋น ์ด๋ฆ์ผ๋ก ๋ชจ๋ธ ํธ์ถ ๊ฐ๋ฅ
const mongoose = require('mongoose')
const PostSchema = require('./schemas/board');
exports.Post = mongoose.model('Post', PostSchema);
// model ํจ์๋ฅผ ์ฌ์ฉ => Post๋ผ๋ ์ด๋ฆ์ผ๋ก PostSchema์ ํจ๊ป ์ ๋ฌ
// Post๋ผ๋ ์ด๋ฆ์ผ๋ก exports ํ์ฌ, model ๋ชจ๋ ์์์ ์ฌ์ฉ ๊ฐ๋ฅ
2-3. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐํ๊ธฐ
- connect ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ
- connect ํจ์ ์ฌ์ฉ ์, ์๋์ผ๋ก ์ฐ๊ฒฐ์ ๊ด๋ฆฌ
- ์ง์ ์ฐ๊ฒฐ ์ํ๋ฅผ ์ฒดํฌํ์ง ์์๋ ๋ชจ๋ธ ์ฌ์ฉ ์ ์ฐ๊ฒฐ ์ํ๋ฅผ ํ์ธํ์ฌ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๋ ์์ ์คํ
const mongoose = require('mongoose');
const { Post } = require('./models');
mongoose.connect('mongodb://localhost:27017/myapp');
// ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ
// Post ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
2-4. ๋ชจ๋ธ ์ฌ์ฉํ๊ธฐ
- ์์ฑ๋ ๋ชจ๋ธ์ ์ด์ฉํ์ฌ CRUD๋ฅผ ์ํํ ์ ์์
CRUD | ํจ์๋ช |
CREATE | create |
READ | find, findById, findOne |
UPDATE | updateOne, updateMany, findByIdAndUpdate, findOneAndUpdate |
DELETE | deleteOne, deleteMany, findByIdAndDelete, findOneAndDelete |
1) CREATE
- Document ์์ฑ ํ ๋ฐํ
- Document Object => ๋จ์ผ Document / Document Object์ Array => ๋ณต์ Document ์์ฑ
const { Post } = require('./models');
async function main() {
const created = await Post.create({
title: 'first title',
content: 'second title',
});
const multipleCreated = await Post.create([
item1,
item2
]);
}
2) FIND (READ)
- Document๋ฅผ ๊ฒ์
- query๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ํ๊ฑฐ๋, findById๋ฅผ ์ฌ์ฉํ๋ฉด ObjectID๋ก Documet ๊ฒ์
- { key : value }๋ก exact match
- $lt, $lte, $gt, $gte๋ฅผ ์ฌ์ฉํ์ฌ range query ์์ฑ
- $in์ ์ฌ์ฉํ์ฌ ๋ค์ค ๊ฐ์ผ๋ก ๊ฒ์
- $or๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ค ์กฐ๊ฑด ๊ฒ์
3) UPDATE
- Document๋ฅผ ์์
- find~ ํจ์๋ค์ ๊ฒ์๋ Document๋ฅผ ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์๋ ๊ฐ์ผ๋ก ๋ฐํ
- ๊ธฐ๋ณธ์ ์ผ๋ก $set operator๋ฅผ ์ฌ์ฉํ์ฌ, Document๋ฅผ ํต์งธ๋ก ๋ณ๊ฒฝํ์ง ์์
- ์๋ ์์ฑ์ด๋ผ๋ฉด ๋ณ๊ฒฝํ๊ณ , ์๋ ์์ฑ์ด๋ผ๋ฉด ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์์ ๊ธฐ๋ฅ
4) DELETE
- Document ์ญ์
- find~ ํจ์๋ค์ ๊ฒ์๋ Document๋ฅผ ๋ฐํ
2-5. populate
- RDB์ Join๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ
- ์คํค๋ง๋ฅผ ์ ์ธํ ๋ Document ์์ Document๋ฅผ ๋ด์ง ์๊ณ , ObjectID๋ฅผ ๊ฐ์ง๊ณ referenceํ์ฌ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ ์ ๊ณต
- Document์๋ reference๋๋ ObjectID๋ฅผ ๋ด๊ณ , ์ฌ์ฉํ ๋ populateํ์ฌ ํ์ Document์ฒ๋ผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค
const Post = new Schema({
// Post๋ผ๋ ์คํค๋ง ์์ user์ comment๊ฐ์ ๋ด์ ์ ์ธ
...
user: {
type: Schema.Types.ObjectId, // ObjectId ํ์
ref: 'User' // ๋ชจ๋ธ ๋ ํผ๋ฐ์ค
},
comments: [{
type: Schema.Types.ObjectId,
ref: 'Comment' // ๋ชจ๋ธ ๋ ํผ๋ฐ์ค
}],
});
const post = await Post.find().populate(['user', 'comments']);
// find() ๋ค์ populate => user์ ์ ์ธ๋ user ์ด๋ฆ ๋ฑ์ post ๊ฐ์ฒด ๋ด์์ ์ฌ์ฉ ๊ฐ๋ฅ
3. Express.js + Mongoose ODM
- Express.js์ ์ด๋ ๋ถ๋ถ์ Mongoose ODM์ ์์น์ํค๋ฉด ์ข์์ง ์์น ๊ฒฐ์ ์ค์
- ์ผ๋ฐ์ ์ผ๋ก models ๋๋ ํฐ๋ฆฌ์ Schema์ Model์ ๊ฐ์ด ์์น
- app ๊ฐ์ฒด๋ ์ดํ๋ฆฌ์ผ์ด์ ์์์ ์๋ฏธํ๋ ๋ถ๋ถ์ด๋ฏ๋ก, ํด๋น ๋ถ๋ถ์ DB ์ฐ๊ฒฐ์ ๋ช ์ํ๋ mongoose.connect๋ฅผ ์์น
- ๋์ ์ค์ ๋ฐ์ํ๋ DB ์ฐ๊ฒฐ ๊ด๋ จ ์ด๋ฒคํธ์ ๋ํ ์ฒ๋ฆฌ ํ์
3-1. connection ๊ฐ์ฒด
mongoose.connect('----');
mongoose.connection.on('connected', () => {}); // ์ฐ๊ฒฐ ์๋ฃ
mongoose.connection.on('disconnected', () => {}); // ์ฐ๊ฒฐ ๋๊น
mongoose.connection.on('reconnected', () => {}); // ์ฌ์ฐ๊ฒฐ ์๋ฃ
mongoose.connection.on('reconnectFailed', () => {}); // ์ฌ์ฐ๊ฒฐ ์๋ ํ์ ์ด๊ณผ