데이터베이스에 데이터를 잘 쌓는 것도 중요하지만, 쌓인 데이터를 '의미 있는 정보'로 가공하는 과정은 더욱 중요합니다. 특히 수만 건의 일정 데이터나 로그가 쌓인 환경에서 "이번 달 가장 많이 시간을 보낸 카테고리는 무엇인가?" 같은 질문에 답하려면 효율적인 분석 도구가 필요합니다.
전통적인 방식에서는 데이터를 모두 꺼내와서 프로그래밍 언어로 계산했지만, 이제는 MongoDB의 집계 파이프라인(Aggregation Pipeline)을 통해 데이터베이스 내부에서 이 모든 과정을 눈 깜짝할 새 처리할 수 있습니다.
1. 파이프라인: 데이터를 가공하는 컨베이어 벨트
집계 파이프라인이라는 용어가 어렵게 느껴질 수 있지만, 원리는 단순합니다. 공장의 컨베이어 벨트를 상상해 보세요. 원재료가 벨트를 타고 이동하며 각 공정(Stage)을 거쳐 완성품이 되는 것과 같습니다.
집계 파이프라인의 3대 핵심 공정
- $match (선별): 수많은 데이터 중 내가 필요한 데이터만 골라냅니다. 예를 들어 '2026년에 작성된 글'만 통과시키는 필터입니다.
- $group (분류): 흩어진 데이터를 특정 기준에 따라 묶습니다. '카테고리별' 혹은 '작성자별'로 데이터를 모으는 작업입니다.
- $sort (정렬): 가공된 데이터를 보기 좋게 줄 세웁니다. 가장 합계가 높은 순서대로 나열하는 식입니다.
2. 왜 굳이 데이터베이스 안에서 처리해야 할까요?
어떤 개발자들은 "그냥 자바스크립트로 filter랑 reduce 돌리면 안 되나요?"라고 묻습니다. 하지만 여기에는 치명적인 함정이 있습니다.
- 네트워크 대역폭 절약: 10만 건의 데이터를 내 컴퓨터로 가져와서 처리하는 것보다, DB 안에서 계산을 끝내고 결과값 1건만 받는 것이 훨씬 빠릅니다.
- 서버 메모리 보호: 방대한 데이터를 한꺼번에 서버 메모리에 올리면 서버가 다운될 수 있습니다. DB 엔진은 이러한 대규모 연산에 최적화되어 있습니다.
- 속도의 차이: 인덱스를 활용한 DB의 집계 속도는 일반 프로그램의 반복문과는 차원이 다른 퍼포먼스를 보여줍니다.
3. 실전 활용: 일정 관리 데이터 통계 내기
실제 eleslog.work의 플래너 시스템에서 사용되는 쿼리 구조를 살펴볼까요? 사용자가 자신의 카테고리별 시간 통계를 확인하고 싶어 할 때, 다음과 같은 마법이 일어납니다.
db.todos.aggregate([
// 1단계: 내 아이디의 일정만 골라내기
{ $match: { userId: "user123" } },
// 2단계: 카테고리별로 소요 시간(duration)을 더하기
{ $group: { _id: "$category", total: { $sum: "$duration" } } },
// 3단계: 시간이 많이 걸린 순서대로 정렬하기
{ $sort: { total: -1 } }
]);
항상 $match 단계를 맨 앞에 두어야 합니다. 처리해야 할 데이터의 양을 미리 줄여놓지 않으면, 뒤 단계에서 과부하가 걸려 속도가 급격히 떨어질 수 있습니다.
4. 마치며: 데이터 속에 숨겨진 가치를 찾아서
데이터는 그 자체로도 자산이지만, 분석을 통해 인사이트를 제공할 때 진정한 가치가 빛납니다. MongoDB의 집계 파이프라인은 복잡한 수학적 연산을 직관적인 단계로 풀어내어 개발자가 더 창의적인 일에 집중할 수 있게 도와줍니다.
여러분의 프로젝트에서도 단순히 데이터를 저장하는 것에 만족하지 말고, 파이프라인을 구축해 보세요. 데이터가 들려주는 새로운 이야기에 깜짝 놀라게 될 것입니다. 다음에는 다른 컬렉션의 데이터를 연결하는 $lookup(조인) 기능을 활용한 더 복잡한 분석 기법을 소개하겠습니다.