MongoDB 기초 - Document DB 시작하기


MongoDB는 대표적인 NoSQL 문서 데이터베이스입니다. JSON 형태의 유연한 스키마로 빠른 개발과 확장성을 제공하며, 관계형 DB와 다른 접근 방식을 사용합니다.



언제 사용하나요?



  • 스키마가 자주 변경되는 애플리케이션

  • 대량의 비정형 데이터 저장

  • 빠른 프로토타이핑과 개발

  • 수평 확장이 필요한 시스템



기본 개념


RDBMS          MongoDB
Database → Database
Table → Collection
Row → Document
Column → Field
Join → Embedding / Reference


CRUD 작업


// 삽입 (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









항목RDBMSMongoDB
스키마고정유연
관계JOIN임베딩/참조
트랜잭션강력제한적
확장수직수평 (샤딩)
적합복잡한 관계비정형 데이터