MongoDB

Mongoose

ssohyunn 2023. 4. 10. 20:26

Mongoose

Mongoose는 Node.js와 MongoDB를 위한 ODM(Object Data Mapping) 라이브러리이다.

  • MongoDB에 데이터를 CRUD할 수 있도록 도와주는 외부 패키지(라이브러리)
  • MongoDB에서 가져온 document 데이터를 JS 객체화한 것을 모델이라고 한다.
  • 검증 파트는 Schema 모듈이 담당, CRUD + document를 JS로 객체 변환하는 것은 Model 모듈이 담당한다.

 

스키마(Schema)

  • 한 collection의 document의 구조를 명시화한 객체
  • Mongoose는 애플리케이션이 MongoDB에 데이터를 CRUD할 때 이 객체를 가지고 데이터 검증을 수행한다.
  • mongoose.Schema -> 이 함수의 리턴값: 객체
  • MongoDB와 데이터를 어떤 틀에 맞춰서 주고 받을지를 정의

 

모델(Model)

  • 스키마 객체를 사용해서 MongoDB에 있는 document 데이터를 JS 객체 형태로 나타낼 수 있게 한다.
  • MongoDB에 있는 모든 document들에 대한 CRUD도 책임진다.
  • mongoose.model -> 이 함수의 리턴값은 class이다. CRUD의 리턴값은 이 클래스의 객체
  • JS 객체 형식으로 MongoDB와 데이터를 주고 받는다.

 

 

Mongoose ODM을 사용하는 이유

연결 관리

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

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

 

스키마 관리

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

Mongoose는 코드레벨에서 스키마를 정의하고 관리할 수 있도록 해준다.

 

Populate

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

join과 유사한 기능을 사용하기 위해 aggregate라는 복잡한 쿼리를 사용해야 하지만, mongoose는 populate를 사용해 간단하게 구현할 수 있다.

 

Mongoose ODM 사용

1️⃣ 스키마 정의

const { Schema } = require("mongoose");
const shortId = require("./types/short-id");
const PostSchema = new Schema(
  {
    content: {
      type: String,
      required: true,
    },
    author: {
      type: String,
      default: "작성자",
    },
  },
  {
    timestamps: true,
  }
);

module.exports = PostSchema;

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

timestamps 옵션을 사용하면 생성, 수정 시간을 자동으로 기록해준다.

 

2️⃣ 모델 만들기

const mongoose = require("mongoose");

const PostSchema = require("./schemas/post");

const Post = mongoose.model("Post", PostSchema);

exports.Post = Post;

Collection에서 document를 CRUD하기 위한 model을 준비한다.

위 코드에서 Post가 Post model 생성을 위한 class이다.

 

3️⃣ 데이터베이스 연결

// app.js

const mongoose = require("mongoose");

// mongoose connection
mongoose.connect("mongodb://localhost:27017/simple-board");

mongoose.connection.on("connected", () => {
  console.log("MongoDB Connected");
});

connect 함수를 이용하여 데이터베이스에 연결한다.

mongoose는 자동으로 연결을 관리해줘서 직접 연결 상태를 체크하지 않아도 모델 사용 시 연결 상태를 확인하여 사용이 가능할 때 작업을 실행한다.

 

4️⃣ model을 이용한 document CRUD

  • Create: create
  • Read: find, findById, findOne
  • Update: updateOne, updateMany, findByIdAndUpdate, findOneAndUpdate
  • Delete: deleteOne, deleteMany, findByIdAndDelete, findOneAndDelete
const { Post } = require('./models');


// create: 생성된 document 반환
const created = await Post.create({
  title: '제목',
  content: '내용',
});

// query를 사용하여 검색 (find(query))
const posts = await Post.find();
const post = await Post.findOne({ title:'제목' });


await Post.updateOne(query,{ ... });
await Post.findByIdAndUpdate(id, { ... }); 

await Post.deleteOne(query);