ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Database] MongoDB 기본 개념과 용어 정리 - 2
    업무 자동화/Database 2025. 12. 11. 08:39

    1. MongoDB?

    • MongoDB는 JSON 스타일의 문서(Document) 를 저장하는
    • 문서 지향(Document-Oriented) NoSQL 데이터베이스이다.

    주요 키워드

    • 문서(Document)
    • 컬렉션(Collection)
    • BSON (Binary JSON)
    • 스키마 유연성
    • 수평 확장(샤딩)

    2. 핵심 용어 정리

    2-1. Database

    • MongoDB 서버 안에 여러 개의 Database를 만들 수 있다.
    • RDB에서의 “스키마/데이터베이스”와 비슷한 개념

    예) shop_db, log_db, analytics_db

    2-2. Collection

    • Database 안에 여러 개의 Collection을 둘 수 있다.
    • RDB의 테이블(Table) 과 비슷한 위치
    • 하나의 컬렉션에는 비슷한 유형의 도큐먼트들이 저장된다.

    예) users, orders, products, logs

    2-3. Document

    • Collection 안에 저장되는 하나의 레코드
    • RDB의 행(row, record) 에 해당하지만,
    • 구조는 JSON / BSON 형태로 훨씬 유연하다.

    예시 도큐먼트

    {
      "_id": ObjectId("675fa0e9f1c2b8d4f9d8a001"),
      "email": "user@example.com",
      "name": "홍길동",
      "tags": ["beta-user", "korea"],
      "profile": {
        "age": 29,
        "job": "developer"
      },
      "created_at": "2025-12-08T10:00:00Z"
    }

    2-4. Field

    • Document 안의 각각의 “키-값” 단위
    • email, name, tags, profile 등이 필드에 해당한다.

    2-5. BSON

    • MongoDB 내부에서는 JSON이 아니라 BSON(Binary JSON) 이라는 이진 형식으로 저장된다.
    • JSON으로 표현하기 어려운 타입(날짜, ObjectId 등)을 효율적으로 저장하기 위한 형식
    • 사용자는 대부분 JSON 스타일로 생각해도 무방하다.

    2-6. ObjectId

    • MongoDB 문서의 기본 _id 필드로 자주 사용되는 고유 식별자 타입
    • 시간 + 랜덤 정보 등이 조합된 12바이트 값
    • 사람 눈에는 24자리 16진 문자열처럼 보인다.

    예) ObjectId("675fa0e9f1c2b8d4f9d8a001")


    3. 스키마 유연성 (RDB와의 사고 차이)

    3-1. RDB의 스키마

    RDB에서는 보통 다음 순서로 진행한다.

    1. 테이블 구조 설계 (컬럼 이름, 타입, 제약조건)
    2. 테이블 생성
    3. 그 구조에 맞게 데이터 입력

    테이블에 없는 컬럼을 갑자기 쓰려면?
    ALTER TABLE 로 스키마 변경이 필요하다.

    3-2. MongoDB의 스키마

    MongoDB는 스키마를 강제로 요구하지 않는다.

    • 같은 컬렉션에
      • 어떤 도큐먼트는 profile.age 필드가 있고
      • 어떤 도큐먼트는 profile.age 필드가 없을 수도 있다.
    • 서비스 초기에 필드를 조금씩 추가·변경하면서 데이터를 쌓을 수 있다.

    하지만 실무에서는

    • 완전 무계획 스키마리스로 쓰기보다는,

    • “어떤 필드는 반드시 있어야 한다”는 규칙을 애플리케이션 레벨에서 관리하거나,

    • MongoDB의 스키마 검증 기능을 활용해 제한을 추가하는 경우도 많다.

    • 핵심은:

    • RDB보다 필드 추가/구조 변경이 훨씬 자유롭다는 점이다.


    4. 기본 CRUD 흐름

    여기서는 MongoDB 셸이나 드라이버 언어에 상관없이, 개념적인 형태로만 본다.

    4-1. Create (생성)

    // users 컬렉션에 새 도큐먼트 추가
    db.users.insertOne({
      email: "user@example.com",
      name: "홍길동",
      created_at: new Date(),
      tags: ["beta-user", "korea"]
    });
    • _id 를 지정하지 않으면 MongoDB가 자동으로 ObjectId를 생성한다.

    4-2. Read (조회)

    // email로 한 명 조회
    db.users.findOne({ email: "user@example.com" });
    
    // 태그에 "korea" 가 포함된 사용자 목록 조회
    db.users.find({ tags: "korea" });
    • findOne : 단일 도큐먼트
    • find : 여러 도큐먼트(커서 형태)

    4-3. Update (수정)

    // 해당 사용자의 name 필드 수정
    db.users.updateOne(
      { email: "user@example.com" },
      { $set: { name: "김길동" } }
    );
    • $set 연산자는 지정한 필드를 수정하거나 새로 추가한다.

    4-4. Delete (삭제)

    // 한 명 삭제
    db.users.deleteOne({ email: "user@example.com" });

    5. 인덱스와 조회 성능

    5-1. 인덱스 개념

    • RDB와 마찬가지로, MongoDB에서도 인덱스가 매우 중요하다.
    • 자주 조회에 사용되는 필드에 인덱스를 생성하면 성능 향상이 크다.

    예시

    db.users.createIndex({ email: 1 });      // 오름차순 인덱스
    db.users.createIndex({ created_at: -1 }); // 내림차순 인덱스

    5-2. 조합 인덱스

    • 복합 조건으로 자주 조회되는 경우, 복합 인덱스를 고려한다.
    db.users.createIndex({ "profile.age": 1, created_at: -1 });

    6. 실무에서 자주 나오는 MongoDB 패턴

    6-1. 이벤트/로그 수집

    • API 요청/응답 로그
    • 사용자 행동 로그(페이지 뷰, 클릭 등)
    • IoT 센서 데이터
    • 변경이 잦은 스키마, 다양한 타입의 로그에 특히 유리

    6-2. 문서/콘텐츠 저장

    • 블로그 글, 게시글, 댓글 등
    • JSON 기반의 복합 구조를 그대로 도큐먼트에 저장
    • 자주 같이 보여지는 정보들을 한 도큐먼트로 묶기 용이

    6-3. 사용자 프로필 및 설정

    • 각 사용자마다 다른 구조의 속성들을 가질 수 있을 때
    • 예: 기능 실험(AB Test) 설정, 추천 관련 속성, 태그 등

    7. 정리

    • MongoDB는 문서 지향 NoSQL DB 로, JSON 스타일의 데이터 구조를 유연하게 다룰 수 있다.
    • 핵심 용어: Database / Collection / Document / Field / BSON / ObjectId
    • RDB와 비교했을 때, 스키마 변경과 실험이 훨씬 자유롭고,
      로그/이벤트/문서 데이터 등에서 강점을 가진다.
    • 다음 시리즈에서는 MongoDB와 MariaDB를 설계 관점에서 직접 비교하며,
      같은 요구사항을 두 DB에서 어떻게 다르게 풀어내는지 다룬다.
Designed by Tistory.