Nick Dev

[CurriculumMaker] 02. MongoDB 선택한 이유 본문

CurriculumMaker

[CurriculumMaker] 02. MongoDB 선택한 이유

Nick99 2025. 1. 25. 21:52
반응형

MongoDB 선택 이유

MongoDB를 선택한 이유는 크게 2가지이다.

  1. 커리큘럼 데이터의 구조
  2. 데이터 조회 패턴

1. 커리큘럼 데이터의 구조

"curriculum": [
    {
      "title": "강의 소개 및 실습 환경 구성",
      "units": [
        {
          "_id": newNumberLong("123574"),
          "title": "강의 소개",
          "runtime": newNumberInt("437")
        },
        {
          "_id": newNumberLong("125608"),
          "title": "강의 커리큘럼 및 실습 코드 소개",
          "runtime": newNumberInt("366")
        },
        {
          "_id": newNumberLong("124151"),
          "title": "강의 교재 및 실습 코드 다운로드",
          "runtime": newNumberInt("0")
        }
      ]
    },
    {
      "title": "Kakfa Topic, Producer, Consumer  이해 및 CLI로 실습 해보기",
      "units": [
        {
          "_id": newNumberLong("123900"),
          "title": "카프카, 시작하며",
          "runtime": newNumberInt("178")
        },
        {
          "_id": newNumberLong("123697"),
          "title": "Topic과 Partition 그리고 카프카 병렬 분산 처리 개요",
          "runtime": newNumberInt("951")
        },
        {
          "_id": newNumberLong("123698"),
          "title": "kafka-topics 명령어를 이용하여 Topic 생성 및 정보 확인하기",
          "runtime": newNumberInt("731")
        }
      ]
    },

      ...
  ]
  • 위 JSON 과 같이 커리큘럼 데이터의 구조가 Curriculum -> Sections -> Units 로 구성되어 있다.

RDB로 구현 시, 아래와 같이 여러 테이블로 분리해야 한다.

-- courses 테이블
CREATE TABLE courses (
    id VARCHAR(255) PRIMARY KEY,
    title VARCHAR(255),
    instructor VARCHAR(255)
);

-- sections 테이블
CREATE TABLE sections (
    id INT PRIMARY KEY,
    course_id VARCHAR(255),
    title VARCHAR(255),
    FOREIGN KEY (course_id) REFERENCES courses(id)
);

-- units 테이블
CREATE TABLE units (
    id INT PRIMARY KEY,
    section_id INT,
    title VARCHAR(255),
    runtime INT,
    FOREIGN KEY (section_id) REFERENCES sections(id)
);
  • 이 상황에서 데이터를 조회하게 되면 최소 3번 이상의 JOIN 연산(Course 테이블과도 JOIN)이 필요해진다.

근데 MongoDB라면?

{
    "_id": "329398",
    "title": "카프카 완벽 가이드 - 코어편",
    "instructors": ["권 철민"],
    "curriculum": {
        "sections": [
            {
                "title": "강의 소개 및 실습 환경 구성",
                "units": [
                    {
                        "_id": 123574,
                        "title": "강의 소개",
                        "runtime": 437
                    }
                    // ... 더 많은 units
                ]
            }
            // ... 더 많은 sections
        ]
    }
}
  • 이렇게 문서 하나에 계층 구조가 다 포함되어 있어서 조회가 훨씬 편하다

2. 데이터 조회 패턴

RDB의 경우, 강의 정보와 커리큘럼 정보를 갖고 오려면 아래와 같은 복잡한 JOIN 쿼리가 필요하다

select c.*, s.*, u.*
from courses c
left join sections s on c.id = s.course_id
left join units u on s.id = u.section_id
where c.id = "329398";
  • 여러 데이터를 조합하는 과정에서 시간을 많이 소요하기에 실행 비용이 높다

MongoDB의 경우, 단 하나의 쿼리로 전체 데이터를 다 가져올 수 있다.

db.courses.findOne({ "_id": "329398" })
  • 이 경우, 개별 section, unit에 대해서는 조회할 수가 없다.
  • 하지만, 비지니스 로직 상 개별 section, unit을 조회할 일이 없다. (왜냐면 해당 강의에 대한 전체 계획을 짜주는 서비스인데 각 unit을 조회할 일이 없음!)

정리! 계층 구조인 커리큘럼 데이터를 한방에 저장하고 조회하기 위해 MongoDB 사용~

반응형