AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Docs Menu

Change Stream으로 데이터 모니터링

이 가이드 에서는 코틀린 동기 (Kotlin Sync) 운전자 를 사용하여 데이터베이스 의 실시간 변경 사항을 볼 수 있는 변경 스트림 을 모니터 하는 방법을 학습 수 있습니다. 변경 스트림 은 컬렉션, 데이터베이스 또는 배포서버 서버에 데이터 변경 사항을 게시하는 MongoDB Server 기능 입니다. 애플리케이션 은 변경 스트림 을 구독 하고 이벤트를 사용하여 다른 작업을 수행할 수 있습니다.

Atlas Stream Processing

변경 스트림의 대안으로 Atlas Stream Processing 사용하여 데이터 스트림을 프로세스 하고 변환할 수 있습니다. 데이터베이스 이벤트만 등록하는 변경 스트림과 달리 Atlas Stream Processing 여러 데이터 이벤트 유형을 관리하고 확장된 데이터 처리 기능을 제공합니다. 이 기능에 대해 자세히 학습하려면 MongoDB Atlas 설명서에서 Atlas Stream Processing 을 참조하세요.

이 가이드의 예시에서는 Atlas 샘플 데이터 세트sample_restaurants 데이터베이스에 있는 restaurants 컬렉션을 사용합니다. 무료 MongoDB 배포서버를 생성하고 샘플 데이터 세트를 로드하는 방법을 알아보려면 MongoDB 시작하기 가이드를 참조하세요.

다음 코틀린 (Kotlin) 데이터 클래스는 이 컬렉션 의 문서를 모델링합니다.

data class Restaurant(
val name: String,
val cuisine: String,
)

변경 스트림 을 열려면 watch() 메서드를 호출합니다. watch() 메서드를 호출하는 인스턴스 에 따라 변경 스트림 이 수신 대기하는 이벤트 범위가 결정됩니다. 다음 클래스의 인스턴스에서 watch() 메서드를 호출할 수 있습니다.

  • MongoClient: MongoDB deployment의 모든 변경 사항을 모니터링합니다.

  • MongoDatabase: 데이터베이스에 있는 모든 컬렉션의 변경 사항을 모니터링합니다.

  • MongoCollection: 컬렉션의 변경 사항을 모니터링합니다.

다음 예시 에서는 restaurants 컬렉션 에서 변경 스트림 을 열고 변경 사항이 발생할 때 출력합니다.

collection.watch().forEach { change ->
println(change)
}

변경 사항을 확인하려면 애플리케이션 을 실행 합니다. 그런 다음 별도의 애플리케이션 또는 shell 에서 restaurants 컬렉션 에 대한 쓰기 (write) 작업을 수행합니다. 다음 예시 에서는 name 값이 "Blarney Castle" 인 문서 를 업데이트합니다.

val filter = Filters.eq(Restaurant::name.name, "Blarney Castle")
val update = Updates.set(Restaurant::cuisine.name, "Irish")
val result = collection.updateOne(filter, update)

컬렉션을 업데이트하면 변경 스트림 애플리케이션은 변경 사항이 발생하는 즉시 출력합니다. 인쇄된 변경 이벤트는 다음과 유사합니다.

{
"_id": { ... },
"operationType": "update",
"clusterTime": { ... },
"ns": {
"db": "sample_restaurants",
"coll": "restaurants"
},
"updateDescription": {
"updatedFields": {
"cuisine": "Irish"
},
"removedFields": [],
"truncatedArrays": []
}
...
}

pipeline 매개변수를 watch() 메서드에 전달하여 변경 스트림 출력을 수정할 수 있습니다. 이 매개변수를 사용하면 지정된 변경 이벤트만 감시할 수 있습니다. 매개변수의 형식을 각각 집계 단계를 나타내는 객체 목록으로 지정합니다.

pipeline 매개변수에 다음 단계를 지정할 수 있습니다.

  • $addFields

  • $match

  • $project

  • $replaceRoot

  • $replaceWith

  • $redact

  • $set

  • $unset

다음 예시 에서는 $match 가 포함된 pipeline 매개 변수를 사용하여 업데이트 작업만 기록하는 변경 스트림 을 엽니다.

val pipeline = listOf(
Aggregates.match(Filters.eq("operationType", "update"))
)
collection.watch(pipeline).forEach { change ->
println(change)
}

변경 스트림 출력 수정에 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 변경 스트림 출력 수정 섹션을 참조하세요.

watch() 메서드 호출에서 반환된 ChangeStreamIterable 객체 에 메서드를 연결하여 watch() 를 수정할 수 있습니다. 옵션을 지정하지 않으면 운전자 는 작업을 사용자 지정하지 않습니다.

다음 표에서는 watch() 의 동작을 사용자 지정하는 데 사용할 수 있는 메서드에 대해 설명합니다.

메서드
설명

batchSize()

배치 당 반환할 문서 수를 설정합니다.

collation()

결과를 정렬할 때 사용할 언어 데이터 정렬의 종류를 지정합니다. 자세한 내용은 MongoDB Server 매뉴얼에서 데이터 정렬 을 참조하세요.

comment()

작업에 첨부할 주석을 지정합니다.

fullDocument()

fullDocument 값을 설정합니다. 더 많은 내용을 학습하려면 이 문서의 "사전 이미지 및 게시 이미지 포함 " 섹션을 참조하십시오.

fullDocumentBeforeChange()

fullDocumentBeforeChange 값을 설정합니다. 더 많은 내용을 학습하려면 이 문서의 "사전 이미지 및 게시 이미지 포함 " 섹션을 참조하십시오.

maxAwaitTime()

이 작업에 대한 서버의 최대 대기 실행 시간을 밀리초 단위로 설정합니다.

watch() 메서드를 구성하는 데 사용할 수 있는 메서드의 전체 목록은 ChangeStreamIterable API 설명서를 참조하세요.

중요

배포에서 MongoDB v6.0 이상을 사용하는 경우에만 컬렉션에서 사전 이미지 및 사후 이미지를 활성화할 수 있습니다.

기본값 으로 컬렉션 에서 작업을 수행할 때 해당 변경 이벤트 에는 해당 작업에 의해 수정된 필드의 델타만 포함됩니다. 변경 전후의 전체 문서 를 보려면 fullDocumentBeforeChange() 또는 fullDocument() 메서드를 watch() 메서드에 연결합니다.

사전 이미지 는 변경 전의 문서 전체 버전입니다. 변경 스트림 이벤트 에 사전 이미지를 포함하려면 다음 옵션 중 하나를 fullDocumentBeforeChange() 메서드에 전달합니다.

  • FullDocumentBeforeChange.WHEN_AVAILABLE: 변경 이벤트에는 사전 이미지를 사용할 수 있는 경우에만 변경 이벤트에 대해 수정된 문서의 사전 이미지가 포함됩니다.

  • FullDocumentBeforeChange.REQUIRED: 변경 이벤트에는 변경 이벤트에 대한 수정된 문서의 사전 이미지가 포함됩니다. 사전 이미지를 사용할 수 없는 경우 드라이버에서 오류가 발생합니다.

사후 이미지 는 변경 문서 의 전체 버전입니다. 변경 스트림 이벤트 에 사후 이미지를 포함하려면 다음 옵션 중 하나를 fullDocument() 메서드에 전달합니다.

  • FullDocument.UPDATE_LOOKUP: 변경 이벤트에는 변경 후 일정 시간 이후의 변경된 문서 전체의 복사본이 포함됩니다.

  • FullDocument.WHEN_AVAILABLE: 변경 이벤트에는 사후 이미지를 사용할 수 있는 경우에만 변경 이벤트에 대해 수정된 문서의 사후 이미지가 포함됩니다.

  • FullDocument.REQUIRED: 변경 이벤트에는 변경 이벤트에 대한 수정된 문서의 사후 이미지가 포함됩니다. 사후 이미지를 사용할 수 없는 경우 드라이버에서 오류가 발생합니다.

다음 예시 에서는 컬렉션 에서 watch() 메서드를 호출하고 fullDocument 매개변수를 지정하여 업데이트된 문서의 사후 이미지를 결과에 포함합니다.

collection.watch().fullDocument(FullDocument.UPDATE_LOOKUP).forEach { change ->
println("Received a change: $change")
}

변경 스트림 애플리케이션이 실행 중인 상태에서 앞의 업데이트 예시 를 사용하여 restaurants 컬렉션의 문서를 업데이트하면 다음과 유사한 변경 이벤트가 출력됩니다.

ChangeStreamDocument{ operationType=update, resumeToken={"_data": "..."},
namespace=sample_restaurants.restaurants, destinationNamespace=null, fullDocument=Restaurant(name=Blarney Castle, cuisine=Irish),
fullDocumentBeforeChange=null, documentKey={"_id": {"$oid": "..."}},
clusterTime=Timestamp{value=..., seconds=..., inc=...},
updateDescription=UpdateDescription{removedFields=[], updatedFields={"cuisine": "Irish"},
truncatedArrays=[], disambiguatedPaths=null}, txnNumber=null, lsid=null, splitEvent=null,
wallTime=BsonDateTime{value=...}}

사전 이미지 및 사후 이미지에 대해 자세히 알아보려면 Change Streams 매뉴얼에서 문서 사전 및 사후 이미지로 MongoDB Server 을 참조하세요.

변경 스트림에 대해 자세히 알아보려면 Change Streams 매뉴얼의 MongoDB Server 을 참조하세요.

이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.