1) Mongoose ODM이란?
Object Data Modeling
MongoDB의 Collection에 집중하여 관리하도록 도와주는 패키지다.
Collection을 모델화하여, 관련 기능들을 쉽게 사용할 수 있게 도와준다.
- Mongoose ODM을 사용하는 이유
- 연결 관리
Node.js 사용 시, 기본 드라이버는 연결 상태를 관리하기 어렵지만,
Mongoose를 사용하면 간단하게 데이터베이스와의 연결상태를 관리해준다.
- 스키마 관리
스키마를 정의하지 않고 사용할 수 있는 건 NoSQL의 장점이지만,
데이터 형식을 미리 정의해야 코드 작성과 프로젝트 관리에 유용하다.
Mongoose는 Code-Level에서 스키마를 정의하고 관리할 수 있게 해준다.
- Populate
MongoDB는 기본적으로 Join 기능을 제공하지 않는다.
Join과 유사한 기능을 사용하기 위해서 populate로 간단히 구현 가능하다.
2) Mongoose ODM 사용 방법
스키마 정의 → 모델 만들기 → 데이터베이스 연결 → 모델 사용
(node.js 기반의 게시판을 만들 때 예시)
(1) 스키마 정의 (./models/schemas/board.js)
const { Schema } = require('mongoose')
const PostSchema = new Schema({
title: String,
content: String,
}, {
timestamps: true, // 생성, 수정 시간 자동 기록해주는 옵션
})
module.exports = PostSchema
스키마는 위와 같이 정의할 수 있다. mongoose 모듈로부터 Schema를 생성한다.
(2) 모델 만들기 (./models/index.js)
const mongoose = require('mongoose')
const PostSchema = require('./schemas/board')
exports.Post = mongoose.model('Post', PostSchema)
작성된 스키마를 mongoose에서 사용할 수 있는 모델로 만드는 것이다.
스키마가 작성된 파일로부터 스키마를 가져와서
mongoose.model('모델 이름 지정', 스키마 명) 으로 모델을 만든다.
(3) 데이터베이스 연결하기 (index.js)
const mongoose = require('mongoose')
const { Post } = require('./models')
mongoose.connect('mongodb://localhost:27017/db이름')
// Post 바로 사용 가능
mongoose의 connect()함수를 사용하여 데이터베이스를 연결할 수 있다.
mongoose를 사용하면 모델 사용 시 자동으로 연결 상태를 확인하여 사용이 가능할 때 작업을 실행한다.
3) 모델 사용하기
CRUD를 수행할 때는 아래와 같은 함수를 사용하면 된다.
CREATE | create |
READ | find, findById, findOne |
UPDATE | updateOne, updateMany, findByAndUpdate, findOneAndUpdate |
DELETE | deleteOne, deleteMany, findByAndDelete, findOneAndDelete |
(1) CREATE
const { Post } = require('./models')
async function main() {
const created = await Post.create({ // create 함수를 사용하여 Document 생성
title: 'first',
content: 'first content',
})
create() 함수를 사용하여 Document를 생성하고, created(그냥 변수명)에 담는다.
(2) FIND (READ)
const { Post } = require('./models')
async function main() {
// find 관련 함수 사용
const list = await Post.find(query)
const One = await Post.findOne(query)
const postById = await Post.findById(id)
}
find, findOne 등의 함수를 사용하여 document를 검색할 수 있다.
함수의 인자로는 쿼리문이 들어간다. 해당 쿼리에 맞는 document를 검색한다.
EX) Post.find( title: 'first' ) => 제목이 first인 글 찾아준다.
* 참고
Post.find({ title: ['first', 'second'] }) 는 자동으로 $in 쿼리를 생성해준다.
즉, ({ title: { $in: ['first', 'second'] }}) 와 동일하다.
(3) UPDATE
async function main() {
const update = await Post.updateOne(query, {
...
})
const updates = await Post.updateMany(query, {
...
})
const postById = await Post.findByAndUpdate(query, {
...
})
const one = await Post.findOneAndUpdate(query, {
...
})
}
위와 같이 update관련 함수를 사용할 수 있다.
검색된 Document를 새로 입력받은 값들로 업데이트하여 값을 반환해준다.
(4) DELETE
async function main() {
const delete = await Post.deleteone(query)
const deletes = await Post.deleteMany(query)
const one = await Post.findOneAndDelete(query)
const postById = await Post.findByIdAndDelete(query)
}
간단하다. 모든 함수의 괄호 안에는 원하는 조건의 쿼리문만 넣어주면 된다.
4) Express.js에서 Mongoose ODM 사용할 때 디렉토리
일반적으로 models 디렉토리에 Schema와 Model을 같이 위치시킨다.
app 객체는 앱 시작을 의미하는 부분이므로, 해당 부분에 데이터베이스 연결을 명시하는 moongose.connect를 위치한다.
- 일반적인 디렉토리 구조
5) Mongoose ODM 커넥션 이벤트
Express.js 어플리케이션은 종료되지 않고 동작하기 때문에,
계속 DB가 정상 동작하는지 파악하기 위해 DB연결 관련 이벤트에 대한 처리를 하는 것이 좋다.
다음과 같은 커넥션 이벤트를 사용 가능하다.
mongoose.connect('----')
mongoose.connection.on('connected', () => { // 연결 완료
})
mongoose.connection.on('disconnected', () => { // 연결 끊김
})
mongoose.connection.on('reconnected', () => { // 재연결 완료
})
mongoose.connection.on('reconnectFailed', () => { // 재연결 시도 횟수 초과
})
'Backend > MongoDB' 카테고리의 다른 글
MongoDB - 고급 활용 기능 이론 위주 (Flask, 집계, 인덱스, 복제 세트, Read-Concern/Write-Concern, 샤드 클러스터) (0) | 2022.02.02 |
---|---|
MongoDB - 연산자 (0) | 2022.02.02 |
MongoDB - CRUD (0) | 2022.02.01 |
MongoDB 개요 (0) | 2022.02.01 |