본문 바로가기
엘리스 AI 트랙 4기/elice AI track

[5주차] Mongoose ODM - (1)

by _sweep 2022. 2. 19.

2월 19일 자 학습 내용 정리입니다.

 

 

 Mongoose ODM

ODM은 Object Data Modeling의 약어이다.

따라서 Mongoose ODM은 MongoDB의 Collection에 집중하여 관리하도록 도와주는 패키지이다.

Collection을 모델화하여 관련 기능을 쉽게 사용할 수 있도록 도와준다.

 

✔️ 연결 관리

MongoDB의 기본 Node.js 드라이버는 연결 상태를 관리하기 어렵다.

반면 Mongoose를 사용하면 간단하게 데이터베이스와의 연결 상태를 관리해준다.

 

✔️ 스키마 관리

스키마를 정의하지 않고 데이터를 사용할 수 있다는 것은 NoSQL의 장점이지만 데이터 형식을 미리 정의해야 코드 작성과 프로젝트 관리에 유용하다.

따라서 Mongoose는 Code-Level에서 스키마를 정의하고 관리할 수 있게 해준다.

 

✔️ Populate

MongoDB는 기본적으로 join을 지원하지 않는다.

따라서 join과 유사한 기능을 사용하기 위해서는 aggregate라는 복잡한 쿼리를 사용해야 했다.

하지만 Mongoose의 populate를 사용하면 보다 더 간단한 구현이 가능해진다.

 

이를 비교해보면 다음과 같다.

 

// MongoDB aggregate 사용
db.orders.aggregate( [
   // Stage 1: Filter pizza order documents by pizza size
   {
      $match: { size: "medium" }
   },
   // Stage 2: Group remaining documents by pizza name and calculate total quantity
   {
      $group: { _id: "$name", totalQuantity: { $sum: "$quantity" } }
   }
] )

// Mongoose populate 사용
orders.find({ size: 'medium' }).populate('name')

 

 

 Mongoose ODM 사용법

Mongoose ODM의 사용 순서는 다음과 같다.

  1. 스키마 정의
  2. 모델 만들기
  3. 데이터베이스 연결
  4. 모델 사용

 

✔️ 스키마 정의

Collection에 저장될 Document의 Schema를 Code-Level에서 관리할 수 있도록 작성할 수 있다.

Schema는 다양한 형식을 미리 지정하여 생성, 수정 작업 시 데이터 형식을 체크해 주는 기능을 제공한다.

 

const { Schema } = require('mongoose');

const PostSchema = new Schema({
    title: {
        type: String
    },
    content: String
}, {
    timestamp: true
});

module.exports = PostSchema;

 

Schema를 정의하는 법은 다음과 같다.

    1. mongoose 패키지에서 Schema 클래스를 가져온다.
    2. Schema 클래스를 이용해 Schema를 저장할 객체를 하나 만든다.
    3. 객체의 key와 value를 선언하는데 이때 value는 해당 key에 저장될 값의 데이터 자료형이 들어간다.
      • 이때 title처럼 정의할 수도 있지만 type만 정의할 경우 content와 같이 정의할 수도 있다.
      • 다양한 옵션도 줄 수 있는데 timestamps 옵션을 사용하면 생성, 수정 시간을 자동으로 기록해 준다.
    4. Schema 생성이 끝났다면 다른 곳에서 해당 Schema를 사용할 수 있도록 node.js 모듈로 export 한다.

 

✔️ 모델 만들기

작성된 Schema를 mongoose에서 사용할 수 있는 모델로 만드는 과정이다.
모델의 이름을 지정하여 Populate 등에서 해당 이름으로 모델을 호출할 수 있다.

 

const mongoose = require('mongoose');
const PostSchema = require('./schemas');

export.Post = mongoose.model('Post', PostSchema);

 

모델을 만드는 순서는 다음과 같다.

  1. mongoose 패키지를 로드한다.
  2. 정의된 Schema를 로드한다.
  3. 호출된 mongoose 패키지에 .model() 메서드를 사용해 어떠한 이름으로 해당 스키마를 사용할 것인지 정의한다.
    • 이때 export를 사용하면 다른 곳에서 해당 모델을 사용할 수 있다.

 

✔️ 데이터베이스 연결하기

connect 함수를 이용하여 간단하게 데이터베이스에 연결할 수 있다.
mongoose는 자동으로 연결을 관리한다.
따라서 직접 연결 상태를 체크하지 않아도 모델 사용 시 연결 상태를 확인하여 사용이 가능할 때 작업을 실행한다.

 

const mongoose = require('mongoose');
const { Post } = require('./models');

mongoose.connect('mongodb://localhost:27017/myapp');

 

  1. mongoose 패키지와 model을 로드한다.
  2. 호출된 mongoose 패키지에 .connnect() 메서드를 사용해 MongoDB와 연결한다.

 

mongoose.connect(uri, options);

 

✔️ 모델 사용하기

작성된 모델을 사용하여 CRUD 작업을 수행할 수 있다.

Mongoose의 CRUD 관련 함수들은 다음과 같다.

 

CRUD 함수명
CREATE create
READ find
findById
findOne
UPDATE updateOne
updateMany
findByIdAnaUpdate
findOneAndUpdate
DELETE deleteOne
deleteMany
findByIdAndDelete
findOneAndDelete

 

이에 대한 자세한 내용은 다음 포스팅에서 확인할 수 있다.

 

 

🔍 참조

Aggregate https://docs.mongodb.com/manual/aggregation/

Populate https://mongoosejs.com/docs/populate.html

connect https://mongoosejs.com/docs/connections.html

 

 

댓글