TIL(Today I Learned)

3월 5일(일)

공부한 내용을 제 언어로 빠르게 정리한 내용이라서 잘못된 내용이 있을 수 있습니다.

MongoDB & Mongoose

  • MongoDB에서 제공하는 mongodb 드라이버를 wrapping 하여 더 편리하게 사용할 수 있게끔 만든 라이브러리
  • 아래와 같이 MongoDB에 연결할 수 있다.
      const mongoose = require("mongoose");
      const MONGO_URI = "mongodb+srv://blahblah";
      let connection = mongoose.connect(MONGO_URI);
    
  • node 서버가 요청을 받기 전에 MongoDB가 서버에 연결되어야한다. mongoose.connect 함수는 비동기 함수이므로 위와 같은 방식으로 하면 데이터베이스와 연결하기 전에 서버가 열릴 수 있다는 문제가 있다.
  • 따라서 다음과 같이 async/await 키워드를 사용해서 데이터베이스에 연결한 이후에, 서버를 열도록 할 수 있다.
      const server = async () => {
        try {
          await mongoose.connect(MONGO_URI);
          console.log("Mongodb connected");
          app.use(express.json());
    
          app.get("/user", async (req, res) => {
            ... 생략 ...
          });
    
          app.post("/user", async (req, res) => {
            ... 생략 ...
          });
    
          app.listen(3000, () => console.log("server listening on port 3000"));
        } catch (err) {
          console.log(err);
        }
      };
    
      server();
    
  • MongoDB를 사용하기 앞서, 스키마와 모델을 정의해주어야 한다. 스키마란 MongoDB에 저장할 데이터 구조를 정의한 것이다. 어떤 키를 갖고 있고, 키의 이름은 무엇인지, 타입은 무엇이고, 반드시 값이 있어야하는지 등등을 정의한다.
  • 아래는 User정보의 스키마를 정의한 것이다. username과 name, age, email을 키로 가진다. 그리고 username과 name의 first, last는 필수적으로 값이 있어야 한다. timestamps를 true로 하면 생성과 업데이트 시점을 자동으로 저장한다.
      const UserSchema = new Schema(
        {
          username: { type: String, required: true },
          name: {
            first: { type: String, required: true },
            last: { type: String, required: true },
          },
          age: Number,
          email: String,
        },
        { timestamps: true }
      );
    
  • 스키마를 정의하면 아래와 같이 해당 스키마에 대한 모델을 정의할 수 있다.
      // models/User.js
      const { Schema, model } = require("mongoose");
    
      const UserSchema = new Schema(
        {
          username: { type: String, required: true },
          name: {
            first: { type: String, required: true },
            last: { type: String, required: true },
          },
          age: Number,
          email: String,
        },
        { timestamps: true }
      );
    
      const User = model("user", UserSchema);
      module.exports = { User };
    
  • 위 모델을 사용하기 위해 server.js에서 다음과 같이 임포트 한다.
      // server.js
      const { User } = require("./models/User");
    

참고 및 예시 출처