MongoDB
무엇인가
MongoDB는 데이터를 유연한 JSON 유사 문서(BSON)로 저장하고 이를 컬렉션으로 묶는 문서 데이터베이스다. 경직된 테이블과 행 대신, 각 문서가 자체적인 형태를 가질 수 있어 모델을 빠르게 진화시키기 쉽다. 데이터가 중첩된 객체로 자연스럽게 매핑되는 애플리케이션에서 인기 있는 선택이다.
강점
- 유연한 스키마: 문서는 마이그레이션 없이 다양해지고 진화할 수 있다.
- 데이터가 애플리케이션 객체에 직접 매핑되어 변환 코드가 줄어든다.
- 풍부한 쿼리 언어와 강력한 집계(aggregation) 파이프라인.
- 내장 샤딩을 통한 수평 확장.
- 중첩 및 배열 필드에 대한 강력한 지원.
트레이드오프
- 규율 있는 스키마 설계 없이는 일관성 없는 데이터를 만들기 쉽다.
- 다중 문서 트랜잭션이 존재하지만 관계형 저장소보다 무겁다.
- 조인(
$lookup)은 SQL에 비해 제한적이다. 데이터는 흔히 비정규화된다. - 비정규화는 데이터를 중복시키고 갱신을 복잡하게 만들 수 있다.
언제 사용하는가
콘텐츠 관리, 카탈로그, 사용자 프로필, 이벤트 로깅, 그리고 정규화된 테이블보다 문서가 더 잘 맞는, 진화하거나 계층적인 데이터를 가진 앱에 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 } } }
]);