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");