adapter-outbound-messaging — 모듈 인벤토리 revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5 generatedAt=2026-08-30T06:23:18+00:00 === tracked file 총계 === $ git ls-files 'adapter/outbound/messaging' | wc -l 69 exit=0 $ for d in $(git ls-files 'adapter/outbound/messaging/src' | sed 's|^adapter/outbound/messaging/src/||' | cut -d/ -f1 | sort -u); do n=$(git ls-files "adapter/outbound/messaging/src/$d" | wc -l); l=$(git ls-files "adapter/outbound/messaging/src/$d" | xargs wc -l 2>/dev/null | tail -1 | awk '{print $1}'); echo "$d: $n files, $l LOC"; done main: 46 files, 4607 LOC test: 19 files, 3670 LOC exit=0 === 패키지 배치 === $ git ls-files 'adapter/outbound/messaging/src/main' | grep '\.java$' | sed 's|.*/dev/caskeleton/||' | xargs -n1 dirname | sort | uniq -c | sort -rn 5 adapter/outbound/messaging/kafka 5 adapter/outbound/messaging/envelope 5 adapter/outbound/messaging/core 4 adapter/outbound/messaging/outbox 4 adapter/outbound/messaging/destination 3 adapter/outbound/messaging/contract 2 adapter/outbound/messaging/realtime 2 adapter/outbound/messaging/config 2 adapter/outbound/messaging/autoconfigure 2 adapter/outbound/messaging exit=0 $ git ls-files 'adapter/outbound/messaging/src/test' | grep '\.java$' | sed 's|.*/dev/caskeleton/||' | xargs -n1 dirname | sort | uniq -c | sort -rn 3 adapter/outbound/messaging/envelope 2 adapter/outbound/messaging/qualification 2 adapter/outbound/messaging/outbox 2 adapter/outbound/messaging/kafka 2 adapter/outbound/messaging/destination 2 adapter/outbound/messaging/contract 1 adapter/outbound/messaging/core 1 adapter/outbound/messaging/config 1 adapter/outbound/messaging exit=0 === main 전체 (크기순) === $ git ls-files 'adapter/outbound/messaging/src/main' | grep '\.java$' | xargs wc -l | sort -rn 4246 total 701 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/envelope/LocalJsonSchemaRegistry.java 548 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/envelope/DeterministicEnvelopeWriter.java 274 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/contract/ContractCatalogCompiler.java 263 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/contract/CompiledIntegrationEventContract.java 248 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/destination/DestinationBindingCompiler.java 238 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/destination/DestinationBindingSettings.java 235 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/config/MessagingCapabilityCardRegistry.java 232 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/envelope/JsonSchemaIntegrationEventEncoder.java 204 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/config/CompiledMessagingDescriptor.java 132 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/destination/PartitionKeyV1.java 108 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/kafka/BrokerAddress.java 105 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/destination/CompiledPublicationBinding.java 91 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/contract/ContractCatalogDigest.java 79 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/MessagingConfig.java 78 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/realtime/RealtimeFanoutEnvelopeJson.java 70 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/outbox/OutboxEnvelopeJson.java 65 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/outbox/Slf4jOutboxRelayFailureReportAdapter.java 61 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/core/OutboundMessagePublisher.java 60 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/realtime/MessagingDurableFanoutAdapter.java 56 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/envelope/EnvelopeAdmissionLimits.java 52 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/autoconfigure/MessagingOffAutoConfigurationImportFilter.java 48 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/kafka/KafkaAdapterSettings.java 41 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/outbox/OutboxMessagePublishAdapter.java 36 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/envelope/EnvelopeHashV1.java 32 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/kafka/KafkaAdapterConfig.java 31 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/kafka/KafkaMessageBroker.java 25 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/core/OutboundMessage.java 24 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/autoconfigure/MessagingBridgeRootAutoConfiguration.java 20 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/outbox/DisabledOutboxMessagePublisher.java 20 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/core/MessageBroker.java 20 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/MessagingSettings.java 19 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/kafka/KafkaSender.java 17 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/core/DisabledMessagePublisher.java 13 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/core/MessagePublisher.java exit=0 === 비 Java === $ git ls-files 'adapter/outbound/messaging' | grep -v '\.java$' adapter/outbound/messaging/CLAUDE.md adapter/outbound/messaging/README.md adapter/outbound/messaging/build.gradle adapter/outbound/messaging/gradle.lockfile adapter/outbound/messaging/src/main/resources/META-INF/spring.factories adapter/outbound/messaging/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12/authority.sha256 adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/applicator adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/content adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/core adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/format-annotation adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/format-assertion adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/meta-data adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/unevaluated adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/validation adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/schema adapter/outbound/messaging/src/test/resources/contracts/messaging/test.event/v1.invalid.json adapter/outbound/messaging/src/test/resources/contracts/messaging/test.event/v1.schema.json adapter/outbound/messaging/src/test/resources/contracts/messaging/test.event/v1.valid.json exit=0 === 레지스트리 === $ python3 -c " import json;d=json.load(open('config/architecture/modules.json')) for m in d['modules']: if m['id']=='adapter-outbound-messaging': print(json.dumps(m,ensure_ascii=False,indent=2)) " { "id": "adapter-outbound-messaging", "gradle_path": ":adapter:outbound:messaging", "source_path": "src/adapter/outbound/messaging", "allowed_dependencies": [ "domain-core", "application-core", "shared-contract", "adapter-outbound-support" ], "runtime_memberships": [ "app-bootstrap" ] } exit=0 === build.gradle === $ cat -n 'adapter/outbound/messaging/build.gradle' 1 2 dependencies { 3 implementation project(':application-core') 4 implementation project(':shared-contract') 5 implementation project(':adapter:outbound:support') 6 7 implementation 'org.springframework.boot:spring-boot-autoconfigure' 8 implementation 'org.springframework.boot:spring-boot-starter-json' 9 implementation('com.networknt:json-schema-validator:3.0.2') { 10 exclude group: 'com.fasterxml.jackson.dataformat', module: 'jackson-dataformat-yaml' 11 } 12 implementation 'org.slf4j:slf4j-api' 13 annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor' 14 } 15 tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' } 16 tasks.withType(Test).configureEach { 17 systemProperty 'messaging.commonEvidenceSchema', 18 rootProject.file('config/messaging/evidence/build-evidence-manifest-v1.schema.json') 19 .absolutePath 20 } 21 22 configurations.configureEach { 23 exclude group: 'tools.jackson.dataformat', module: 'jackson-dataformat-yaml' 24 exclude group: 'org.yaml', module: 'snakeyaml' 25 exclude group: 'org.snakeyaml', module: 'snakeyaml-engine' 26 } 27 28 tasks.register('verifyJsonSchemaRuntimeGraph') { 29 group = 'verification' 30 description = 'Verifies the closed Jackson 3 / NetworkNT graph contains no YAML or Jackson 2 runtime.' 31 doLast { 32 Set modules = configurations.runtimeClasspath.incoming.resolutionResult 33 .allComponents 34 .findAll { it.moduleVersion != null } 35 .collect { 36 "${it.moduleVersion.group}:${it.moduleVersion.name}:${it.moduleVersion.version}" 37 .toString() 38 } as Set 39 List forbidden = modules.findAll { String coordinate -> 40 String lowered = coordinate.toLowerCase(Locale.ROOT) 41 lowered.contains('yaml') || 42 lowered.startsWith('org.yaml:') || 43 lowered.startsWith('org.snakeyaml:') || 44 lowered ==~ /com\.fasterxml\.jackson\.core:jackson-(core|databind):.*/ 45 }.sort() 46 if (!forbidden.isEmpty()) { 47 throw new GradleException( 48 "Messaging JSON runtime contains forbidden Jackson 2/YAML modules: ${forbidden}") 49 } 50 [ 51 'com.networknt:json-schema-validator:3.0.2', 52 'tools.jackson.core:jackson-core:3.0.2', 53 'tools.jackson.core:jackson-databind:3.0.2' 54 ].each { String required -> 55 if (!modules.contains(required)) { 56 throw new GradleException( 57 "Messaging JSON runtime is missing required locked module ${required}") 58 } 59 } 60 // Jackson 3 intentionally retains the 2.x-namespace annotations artifact. It is not a 61 // Jackson 2 databind/runtime engine and is part of the official Jackson 3 BOM graph. 62 } 63 } 64 65 tasks.named('check') { 66 dependsOn tasks.named('verifyJsonSchemaRuntimeGraph') 67 } 68 69 def messagingCompiledContractsQualification = registerStrictQualificationTest( 70 name: 'messagingCompiledContractsQualificationTest', 71 sourceSet: sourceSets.test, 72 requiredClasses: [ 73 'dev.caskeleton.adapter.outbound.messaging.config.MessagingCapabilityCardRegistryTest', 74 'dev.caskeleton.adapter.outbound.messaging.contract.ContractCatalogCompilerTest', 75 'dev.caskeleton.adapter.outbound.messaging.contract.ContractCatalogDigestTest', 76 'dev.caskeleton.adapter.outbound.messaging.destination.DestinationBindingCompilerTest', 77 'dev.caskeleton.adapter.outbound.messaging.destination.PartitionKeyV1Test' 78 ], 79 junitXmlOutput: rootProject.layout.buildDirectory.dir( 80 'test-results/messaging-evidence/compiled'), 81 binaryResultsOutput: rootProject.layout.buildDirectory.dir( 82 'test-results/messaging-evidence-binary/compiled'), 83 description: 'Runs exact Messaging compiled-contract qualification tests.') 84 messagingCompiledContractsQualification.configure { 85 dependsOn ':prepareMessagingContractEvidence' 86 } 87 88 def messagingJsonSchemaV1Qualification = registerStrictQualificationTest( 89 name: 'messagingJsonSchemaV1QualificationTest', 90 sourceSet: sourceSets.test, 91 requiredClasses: [ 92 'dev.caskeleton.adapter.outbound.messaging.envelope.LocalJsonSchemaRegistryTest', 93 'dev.caskeleton.adapter.outbound.messaging.envelope.JsonSchemaIntegrationEventEncoderTest', 94 'dev.caskeleton.adapter.outbound.messaging.envelope.EnvelopeAdversarialCorpusTest', 95 'dev.caskeleton.adapter.outbound.messaging.qualification.MessagingEvidenceManifestSchemaValidatorTest' 96 ], 97 junitXmlOutput: rootProject.layout.buildDirectory.dir( 98 'test-results/messaging-evidence/json-schema'), 99 binaryResultsOutput: rootProject.layout.buildDirectory.dir( 100 'test-results/messaging-evidence-binary/json-schema'), 101 description: 'Runs exact Messaging JSON Schema v1 qualification tests.') 102 messagingJsonSchemaV1Qualification.configure { 103 dependsOn ':prepareMessagingContractEvidence' 104 } exit=0 === leaf 밖 소비자 === $ git grep -l 'dev.caskeleton.adapter.outbound.messaging' -- . | grep -v '^adapter/outbound/messaging/' | sed 's|/src/.*||' | sort | uniq -c 5 app-bootstrap 1 build.gradle exit=0