feat: jpa, messaging, notification, mongo, graphql 어댑터터 구현체 추가

This commit is contained in:
DongHyeonka
2026-08-15 13:01:58 +09:00
parent ac874e49e6
commit 2f5d2fc219
909 changed files with 62510 additions and 6354 deletions
@@ -42,6 +42,29 @@ configurations {
jpaPlatformPerformanceTestRuntimeOnly.extendsFrom testRuntimeOnly
}
// The testkit as a consumable artifact.
//
// The rule pack in `testkit` was only ever exercised by its own fixture tests: nothing imported the
// production graph and ran the rules against it, so "controller must not expose an entity" and
// "domain must not depend on Hibernate" were verified as library code and applied to nothing. The
// composition root is the only place that can see every runtime leaf at once, so it is where the
// production suite belongs — and it needs the rules.
tasks.register('testkitJar', Jar) {
archiveClassifier = 'testkit'
from sourceSets.testkit.output
}
configurations {
jpaTestkit {
canBeConsumed = true
canBeResolved = false
}
}
artifacts {
jpaTestkit(tasks.named('testkitJar', Jar))
}
// Every test lane compiles and runs against the testkit.
sourceSets.test {
compileClasspath += sourceSets.testkit.output
@@ -172,6 +195,12 @@ def postgresqlFileserverMetadataIntegrationTest = registerPostgreSqlReadinessTes
def postgresqlFileserverReclamationIntegrationTest = registerPostgreSqlReadinessTest(
'postgresqlFileserverReclamationIntegrationTest',
'dev.caskeleton.adapter.outbound.persistence.readiness.PostgreSqlFileserverReclamationIntegrationTest')
// The notification stream is opt-in and lives outside the default Flyway location, so "is it
// applied and promoted" is a real deployment question with a real wrong answer. This lane asks it
// against a real server; the entity-scan half is a unit test.
def postgresqlNotificationSchemaActivationIntegrationTest = registerPostgreSqlReadinessTest(
'postgresqlNotificationSchemaActivationIntegrationTest',
'dev.caskeleton.adapter.outbound.persistence.readiness.PostgreSqlNotificationSchemaActivationIntegrationTest')
def verifyJpaSqlConstructionSafety = tasks.register('verifyJpaSqlConstructionSafety') {
group = 'verification'
@@ -281,19 +310,29 @@ def jpaPlatformSecurityTest = registerJpaPlatformLane(
'jpa-security',
'Verifies runtime role privileges and search_path safety (design §36).')
// Machine-dependent bounds live in their own source set and never gate an ordinary build: attaching
// them to `check` would make a laptop's `check` fail for reasons that are not about the code.
def jpaPlatformPerformanceTest = tasks.register('jpaPlatformPerformanceTest', Test) {
// The pool behaviour contract. Named for what it does.
//
// It was `jpaPlatformPerformanceTest`, described as certifying pool and REQUIRES_NEW pressure, and
// gated by `performance.assertions.enabled` — which defaulted to false everywhere, including in the
// nightly workflow that set it explicitly to false. So the release gate depended on a lane whose
// only threshold assertion was that thresholds were not being asserted. "Certified" described a
// run in which no latency or throughput bound was ever compared to anything.
//
// What the lane genuinely verifies is a behaviour contract: a REQUIRES_NEW depth of one needs two
// connections per concurrent thread, a saturated pool reports its pending count, and a caller waits
// rather than proceeding without a connection. Those are true on any machine, so they need no flag
// — and this name does not promise a number nobody measured. A real performance gate needs a
// dedicated runner, warmup and sample counts, and recorded thresholds; when that exists it belongs
// in a lane of its own rather than behind a boolean on this one.
def jpaPlatformPoolContractTest = tasks.register('jpaPlatformPoolContractTest', Test) {
group = 'verification'
description = 'Certifies Hikari pool and REQUIRES_NEW connection pressure (design §38).'
description = 'Verifies Hikari pool and REQUIRES_NEW connection behaviour (design §38).'
testClassesDirs = sourceSets.jpaPlatformPerformanceTest.output.classesDirs
classpath = sourceSets.jpaPlatformPerformanceTest.runtimeClasspath
useJUnitPlatform()
failOnNoDiscoveredTests = true
outputs.upToDateWhen { false }
jvmArgs('-Duser.timezone=UTC')
systemProperty 'performance.assertions.enabled',
(project.findProperty('performance.assertions.enabled') ?: 'false').toString()
}
// The JPA release gate (design §41). Aggregates every lane whose absence would let one of the
@@ -307,7 +346,7 @@ tasks.register('jpaPlatformReleaseGate') {
dependsOn jpaPlatformFailureTest
dependsOn jpaPlatformQueryPlanTest
dependsOn jpaPlatformSecurityTest
dependsOn jpaPlatformPerformanceTest
dependsOn jpaPlatformPoolContractTest
}
apply from: rootProject.file('gradle/jpa-evidence.gradle')