Mongoose

현서·2025년 5월 12일

백엔드

목록 보기
16/18
post-thumbnail

저번에는 X에 mongoDB를 연동했었다.
이번에는 X에 Mongoose를 적용해보기로 한다.

그러면 Mongoose가 뭔지부터 알아보도록 한다!

Mongoose 란? 🐒

Mongoose는 MongoDB와 함께 사용하는 인기 있는 ODM(Object Data Modeling) 라이브러리이다.

MongoDB 데이터베이스와 상호작용할 때 편리하게 사용할 수 있도록 다양한 기능을 제공한다.

Mongoose는 MongoDB의 데이터를 JavaScript 객체로 다룰 수 있게 해주며, 모델링, 유효성 검사, 쿼리 빌딩 등을 손쉽게 처리할 수 있도록 도와준다.

Mongoose의 주요 기능

  • Schema 정의: Mongoose에서는 MongoDB 컬렉션의 데이터를 구조화하기 위해 Schema를 정의한다. Schema는 각 필드의 타입, 기본값, 유효성 검사 등을 설정할 수 있다.

  • 모델 생성: Schema를 기반으로 실제로 데이터베이스에서 사용할 수 있는 모델을 생성한다. 이 모델은 데이터베이스 작업을 수행할 때 사용된다.

  • CRUD 작업: Mongoose는 MongoDB의 CRUD(Create, Read, Update, Delete) 작업을 쉽게 수행할 수 있는 메서드를 제공한다.

  • 유효성 검사: Mongoose는 데이터가 데이터베이스에 저장되기 전에 유효성 검사를 자동으로 수행할 수 있다. ex) 필수 필드를 지정하거나 데이터 타입을 확인하는 등의 작업

  • 쿼리 빌더: Mongoose는 MongoDB 쿼리를 더 직관적이고 간결하게 작성할 수 있는 쿼리 빌더를 제공한다.

  • 미들웨어: 특정 작업이 실행되기 전이나 후에 자동으로 실행되는 미들웨어를 설정할 수 있다. ex) 데이터를 저장하기 전에 암호를 해시하거나, 삭제하기 전에 데이터를 백업하는 등의 작업

Mongoose에 대해 알아보았으니 이제 X에 적용을 해보자.

npm install mongoose

이렇게 mongoose 설치해준다.

X에 mongoDB 연동된 거에서 mongoose로 바꾸어 수정된 부분만 코드를 올려야겠다.

✨ db/database.mjs

/*
  Mongoose
  - MongoDB + Node.js용 ORM(Object-Relational Mapping)
  - 스키마를 정의
  - 입력, 수정, 조회, 삭제 모두 안정적이고 코드를 간결하게 작성
*/

import { config } from "../config.mjs";
import Mongoose from "mongoose";

export async function connectDB() {
  return Mongoose.connect(config.db.host);
}

export function useVirtualId(schema) {
  schema.virtual("id").get(function () {
    return this._id.toString();
  });
  schema.set("toJSON", { virtual: true });
  schema.set("toObject", { virtual: true });
}

✨ data/auth.mjs

import Mongoose from "mongoose";
import { useVirtualId } from "../db/database.mjs";

const userSchema = new Mongoose.Schema(
  {
    userid: { type: String, require: true },
    name: { type: String, require: true },
    email: { type: String, require: true },
    password: { type: String, require: true },
    url: String,
  },
  { versionKey: false }
);

useVirtualId(userSchema);

const User = Mongoose.model("User", userSchema); // s가 붙어서 만들어짐. Users

// 회원가입 사용자 추가
export async function createUser(user) {
  return new User(user).save().then((data) => data.id);
}

export async function findByUserid(userid) {
  return User.findOne({ userid });
}

export async function findByid(id) {
  return User.findById(id);
}

✨ data/post.mjs

import Mongoose from "mongoose";
import * as UserRepository from "./auth.mjs";

import { useVirtualId } from "../db/database.mjs";

const postSchema = new Mongoose.Schema(
  {
    userid: { type: String, require: true },
    name: { type: String, require: true },
    url: String,
    text: { type: String, require: true },
    userId: { type: String, require: true },
  },
  { timestamps: true }
);

useVirtualId(postSchema);

const Post = Mongoose.model("Post", postSchema);

// 모든 포스트를 리턴
export async function getAll() {
  return Post.find().sort({ createdAt: -1 });
}

// 사용자 아이디(userid)에 대한 포스트를 리턴
// 조건을 만족하는 모든 요소를 배열로 리턴
export async function getAllByUserid(userid) {
  return Post.find({ userid }).sort({ createdAt: -1 });
}

// 글 번호(id)에 대한 포스트를 리턴
// 조건을 만족하는 첫 번째 요소 하나를 리턴
export async function getById(id) {
  return Post.findById(id);
}

export async function create(text, userId) {
  return UserRepository.findByid(userId).then((user) =>
    new Post({
      userid: user.userid,
      name: user.name,
      userId,
      text,
    }).save()
  );
}

export async function update(id, text) {
  return Post.findByIdAndUpdate(id, { text }, { returnDocument: "after" });
}

// 포스트 삭제
export async function remove(id) {
  return Post.findByIdAndDelete(id);
}

그리고 controller/post.mjs 에서 이 부분을 수정했다.

if (post.useridx != req.id) { // 이 부분을
  if (post.userId != req.id) {  // 이렇게

왜냐면 postSchema로 useridx대신에 userId로 주었기 때문!

이렇게 mongoose를 적용하면 간단하게 코드를 작성할 수 있다는 것을 확인했다. mongoose 참 좋은 것 같다...

profile
The light shines in the darkness.

0개의 댓글