# 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(),
