# source 빈이 놓인 자리의 조건 넷 @org.springframework.context.annotation.Configuration(proxyBeanMethods = false) @ConditionalOnClass(MongoTemplate.class) @ConditionalOnProperty( prefix = "ca-skeleton.persistence-mongo", name = "enabled", havingValue = "true") @EnableConfigurationProperties(MongoPlatformSettings.class) @Import(MongoMappingConfiguration.class) public class MongoPlatformAutoConfiguration { ... @org.springframework.context.annotation.Configuration(proxyBeanMethods = false) @ConditionalOnClass(org.springframework.data.mongodb.core.ReactiveMongoTemplate.class) @ConditionalOnBean(org.springframework.data.mongodb.core.ReactiveMongoTemplate.class) public static class ReactiveExecution { ... @Bean @ConditionalOnMissingBean public dev.caskeleton.adapter.outbound.mongo.changestream.consumer.MongoChangeStreamSource # 그 빈이 커서를 연다 return template .changeStream(org.bson.Document.class) .watchCollection(collections.require(subscription.collectionProfile())) .resumeAt(optionsFor(subscription, resumeFrom)) .listen(); # 소비자 빈이 요구하는 조건 다섯 @org.springframework.boot.autoconfigure.condition.ConditionalOnBean({ dev.caskeleton.adapter.outbound.mongo.changestream.MongoChangeStreamSubscription.class, dev.caskeleton.adapter.outbound.mongo.changestream.MongoResumeCheckpointStore.class, dev.caskeleton.adapter.outbound.mongo.changestream.MongoResumeTokenCodec.class, dev.caskeleton.adapter.outbound.mongo.changestream.projector.MongoChangeProjector.class, dev.caskeleton.adapter.outbound.mongo.changestream.projector.MongoChangeDeduplicationStore .class # 그 다섯을 구현하는 클래스 전수 test …/advanced/bridge/MongoChangeMessagingBridgeTest.java CountingCheckpointStore implements MongoResumeCheckpointStore { test …/changestream/projector/MongoChangeStreamRunnerTest.java RecordingCheckpointStore implements MongoResumeCheckpointStore { test …/changestream/projector/MongoChangeStreamRunnerTest.java ClaimingDeduplicationStore implements MongoChangeDeduplicationStore { test …/changestream/projector/MongoChangeStreamRunnerTest.java EmptyDeduplicationStore implements MongoChangeDeduplicationStore { test …/changestream/consumer/ChangeStreamConsumerLifecycleTest.java PlainTextCodec implements MongoResumeTokenCodec { test …/changestream/consumer/ChangeStreamConsumerLifecycleTest.java RecordingCheckpointStore implements MongoResumeCheckpointStore { test …/changestream/consumer/ChangeStreamConsumerLifecycleTest.java CountingProjector implements MongoChangeProjector { test …/changestream/consumer/ChangeStreamConsumerLifecycleTest.java AlwaysClaims implements MongoChangeDeduplicationStore { test …/changestream/MongoChangeStreamPipelineTest.java AlwaysClaims implements MongoChangeDeduplicationStore { test …/changestream/MongoChangeStreamPipelineTest.java NoOpCheckpoints implements MongoResumeCheckpointStore { # 저장소 자신의 배선 시험이 고정한 네 상태 64: void aReactiveTemplateAssemblesTheReactivePath() { 81: void aSubscriptionWithoutAProjectorBuildsNoConsumer() { 105: void theProjectionPiecesAssembleAConsumer() { 147: void withoutAReactiveTemplateNothingReactiveIsBuilt() { # 이 자동 구성 파일에서 changeStreams 가 나오는 곳 363: properties.changeStreams(),