새로운 강의는 이제 https://memi.dev 에서 진행합니다.
memi가 Vue & Firebase로 직접 만든 새로운 사이트를 소개합니다.
모던웹(NEMV) 혼자 제작 하기 3기 - 64 게시판 모델 만들기(populate)
게시물들은 누가 썼는지, 어느 게시판인지가 제일 중요합니다.
몽구스의 파퓰레이션(population) 기능에 대해 알아봅니다.
모델 만들기
be/models/articles.js
const mongoose = require('mongoose')
mongoose.set('useCreateIndex', true)
const articleSchema = new mongoose.Schema({
title: { type: String, default: '', index: true },
content: { type: String, default: '' },
cnt: {
view: { type: Number, default: 0 },
like: { type: Number, default: 0 }
},
ip: { type: String, default: '' },
comments: [],
_user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', index: true },
_board: { type: mongoose.Schema.Types.ObjectId, ref: 'Board', index: true }
})
module.exports = mongoose.model('Article', articleSchema)
게시판의 일반적인 요소를 생각나는 대로 넣어봤습니다.
그 중 묘한 것이 있습니다.
바로 _user, _board 인데요..
mongoose.Schema.Types.ObjectId 라는 형식을 가지고 있습니다.
레퍼런스(ref) 로 모델을 가르키고 있는 형태입니다.
바로 User._id, Board._id 를 보관하겠다는 것입니다.
게시물의 작성자와 어떤 형식인지를 _id만 보관 해서 사용하는 것입니다.
사용해보기
설명보다는 역시 직접 해보는 것이 더 빠릅니다.
_id 구하기
be/app.js
const User = require('./models/users')
const Board = require('./models/boards')
const Article = require('./models/articles')
User.findOne()
.then(r => console.log(r.id, r._id)) // 5be1c7eb0ff40640c81ecc0d
Board.findOne()
.then(r => console.log(r.name, r._id)) // 5be97f5f8fb2da704ad95273
사용자와 게시판을 검색해서 _id를 구합니다.
구한 _id 들로 게시물 등록하기
Article.create({ title: 'aaa', content: 'kkfjf', _user: '5be1c7eb0ff40640c81ecc0d', _board: '5be97f5f8fb2da704ad95273' })
.then(r => console.log(r))
/*
{ cnt: { view: 0, like: 0 },
title: 'aaa',
content: 'kkfjf',
ip: '',
comments: [],
_id: 5be98c8968c61077b643423c,
_user: 5be1c7eb0ff40640c81ecc0d,
_board: 5be97f5f8fb2da704ad95273,
__v: 0 }
*/
_user, _board는 쓸모가 없죠 아직은..
의미 있는 데이터 채우기
Article.find()
.then(r => {
return User.findOne({_id: r._user})
})
.then(r => {
return Board.findOne({_id: r._board})
})
// ..
의미 있게 채우려면 프라미스 체이닝을 해줘야하는데 불편하죠
파퓰레이트 사용하기
참고: https://mongoosejs.com/docs/populate.html
Article.find({ _board: '5be97f5f8fb2da704ad95273'})
.populate('_user', 'name')
.populate('_board')
.then(r => console.log(r))
/*
{ cnt: { view: 0, like: 0 },
title: 'aaa',
content: 'kkfjf',
ip: '',
comments: [],
_id: 5be98c8968c61077b643423c,
_user: { name: '관리자', _id: 5be1c7eb0ff40640c81ecc0d },
_board:
{ name: '지호',
lv: 0,
rmk: 'test',
_id: 5be97f5f8fb2da704ad95273,
__v: 0 },
__v: 0 } ]
*/
이런식으로 풀어 줄 수 있습니다.
훨씬 간편하죠?
마치며
주의할 것은 파퓰레이트는 몽고가 하는 것이 아닌 몽구스가 해주는 것입니다.
즉 백엔드 컴퓨팅파워가 필요하다는 것입니다.(내부적으로는 반복문으로 찾고 매치하고 해서 결과를 주는 것이죠)
너무 많은 것을 담으면 결국 메모리, CPU가 괴로워하니 적당하게 딱 필요한 곳에서 사용해야합니다.
너무 간단한 것이지만 파퓰레이트만 검색하실 분들을 위해 챕터로 뺍니다.
댓글남기기