[TIL] MySQL -> MongoDB

김시원·2023년 5월 18일
0

TIL

목록 보기
24/50
post-custom-banner

TIL

📌 Issues encountered

Issue #1

MySQL로 자신의 전체 채팅 내역을 조회할 때 쿼리 시간이 너무 오래걸린다. Postman으로 테스트시 2.xx초가 걸린다.

Issue #2

MongoDB 추가 연결하기

📌 What I tried

Issue #1

  • MySQL에서 Chats table과 join해아하는 table이 2개나 되고, 전체 채팅 내역을 조회하는 부분은 특히나 service layer에서 map을 돌면서 반환해줄 객체를 가공해주어야 했기 때문에 쿼리문 실행도 너무 많고 시간도 그만큼 많이 걸렸다.
  • 따라서, MySQL의 Chats table을 MongoDB로 변경하는 것으로 결정하였고, Chats schema와 Messages schema 두 개의 스키마를 만드는 것으로 결정하였다.
  • Chat 관련 DB는 MongoDB이고, 나머지는 모두 MySQL DB이기 때문에 Chat CRUD를 할 때 최대한 MySQL과 병행하며 데이터를 가져오는 부분을 줄이기 위해 Chats schema에 MySQL에서 다루는 데이터들을 담아주었다.
  • Chats -> title, is_sold, product_id, members, members_nickname, address가 담긴다.
  • Messages -> chat_id, sender_id, text가 담긴다.
  • 실제로 MongoDB로 Chat 부분을 변경하니, 조회 시간이 2.xx초에서 약 600 ms로 확 줄었다.

Issue #2

  1. utils/mongodb.js에 다음과 같이 mongoDB에 연결하는 부분을 정의해주었다.
const mongoose = require("mongoose");
const { mongodb } = require("../config/config.js");

const db_url = `mongodb+srv://${mongodb.id}:${mongodb.password}@${mongodb.cluster}/${mongodb.db}?retryWrites=true&w=majority`;

const connectToMongoDB = async (app) => {
  mongoose
    .connect(db_url)
    .then(() => {
      console.log("MongoDB connected")
    })
    .catch((err) => {
      throw err;
    });
};

module.exports = connectToMongoDB;
  1. app.js에서 mongoDB를 다음과 같이 불러준다.
const connectToMongoDB = require("./utils/mongodb");
connectToMongoDB(app);
  1. schema 폴더에 Chats와 Messages 스키마를 정의해주고 이 스키마가 쓰일 repository에서 이 스키마들을 불러서 사용하였다.
post-custom-banner

0개의 댓글