반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 코딩테스트
- OAuth
- 코드트리
- Oidc
- exception
- nGrinder
- 운영체제
- flutter
- 코딩
- kakao
- c
- hashmap
- AOP
- Scaffold
- login
- 부하 테스트
- 자료구조
- Kafka
- C언어
- 연습문제
- thread
- java
- Sharding
- pub.dev
- Kotlin
- 코딩 테스트
- Redis
- dip
- Spring
- 코드 트리
Archives
- Today
- Total
Nick Dev
[CurriculumMaker] 02. MongoDB 선택한 이유 본문
반응형
MongoDB 선택 이유
MongoDB를 선택한 이유는 크게 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 사용~
반응형
'CurriculumMaker' 카테고리의 다른 글
[CurriculumMaker] 03. 유저 피드백 받고 적용해보기 (2) | 2025.01.25 |
---|---|
[CurriculumMaker] 01. CurriculumMaker 서비스를 만든 이유와 기능 소개 (0) | 2025.01.22 |