mongoose

박상은·2021년 10월 21일
0

🎁 분류 🎁

목록 보기
12/16

mongoose

Node.js 환경에서 사용하는 MongoDB기반의 ORM 라이브러리입니다.

  • ORM: (Object Relational Model)으로 객체를 모델으로 맵핑해주는 것을 의미
    JavaScript의 Object를 MongoDB의 Table과 맵핑해주는 것이며, SQL문을 자체적으로 작성해줌

1. MongoDB와 연결

connect()를 이용해서 연결함

import mongoose from "mongoose";

// uri예시) mongodb://username:password@host:port/database?options...
const uri = "mongodb://localhost:27017";

// option값에 useNewUrlParser없으면 오류
const options = {
  useNewUrlParser: true,
}

mongoose
  .connect(uri, options)
  .then(() => console.log("몽고디비 연결 성공!"))
  .catch(console.error);

2. 스키마 정의 및 모델 생성

데이터베이스의 모델의 형태의 구조를 정의한 것이라고 생각함
비유를 해보자면 class가 schema이고, object가 model인것 같음

import mongoose, { Schema } from "mongoose";

// 유저스키마 즉, 유저테이블의 형태를 선언함
const UserSchema = new Schema({
  username: {
    type: String,
    required: true,
  },
  password: String,
  createdAt: {
    type: Date,
    default: Date.now(),
  },
});
// type => String, Number, Boolean, Date 등이 있음

// 모델생성
// 두 번째 인자로 받은 스키마를 기반으로 모델생성... 실제 DB에는 "users"이름의 모델이 생성됨
const User = mongoose.model("User", UserSchema);

export default User;

3. 데이터 저장

save()사용

// 위에서 export default User; 했던 User
const user = new User({ username: "testUser", password: 1234 });

// user는 자바스크립트에서 생성한 user이고, save()사용시 데이터베이스에 생성됨
user.save().then(() => console.log("저장 완료"));

4. statics

스키마의 메서드를 정의

UserSchema.statics.staticMethod = function () {
  // this는 스키마 자체를 가리킴... 자체적으로 가지는 findById(), findByIdAndDelete() 등을 사용 가능
  console.log("User클래스의 메소드 >> ", this);
};

5. methods

스키마의 메서드를 정의

UserSchema.methods.objectMethod = function () {
  // this는 생성한 객체를 가리킴
  console.log("user객체의 메소드 >> ", this);
};

6. pre()

특정 메서드 호출 이전에 호출

UserSchema.pre("save", function (next) {
  console.log("save()이전에 호출 >> ", this);
  
  // next()안하면 호출한 특정 메서드로 넘어가지 않음
  next();
});

7. post()

특정 메서드 이후에 호출

UserSchema.post("save", function (result) {
  console.log("save()이후에 호출 >> ", result);
  console.log("save()이후에 호출 this >> ", this);
});

0. 예시

const mongoose = require("mongoose");

const { Schema } = mongoose;

(async () => {
  await mongoose.connect("mongodb://localhost:27017/test", {
    useNewUrlParser: true,
  });

  const UserSchema = new Schema({
    username: {
      type: String,
      required: true,
    },
    password: String,
    createdAt: {
      type: Date,
      default: Date.now(),
    },
  });

  UserSchema.statics.staticMethod = function () {
    console.log("User클래스의 메소드 >> ", this);
  };
  UserSchema.methods.objectMethod = function () {
    console.log("user객체의 메소드 >> ", this);
  };
  UserSchema.pre("save", function (next) {
    console.log("save()이전에 호출 >> ", this);
    next();
  });
  UserSchema.post("save", function (result) {
    console.log("save()이후에 호출 >> ", result);
    console.log("save()이후에 호출 this >> ", this);
  });

  const User = mongoose.model("User", UserSchema);

  const user = new User({ username: "testUser", password: 1234 });

  console.group("start");
  
  User.staticMethod();
  user.objectMethod();

  await user.save();

  console.groupEnd();

  console.log("끝");
})();

마무리

findById() findByIdAndDelete()등의 사용법 추가로 업로드 예정

0개의 댓글