~/VibeHandbook
무료 PDF

데이터베이스

mongodb.com

MongoDB

무엇인가

모든 행이 같은 열을 가져야 하는 고정된 표 대신, 카드마다 서로 다른 항목을 담을 수 있는 색인 카드 묶음을 떠올려 보라. MongoDB는 이 카드 묶음처럼 작동한다. 데이터를 유연한 문서(문서 하나를 카드 한 장이라고 생각하라)로 저장하고 이를 컬렉션으로 묶는 문서 데이터베이스다. 문서는 BSON이라는 형식으로 저장되는데, 이는 데이터를 이름 붙은 항목들로 적는 흔한 방식인 (자바스크립트 객체 표기법)을 MongoDB가 이진 형태로 만든 것이다. 경직된 테이블과 행 대신, 각 문서가 자체적인 형태를 가질 수 있어 모델을 빠르게 진화시키기 쉽다. 데이터가 중첩된 객체로 자연스럽게 매핑되는 애플리케이션에서 인기 있는 선택이다.

강점

  • 유연한 스키마: 문서는 마이그레이션 없이 다양해지고 진화할 수 있다.
  • 데이터가 애플리케이션 객체에 직접 매핑되어 변환 코드가 줄어든다.
  • 풍부한 쿼리 언어와 강력한 집계(aggregation) 파이프라인.
  • 내장 샤딩을 통한 수평 확장.
  • 중첩 및 배열 필드에 대한 강력한 지원.

트레이드오프

  • 규율 있는 스키마 설계 없이는 일관성 없는 데이터를 만들기 쉽다.
  • 다중 문서 트랜잭션이 존재하지만 관계형 저장소보다 무겁다.
  • 조인($lookup)은 (구조적 질의 언어)에 비해 제한적이다. 데이터는 흔히 비정규화된다.
  • 비정규화(조회를 줄이려고 같은 데이터의 사본을 여러 곳에 저장하는 것)는 데이터를 중복시키고 갱신을 복잡하게 만들 수 있다.

언제 사용하는가

콘텐츠 관리, 카탈로그, 사용자 프로필, 이벤트 로깅, 그리고 정규화된 테이블보다 문서가 더 잘 맞는, 진화하거나 계층적인 데이터를 가진 앱에 MongoDB를 선택하라.

바이브 코딩 적합성

AI를 지시할 때 "스키마리스"가 "계획 없음"을 뜻하게 두지 마라. AI에게 명확한 문서 형태를 정의하고 필수 필드와 타입을 포함해 JSON Schema 검증이나 Mongoose 같은 ODM(객체-문서 매퍼)으로 강제하도록 요청하라. 접근 패턴에 따라 관련 데이터를 임베드할지 id로 참조할지 알려주고, 질의하고 정렬하는 필드에 인덱스를 추가하도록 하라. 좋은 팁: AI가 매개변수화된 쿼리 객체를 사용하도록 하라. 즉, 사용자가 입력한 원시 문자열을 이어 붙여 쿼리를 만들지 않게 하라는 뜻이다. 또한 임베드와 참조 중 무엇을 골랐는지 설명하게 하라. 그러면 읽기, 쓰기, 갱신 비용을 직접 이해할 수 있다.

// 스키마 검증으로 문서를 일관성 있게 유지
db.createCollection("users", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["email", "createdAt"],
      properties: {
        email:     { bsonType: "string" },
        createdAt: { bsonType: "date" },
        roles:     { bsonType: "array", items: { bsonType: "string" } }
      }
    }
  }
});

db.users.createIndex({ email: 1 }, { unique: true });

// 집계: 역할별 활성 사용자 수 집계
db.users.aggregate([
  { $match: { active: true } },
  { $unwind: "$roles" },
  { $group: { _id: "$roles", count: { $sum: 1 } } }
]);