MongoDB 관련 정리

전창현·2026년 4월 22일

MongoDB 개념 정리

목록 보기
1/2

1. RDB vs NoSQL 역할 구분

현재 프로젝트의 주요 도메인인 사용자, 관심사, 뉴스 기사, 댓글, 알림은

데이터 구조가 명확하고 관계가 뚜렷하기 때문에 RDB가 적합하다.

반면, 사용자 활동 내역은 다음과 같은 특징을 가진다.

  • 로그인, 조회, 좋아요, 댓글 등 이벤트 종류가 다양함
  • 데이터 구조가 완전히 동일하지 않음
  • 조회 시 여러 데이터를 한 번에 모아서 보여줘야 함

이 경우 RDB로 구현하면 다음과 같은 문제가 발생한다.

SELECT ...
FROM users
JOIN user_interests
JOIN comments
JOIN comment_likes
JOIN news_articles
...

→ 다수의 JOIN + 집계 쿼리 발생

→ 조회 비용 증가


2. MongoDB를 사용하는 이유

MongoDB는 JSON 기반 문서형 DB로, 데이터를 한 번에 묶어서 저장할 수 있다.

{
  "userId": "uuid",
  "activities": [
    {
      "type": "ARTICLE_VIEW",
      "articleTitle": "2026년 IT 전망",
      "content": "기사 조회",
      "createdAt": "..."
    },
    {
      "type": "COMMENT",
      "articleId": "...",
      "content": "좋은 기사네요",
      "createdAt": "..."
    }
  ]
}

장점

  • JOIN 없이 한 번의 조회로 데이터 확보 가능
  • 다양한 형태의 데이터를 유연하게 저장 가능
  • 읽기 성능(Read Performance) 개선

결론

MongoDB는

👉 조회 성능 최적화를 위한 비정규화 저장소로 사용


3. Redis / Cassandra를 사용하지 않는 이유

NoSQL이라고 해서 모두 같은 목적이 아니다.

Redis

  • 인메모리 DB
  • 매우 빠르지만 기본적으로 휘발성
  • 주 용도: 캐싱

👉 현재 요구사항(영구 활동 저장)과 맞지 않음

Cassandra

  • 대규모 분산 DB
  • 초대용량 트래픽 환경에 적합

👉 현재 프로젝트 규모 대비 과한 선택

결론

👉 MongoDB가 가장 적절한 선택


4. 비정규화 / 역정규화 적용 이유

정규화는 데이터를 최소 단위로 나누는 방식이다.

하지만 조회 성능 관점에서는 단점이 존재한다.

문제 예시

  • 뉴스 기사 조회 시 댓글 수 필요
  • 매번 댓글 테이블 JOIN 필요

해결 방법

  • news_articles 테이블에 comment_count 컬럼 추가

👉 이것이 비정규화(= 역정규화)

특징

  • 데이터 중복 허용
  • 조회 성능 향상
  • JOIN 제거 가능

이번 프로젝트 적용

👉 사용자 활동 내역을 MongoDB에 통째로 저장


5. 수직 확장 vs 수평 확장

수직 확장 (Scale-Up)

  • 서버 1대 성능 강화 (CPU, RAM 증가)
  • RDB에서 주로 사용

장점

  • 데이터 정합성 유지
  • 트랜잭션 처리 강함

단점

  • 확장 한계 존재

수평 확장 (Scale-Out)

  • 서버 여러 대로 분산
  • MongoDB에서 적합

장점

  • 데이터 분산 처리
  • 병렬 처리로 조회 성능 향상

단점

  • 트랜잭션 및 정합성 관리 어려움

정리

  • RDB → 정합성 중심
  • MongoDB → 확장성과 조회 성능 중심

6. Docker에서 MongoDB 사용 목적

현재 단계에서의 목적:

👉 로컬 개발 환경 통일

방법

  • MongoDB를 직접 설치하지 않고 Docker 컨테이너로 실행

장점

  • OS에 관계없이 동일 환경 유지
  • 팀원 간 설정 충돌 방지

이후 흐름

  1. 로컬에서 Docker로 MongoDB 사용
  2. 개발 완료 후 AWS 환경에 MongoDB 구성 (필요 시)
profile
정체되지 않는 개발자가 되기 위해 기록합니다.

0개의 댓글