Contents
see ListMongoDB 기초 - Document DB 시작하기
MongoDB는 대표적인 NoSQL 문서 데이터베이스입니다. JSON 형태의 유연한 스키마로 빠른 개발과 확장성을 제공하며, 관계형 DB와 다른 접근 방식을 사용합니다.
언제 사용하나요?
- 스키마가 자주 변경되는 애플리케이션
- 대량의 비정형 데이터 저장
- 빠른 프로토타이핑과 개발
- 수평 확장이 필요한 시스템
기본 개념
RDBMS MongoDB
Database → Database
Table → Collection
Row → Document
Column → Field
Join → Embedding / ReferenceCRUD 작업
// 삽입 (Create)
db.users.insertOne({
name: "홍길동",
email: "hong@test.com",
age: 30,
tags: ["developer", "backend"],
address: {
city: "서울",
district: "강남구"
},
createdAt: new Date()
});
// 조회 (Read)
db.users.find(); // 전체
db.users.find({ age: 30 }); // 조건
db.users.find({ age: { $gt: 25 } }); // 비교 연산
db.users.findOne({ name: "홍길동" }); // 하나만
// 프로젝션 (필드 선택)
db.users.find({}, { name: 1, email: 1, _id: 0 });
// 수정 (Update)
db.users.updateOne(
{ name: "홍길동" },
{ $set: { age: 31 } }
);
// 삭제 (Delete)
db.users.deleteOne({ name: "김철수" });연산자
// 비교 연산자
$eq 같음 $ne 다름
$gt 초과 $gte 이상
$lt 미만 $lte 이하
$in 배열포함 $nin 배열미포함
// 논리 연산자
db.users.find({
$and: [
{ age: { $gte: 20 } },
{ age: { $lte: 30 } }
]
});
db.users.find({
$or: [
{ status: "active" },
{ role: "admin" }
]
});
// 배열 연산자
db.users.find({ tags: "developer" });
db.users.find({ tags: { $all: ["a", "b"] } });
db.users.find({ tags: { $size: 2 } });인덱스
// 단일 필드 인덱스
db.users.createIndex({ email: 1 });
// 복합 인덱스
db.users.createIndex({ status: 1, createdAt: -1 });
// 유니크 인덱스
db.users.createIndex({ email: 1 }, { unique: true });
// 인덱스 확인
db.users.getIndexes();Aggregation Pipeline
// 그룹화 및 집계
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $group: {
_id: "$userId",
totalAmount: { $sum: "$amount" },
orderCount: { $sum: 1 }
}},
{ $sort: { totalAmount: -1 } },
{ $limit: 10 }
]);
// 조인 ($lookup)
db.orders.aggregate([
{ $lookup: {
from: "users",
localField: "userId",
foreignField: "_id",
as: "user"
}},
{ $unwind: "$user" }
]);Spring Data MongoDB
// 의존성
spring-boot-starter-data-mongodb
// 엔티티
@Document(collection = "users")
public class User {
@Id
private String id;
private String name;
private String email;
private List<String> tags;
}
// Repository
public interface UserRepository
extends MongoRepository<User, String> {
List<User> findByName(String name);
List<User> findByAgeGreaterThan(int age);
}RDBMS vs MongoDB
| 항목 | RDBMS | MongoDB |
|---|---|---|
| 스키마 | 고정 | 유연 |
| 관계 | JOIN | 임베딩/참조 |
| 트랜잭션 | 강력 | 제한적 |
| 확장 | 수직 | 수평 (샤딩) |
| 적합 | 복잡한 관계 | 비정형 데이터 |