Docs Menu
Docs Home
/ / /
Java 동기화 드라이버
/ / /

Change Stream 열기

이 페이지의 내용

  • 개요
  • Change Stream 열기
  • change stream에 애그리게이션 연산자 적용
  • 대규모 change stream 이벤트 분할
  • 사전 이미지 및 사후 이미지 포함하기

이 가이드에서는 change stream을 사용하여 데이터베이스의 실시간 변경 사항을 모니터링하는 방법을 배울 수 있습니다. change stream은 애플리케이션이 단일 collection, 데이터베이스 또는 배포에서 데이터 변경 사항을 구독할 수 있도록 하는 MongoDB Server 기능입니다.

애그리게이션 연산자 세트를 지정하여 애플리케이션이 수신하는 데이터를 필터링하고 변환할 수 있습니다. MongoDB deployment v6.0 이상에 연결할 때 변경 전후의 문서 데이터를 포함하도록 이벤트를 구성할 수도 있습니다.

다음 섹션에서 change stream을 열고 구성하는 방법을 알아보세요.

  • Change Stream 열기

  • change stream에 애그리게이션 연산자 적용

  • 사전 이미지 및 사후 이미지 포함하기

change stream을 열어 특정 유형의 데이터 변경 사항을 구독하고 애플리케이션에서 변경 이벤트를 생성할 수 있습니다.

change stream을 열려면 watch() MongoCollectionMongoDatabaseinstance, 또는 인스턴스에서 메서드를 MongoClient 호출합니다.

중요

독립형 MongoDB 배포는 변경 스트림을 지원하지 않는데, 이는 이 기능에 복제본 세트 oplog가 필요하기 때문입니다. oplog 에 대해 자세히 알아보려면 복제본 세트 oplog MongoDB Server 매뉴얼 페이지를 참조하세요.

watch() 메서드를 호출하는 객체에 따라 change stream이 수신하는 이벤트의 범위가 결정됩니다.

MongoCollection 에서 watch() 를 호출하면 change stream이 collection을 모니터링합니다.

MongoDatabase 에서 watch() 를 호출하면 change stream이 해당 데이터베이스의 모든 collection을 모니터링합니다.

MongoClient에서 watch() 를 호출하면 change stream은 연결된 MongoDB의 모든 변경 사항을 모니터링합니다.

이 예제에서는 myColl collection에서 change stream을 열고 change stream 이벤트가 발생할 때 출력하는 방법을 보여 줍니다.

드라이버는 ChangeStreamIterable 유형의 변수에 change stream 이벤트를 저장합니다. 다음 예제에서는 드라이버가 ChangeStreamIterable 객체를 Document 유형으로 채워야 한다고 지정합니다. 결과적으로 드라이버는 개별 change stream 이벤트를 ChangeStreamDocument 객체로 저장합니다.

MongoCollection<Document> collection = database.getCollection("myColl");
ChangeStreamIterable<Document> changeStream = collection.watch();
changeStream.forEach(event ->
System.out.println("Received a change: " + event));

collection에 대한 삽입 작업은 다음과 같은 출력을 생성합니다.

Received a change: ChangeStreamDocument{
operationType=insert,
resumeToken={"_data": "..."},
namespace=myDb.myColl,
...
}

실행 가능한 예제는 Watch for Changes 사용 예제 페이지를 참조하세요.

watch() 메서드에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.

집계 파이프라인을 watch() 메서드에 매개변수로 전달하여 change stream이 수신할 이벤트를 지정할 수 있습니다.

사용 중인 MongoDB Server 버전이 지원하는 애그리게이션 연산자를 알아보려면 변경 스트림 출력 수정을 참조하세요.

다음 코드 예제에서는 집계 파이프라인을 적용하여 삽입 및 업데이트 작업에 대해서만 이벤트를 수신하도록 change stream을 구성하는 방법을 보여 줍니다.

MongoCollection<Document> collection = database.getCollection("myColl");
List<Bson> pipeline = Arrays.asList(
Aggregates.match(Filters.in("operationType", Arrays.asList("insert", "update"))));
ChangeStreamIterable<Document> changeStream = collection.watch(pipeline);
changeStream.forEach(event ->
System.out.println("Received a change to the collection: " + event));

collection에 대한 업데이트 작업은 다음과 같은 출력을 생성합니다.

Received a change: ChangeStreamDocument{
operationType=update,
resumeToken={"_data": "..."},
namespace=myDb.myColl,
...
}

MongoDB 7.0부터는 $changeStreamSplitLargeEvent 애그리게이션 단계를 사용하여 16MB를 초과하는 이벤트를 더 작은 조각으로 분할할 수 있습니다.

꼭 필요한 경우에만 $changeStreamSplitLargeEvent 를 사용합니다. 예를 들어, 애플리케이션에 전체 문서 사전 또는 사후 이미지가 필요하고 16MB를 초과하는 이벤트를 생성하는 경우 $changeStreamSplitLargeEvent 를 사용합니다.

$changeStreamSplitLargeEvent 단계는 프래그먼트를 순차적으로 반환합니다. change stream 커서를 사용하여 프래그먼트에 액세스할 수 있습니다. 각 프래그먼트에는 다음 필드를 포함하는 SplitEvent 객체가 포함되어 있습니다.

필드
설명
fragment
에서 시작하는 프래그먼트의 인덱스 1
of
분할 이벤트를 구성하는 총 프래그먼트 수

다음 예에서는 $changeStreamSplitLargeEvent 애그리게이션 단계를 사용하여 대규모 이벤트를 split하여 change stream을 수정합니다.

ChangeStreamIterable<Document> changeStream = collection.watch(
Arrays.asList(Document.parse("{ $changeStreamSplitLargeEvent: {} }")));

참고

집계 파이프라인에는 $changeStreamSplitLargeEvent 단계가 하나만 있을 수 있으며 이 단계가 파이프라인의 마지막 단계여야 합니다.

다음 예와 같이 change stream 커서에서 getSplitEvent() 메서드를 호출하여 SplitEvent 에 액세스할 수 있습니다.

MongoChangeStreamCursor<ChangeStreamDocument<Document>> cursor = changeStream.cursor();
SplitEvent event = cursor.tryNext().getSplitEvent();

$changeStreamSplitLargeEvent 애그리게이션 단계에 대한 자세한 내용은 $changeStreamSplitLargeEvent 서버 설명서를 참조하세요.

다음 데이터를 포함하거나 생략하도록 변경 이벤트를 구성할 수 있습니다.

  • 사전 이미지 작업 전의 문서의 버전을 나타내는 문서(있는 경우)

  • 사후 이미지 작업 후의 문서의 버전을 나타내는 문서(있는 경우)

중요

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

사전 이미지 또는 사후 이미지가 포함된 변경 스트림 이벤트를 수신하려면 다음 작업을 수행해야 합니다.

  • MongoDB deployment에서 collection에 대한 사전 이미지 및 사후 이미지를 활성화합니다.

    배포에서 사전 및 사후 이미지를 활성화하는 방법에 대한 자세한 내용은 서버 설명서의 Change Streams with Document Pre- and Post-Images(이미지 사전 및 사후 문서화의 Change Streams)를 참조하세요.

    사전 이미지 및 사후 이미지가 활성화된 컬렉션을 생성하도록 드라이버에 지시하는 방법을 알아보려면 사전 이미지 및 사후 이미지가 활성화 된 컬렉션 생성 섹션을 참조하세요.

  • 사전 이미지와 사후 이미지 중 하나 또는 둘 다를 검색하도록 change stream을 구성합니다.

    변경 이벤트에 사전 이미지를 기록하도록 변경 스트림을 구성하려면 사전 이미지 구성 예시를 참조하세요.

    변경 이벤트에 사후 이미지를 기록하도록 변경 스트림을 구성하려면 사후 이미지 구성 예시를 참조하세요.

드라이버를 사용하여 사전 이미지 및 사후 이미지 옵션이 활성화된 collection을 생성하려면 ChangeStreamPreAndPostImagesOptions createCollection() 다음 예와 같이 인스턴스를 지정하고 메서드를 호출합니다.

CreateCollectionOptions collectionOptions = new CreateCollectionOptions();
collectionOptions.changeStreamPreAndPostImagesOptions(new ChangeStreamPreAndPostImagesOptions(true));
database.createCollection("myColl", collectionOptions);

MongoDB Shell에서 collMod 명령을 실행하여 기존 컬렉션의 사전 이미지 및 사후 이미지 옵션을 변경할 수 있습니다. 이 작업을 수행하는 방법을 알아보려면 MongoDB Server 매뉴얼의 collMod 항목을 참조하세요.

경고

collection에서 사전 이미지 또는 사후 이미지를 활성화한 경우 collMod 으)로 이러한 설정을 수정하면 해당 collection의 기존 change stream이 실패할 수 있습니다.

다음 코드 예시에서는 사전 myColl 이미지를 포함하고 이벤트를 출력하도록 collection에서 change stream을 구성하는 방법을 보여 줍니다.

MongoCollection<Document> collection = database.getCollection("myColl");
ChangeStreamIterable<Document> changeStream = collection.watch()
.fullDocumentBeforeChange(FullDocumentBeforeChange.REQUIRED);
changeStream.forEach(event ->
System.out.println("Received a change: " + event));

앞의 예에서는 FullDocumentBeforeChange.REQUIRED 옵션을 사용하도록 change stream을 구성합니다. 이 옵션은 교체, 업데이트 및 삭제 이벤트에 대해 사전 이미지를 요구하도록 change stream을 구성합니다. 사전 이미지를 사용할 수 없는 경우 드라이버에서 오류가 발생합니다.

문서의 amount 필드 값을 150 에서 2000 로 업데이트한다고 가정해 보겠습니다. 이 변경 이벤트는 다음과 같은 출력을 생성합니다.

Received a change: ChangeStreamDocument{
operationType=update,
resumeToken={"_data": "..."},
namespace=myDb.myColl,
destinationNamespace=null,
fullDocument=null,
fullDocumentBeforeChange=Document{{_id=..., amount=150, ...}},
...
}

옵션 목록은 FullDocumentBeforeChange 를 참조하세요. API 문서.

다음 코드 예시에서는 사전 myColl 이미지를 포함하고 이벤트를 출력하도록 collection에서 change stream을 구성하는 방법을 보여 줍니다.

MongoCollection<Document> collection = database.getCollection("myColl");
ChangeStreamIterable<Document> changeStream = collection.watch()
.fullDocument(FullDocument.WHEN_AVAILABLE);
changeStream.forEach(event ->
System.out.println("Received a change: " + event));

앞의 예에서는 FullDocument.WHEN_AVAILABLE 옵션을 사용하도록 change stream을 구성합니다. 이 옵션은 사용 가능한 경우 교체 및 업데이트 이벤트에 대해 수정된 문서의 사후 이미지를 반환하도록 change stream을 구성합니다.

문서의 color 필드 값을 "purple" 에서 "pink" 로 업데이트한다고 가정해 보겠습니다. 변경 이벤트는 다음과 같은 출력을 생성합니다.

Received a change: ChangeStreamDocument{
operationType=update,
resumeToken={"_data": "..."},
namespace=myDb.myColl,
destinationNamespace=null,
fullDocument=Document{{_id=..., color=purple, ...}},
updatedFields={"color": purple},
...
}

옵션 목록은 FullDocument 를 참조하세요. API 문서.

돌아가기

커서에서 데이터 액세스