우당탕탕
MongoDB 처음 써보면서 RDBMS와 달라서 놀랐던 부분들 직접 정리했어요 본문
사실 이걸 구현하다가 생각보다 삽질을 많이 했어요. 평소에 RDBMS만 쓰다가 MongoDB를 처음 써보면서 쿼리문 작성 방식이랑 데이터 구조가 완전 다르더라고요. 그래서 직접 여러 쿼리를 짜보고 최적화도 해보면서 느낀 점들을 정리하려고 합니다.
이 글에서는 MongoDB의 기본적인 CRUD 쿼리 작성법과 RDBMS와 다른 개념들, 그리고 실제 수행 결과를 보면서 헷갈리기 쉬운 부분들을 자세히 다뤄볼 거예요. 특히 복잡한 조건검색과 인덱스 사용법, 그리고 데이터 중복 처리에서 주의할 점까지 제가 직접 실험해 본 내용을 꽉 채워봤습니다.
개발 환경 / 버전 정보
이번 테스트는 MongoDB 6.0 버전과 Node.js 18 환경에서 진행했습니다. 데이터는 샘플로 직원 정보와 주문 내역 데이터를 넣어서 쿼리를 작성했고, 각 쿼리 실행 결과도 실시간으로 캡처해가면서 분석했어요.
MongoDB 기본 CRUD, RDBMS와 가장 크게 다른 점
사실 이 부분이 가장 헷갈리는데요. MongoDB는 'Document' 단위로 데이터를 저장하고, 쿼리도 JSON 형식으로 하는 게 특징이에요. RDBMS처럼 JOIN 같은 개념이 없고 복잡한 관계를 표현하려면 별도 설계가 필요했죠.
// 직원 데이터를 저장하는 예시 (RDBMS는 테이블 행 단위)
db.employees.insertOne({
"name": "홍길동",
"age": 33,
"department": "개발",
"skills": ["JavaScript", "MongoDB", "Node.js"]
});
보시면 배열과 중첩 데이터가 자연스럽게 들어가 있는 게 RDBMS와 차이점 중 하나입니다. RDBMS에선 따로 관계형 테이블로 분리했어야 했거든요.
복잡한 검색 쿼리, 이렇게 하면 됩니다
조건이 여러 개일 때는 $and, $or 연산자를 잘 써야 해요. 그리고 배열 안에서도 조건을 걸 수 있어서 꽤 탄력적입니다.
// '개발' 부서면서 'Node.js' 스킬 가진 직원 찾기
const query = {
$and: [
{ department: "개발" },
{ skills: "Node.js" }
]
};
db.employees.find(query).pretty();
실행 결과로 조건에 맞는 직원 문서들이 쭉 나왔는데, 이런 부분이 RDBMS보다 훨씬 직관적이라 개인적으로 좋았어요.
여기서 많이 틀립니다, 인덱스 그리고 성능 최적화
인덱스를 만드는 건 RDBMS랑 비슷한데, 배열 내부 필드까지 잡으려면 특수하게 만들어야 해서 저는 한참 헤맸거든요. 아래처럼 배열 필드 안에 인덱스를 걸면 조건검색 성능이 확 올라갑니다.
// skills 배열 필드에 대한 인덱스 생성
db.employees.createIndex({ skills: 1 });
// 인덱스 생성 후 쿼리 실행 계획 확인
db.employees.find({ skills: "Node.js" }).explain("executionStats");
실행 계획을 보면 RDBMS에서의 인덱스 스캔과 비슷한 거 확인할 수 있었는데, 배열 필드에 인덱스 걸린 덕분에 훨씬 빠르게 검색됐어요.
저는 이 방법 썼어요, 중복 데이터 관리 팁
RDBMS에선 보통 PK 제약조건 걸어서 중복을 막는데, MongoDB는 _id가 기본 키 역할을 해서 보통 별도 제약조건이 없어요. 그래서 중복 체크 로직을 클라이언트에서 직접 처리하거나 unique 인덱스를 만들어야 했는데, 저는 다음과 같이 했습니다.
// 이메일 중복 방지를 위한 unique 인덱스 생성
db.employees.createIndex({ email: 1 }, { unique: true });
// 중복 시도하면 에러 발생
try {
db.employees.insertOne({ name: "김철수", email: "c@test.com" });
} catch (e) {
console.error("중복 이메일입니다.", e);
}
이렇게 하면 굳이 트랜잭션 걸지 않아도 중복 문제를 어느 정도 제어할 수 있었어요.
실제로 막혔던 부분들
이 에러가 왜 나는지 한참 찾았는데, MongoDB에서 JSON 쿼리 문법이 엄격해서 쉼표 하나만 잘못 넣어도 에러가 나더라고요. 아래처럼요.
// 에러 발생 예시
db.employees.find({ department: "개발", skills: "Node.js", });
// 쉼표 뒤에 불필요한 콤마가 있어서 SyntaxError 발생
이런 건 에러 메시지 읽어보면 바로 알 수 있는데, 쿼리 길어지면 금방 헷갈려서 의외로 자주 실수하게 되더라고요.
추가로 알면 좋은 팁들
MongoDB에서는 Aggregation Framework라는 강력한 데이터 처리 도구가 있어요. RDBMS의 GROUP BY와 비슷한 역할을 하는데, 훨씬 다양한 연산을 조합해서 쓸 수 있더라고요. 저도 한참 공부했는데, 특정 필드별 합계, 평균 같은 통계 내는 데 엄청 편리합니다.
그리고 분산 처리와 복제 세팅도 생각보다 간단하게 돼 있어서, 대용량 데이터 처리나 장애 대응 시에도 강점이 많아요. RDBMS에 익숙한 분은 구조가 너무 달라서 어렵겠지만, 문서 기반 모델이 꼭 필요한 프로젝트라면 배워볼 가치가 충분합니다.
자주 물어보시는 것들
Q. MongoDB도 JOIN처럼 테이블 연결할 수 있나요?
A. MongoDB는 전통적인 JOIN 문법은 없지만, $lookup이라는 Aggregation 단계에서 비슷한 기능을 제공합니다. 하지만 JOIN 남발보다는 데이터 중복을 허용하고 문서에 필요한 데이터를 넣는 게 성능에 훨씬 유리한 편이에요.
Q. 트랜잭션 지원은 어떻게 되나요?
A. 4.0 버전 이후부터 다중 도큐먼트 트랜잭션을 지원하지만, RDBMS처럼 완전하진 않고 성능 이슈가 있을 수 있어서 꼭 필요한 경우에만 쓰는 게 좋아요. 보통 설계할 때 트랜잭션 의존도를 줄이는 방향을 추천합니다.
이렇게 MongoDB를 처음 사용하면서 겪은 경험과 RDBMS 대비 특징들을 살펴봤습니다. 직접 쿼리 실행해보고 결과 확인하면서 느낀 점들이라 실제 적용할 때 도움이 될 거예요. 다음에는 Aggregation Framework를 깊게 파볼 예정인데, 이 부분만 제대로 이해해도 데이터 처리가 훨씬 수월해집니다.
'Database' 카테고리의 다른 글
| 2026년 기준 PostgreSQL과 MySQL 실무 선택, 바뀐 점과 팁 (0) | 2026.06.03 |
|---|---|
| MySQL 슬로우 쿼리 잡으면서 제가 저지른 실수와 해결법 (0) | 2026.06.02 |
| MongoDB 처음 써보면서 RDBMS와 확실히 달랐던 부분들 정리해봤어요 (0) | 2026.05.29 |
| Redis 캐싱 Spring Boot 연동 직접 구현해보니 쾌적한 성능 체감했어요 (0) | 2026.05.27 |
| MongoDB 처음 써보면서 RDBMS와 달라서 막혔던 부분들 정리 (0) | 2026.05.20 |
