MongoDB 변경 스트림 (Change Streams)를 사용한 실시간 데이터 변경 감지

KUKJIN LEE's profile picture

KUKJIN LEE3주 전 작성

MongoDB 변경 스트림이란?

MongoDB 변경 스트림은 데이터베이스에서 발생하는 모든 변경 사항(데이터 추가, 수정, 삭제 등)을 실시간으로 감지하여 애플리케이션에 전달하는 기능입니다. 이는 실시간 데이터 모니터링이 필요한 시스템, 예를 들어 물류 시스템에서 재고 변동을 추적하거나, 소셜 네트워크에서 새 메시지 알림을 제공하는 데 매우 유용합니다.

(클러스터에서 변경 사항이 발생할 때 이를 실시간으로 클라이언트에게 알리는 방식으로 작동합니다.)

 

변경 스트림의 장점

  1. 실시간 데이터 처리: 변경 사항이 발생하는 즉시 클라이언트에 변경 사항을 전달할 수 있습니다.

  2. 효율성: 주기적인 폴링 방식(예: 10초마다 데이터 갱신 요청)보다 효율적입니다. 변경이 있을 때만 데이터를 전달하므로 리소스 낭비를 줄입니다.

  3. 필터링 가능: 특정 작업 유형(삽입, 업데이트, 삭제 등)에 대해 변경 사항을 필터링할 수 있어 필요한 데이터만 처리 가능합니다.

  4. 손쉬운 재연결: 변경 스트림이 중단되었을 때 마지막으로 처리된 변경 사항 이후의 이벤트를 다시 수신할 수 있습니다.

 

MongoDB 변경 스트림 사용 방법

물류 시스템에서 재고 변동을 실시간으로 모니터링하는 상황을 가정한 예시입니다. 예를 들어, 제품 재고의 삽입, 삭제, 수정이 발생할 때마다 이를 감지하여 관리자에게 알림을 보내는 기능을 구현할 수 있습니다.

const { MongoClient } = require('mongodb');

const uri = "mongodb+srv://<username>:<password>@cluster0.mongodb.net/inventoryDB";
const client = new MongoClient(uri);

async function monitorInventoryChanges() {
  try {
    await client.connect();
    const db = client.db("inventoryDB");
    const inventoryCollection = db.collection("products");

    // 특정 작업에 대해서만 감지 (삽입 및 업데이트)
    const changeStream = inventoryCollection.watch([
      {
        $match: {
          operationType: { $in: ["insert", "update"] }
        }
      }
    ]);

    changeStream.on("change", (next) => {
      if (next.operationType === "insert") {
        console.log("새로운 제품이 추가되었습니다:", next.fullDocument);
      } else if (next.operationType === "update") {
        console.log("제품 정보가 업데이트되었습니다:", next.updateDescription.updatedFields);
      }
    });

    console.log("실시간 재고 변동 감지가 시작되었습니다.");
  } catch (error) {
    console.error("오류 발생:", error);
  }
}

monitorInventoryChanges();

inventoryDB 데이터베이스의 products 컬렉션에서 발생하는 삽입(insert)업데이트(update) 작업만 실시간으로 감지하여 콘솔에 출력하는 예시입니다. 이를 통해 관리자는 제품의 추가 및 수정 사항을 즉시 파악할 수 있습니다.

 

클라이언트와 서버 간 실시간 데이터 흐름

MongoDB 변경 스트림을 통해 데이터베이스에서 변경 사항이 발생하면, 서버는 이를 즉시 감지하고 클라이언트로 전달할 수 있습니다. 이렇게 하면 클라이언트는 매 10초마다 서버에 데이터를 요청하는 폴링 방식 대신, 데이터베이스 변경이 있을 때만 알림을 받는 푸시 방식으로 동작합니다.

이런 방식은 특히 효율적인 실시간 처리가 필요한 환경에서 유리하며, 물류 시스템, 실시간 알림 시스템, 금융 거래 모니터링 등 다양한 도메인에서 활용될 수 있습니다.

New Tech Posts