Sub-scope 07 (inbound-web) http + json + advanced/codec + openapi revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5 generatedAt=2026-08-30T07:33:21+00:00 === OWNED FILES === 5195ccde1fb114a7b3e8b3671922112fd06ae37b main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/CodecBudget.java 61 03bebdb143e9ae7702485727a7278c08af892aae main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/RepresentationNegotiationPolicy.java 84 94b098604b018bc78428cd7f010ebfae7dc4dd8c main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/SecureXmlInputFactory.java 59 0a03fa6eef7b4a55263025d9af88588dcc8dbade main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCborMapperFactory.java 87 2949cf411f2413f80aa0fa7eee7c0de8076a62e0 main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebRepresentation.java 90 ee36dbc9fa8d61639cbb19d83288b110b0da9985 main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebXmlMapperFactory.java 99 5b81c84bdd8a0c3283dd0f4c4c145230d7eb7cc4 main/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/OpenApi32CompatibilityReport.java 72 b5f2614e2c7ea1f9635a4b65272c38895e9aff9d main/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/OpenApiDeepCopy.java 40 72ae00a519233206951458f1494ff6a3b53eca64 main/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/OpenApiToolchainMatrix.java 81 39ee8a7da3d7099ccf9007119ff482a92701ffc3 main/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/OpenApiVersionLane.java 36 ea237116f9d72b88ba7935a840cf44d5fa77b76a main/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/WebOpenApi32Generator.java 122 f88b13a2ad17de5d2a8413283704a8e4ab6d219f main/java/dev/caskeleton/adapter/inbound/web/http/ApiHeaders.java 39 a456725d9fcc474551828a20a191d60b8eae6a5d main/java/dev/caskeleton/adapter/inbound/web/http/CanonicalPath.java 29 1e1f5432b38f7106a443045d285cbabe97157713 main/java/dev/caskeleton/adapter/inbound/web/http/ExternalOrigin.java 51 7a345f29bbee8540c4cd2ba50569173b436fa8f7 main/java/dev/caskeleton/adapter/inbound/web/http/ExternalPrefix.java 63 df45ae6b7e72a27285fe85d66add4162c41baaca main/java/dev/caskeleton/adapter/inbound/web/http/ExternalUriBuilder.java 80 61b0716affa7b70483a5186c106266b53fee47b9 main/java/dev/caskeleton/adapter/inbound/web/http/ExternalUriPolicy.java 88 30340076e30870d39e772bcb252de73fef72d119 main/java/dev/caskeleton/adapter/inbound/web/http/WebHeaderName.java 56 996f869cd9bce048bf9aa7cb6259fb8c43383a86 main/java/dev/caskeleton/adapter/inbound/web/http/WebMethodPolicy.java 112 c1b27a158eaca2f51780589b963f119d1fb8c353 main/java/dev/caskeleton/adapter/inbound/web/http/WebResponseContract.java 46 8943022bcd69d164e9e077dcbabe39a9c37619cd main/java/dev/caskeleton/adapter/inbound/web/http/WebStatusContract.java 40 6ed5547086dcb10247628f38988e6d57325567f2 main/java/dev/caskeleton/adapter/inbound/web/http/WebSuccessResponse.java 76 b6adcfee747f00d32b9ac0bb4c2ecd861b51feec main/java/dev/caskeleton/adapter/inbound/web/http/WebUriPolicy.java 91 e35af8b43e7a4a7b29f60f35611f4af96b711c87 main/java/dev/caskeleton/adapter/inbound/web/json/BoundedJsonFactory.java 45 7f3fd0146e72a41e1b75137c1ececb930483e1ed main/java/dev/caskeleton/adapter/inbound/web/json/WebJsonDecodingException.java 36 6126903621e89a96c2a627ab361c1a64492a283c main/java/dev/caskeleton/adapter/inbound/web/json/WebJsonProfile.java 51 b1beacf04d7c2cc7a33a940046791db80b65141c main/java/dev/caskeleton/adapter/inbound/web/json/WebObjectMapperFactory.java 111 1be7552faf5870cecb1ba67244d2cd7e3d7a11bc main/java/dev/caskeleton/adapter/inbound/web/openapi/CursorSchemaContributor.java 47 4be10e76dd601438718314d298e04214c495ff1c main/java/dev/caskeleton/adapter/inbound/web/openapi/ProblemSchemaContributor.java 88 c43576247de7740565f078eb6b88e93482761706 main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiBreakingPolicy.java 187 55096eda5a698fff1dbf11b3a76cbbbf591f5344 main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiCustomizer.java 74 93dbfefd30e88ceff637af11faba09965fa7f9d4 main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiDiffResult.java 39 71a65f7abdcb6a39d49d4c62d75d245bd5f34195 main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiProfile.java 72 aaf4da55c1827a4b3c44152da92ccdb60dcc1892 main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiReleaseGate.java 100 c01bacbde0950f9bbe87123d8565b251324790f0 test/java/dev/caskeleton/adapter/inbound/web/advanced/codec/RepresentationBackendScopeTest.java 107 900b0e7ed708febc17fd6468fbf5ebc6714ced3e test/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCodecMapperTest.java 175 11a4a8f64b76013b0f4e8b73f1822d85c10992f3 test/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCodecSecurityTest.java 168 84cb49ceacfd8bff48642de18dfbaa9a3613d788 test/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/OpenApi32CompatibilityReportTest.java 110 b1bf70b4e051dcfbf488c003d5ff23a4f25e2a9b test/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/WebOpenApi32GeneratorTest.java 156 3728ba0f9206e2472dd762ae08bad44289015332 test/java/dev/caskeleton/adapter/inbound/web/http/ExternalUriBuilderTest.java 141 81495ad18f4680f64bd590b37c5aa8dd7303ce7e test/java/dev/caskeleton/adapter/inbound/web/http/WebResponseContractTest.java 81 002fe95c59fb5524bc05bd62a31196f001045e93 test/java/dev/caskeleton/adapter/inbound/web/http/WebUriPolicyTest.java 137 bbef1d7f459637fd508f2e466d2fa132d7fccdf2 test/java/dev/caskeleton/adapter/inbound/web/json/WebObjectMapperFactoryTest.java 133 a71b8972cf5ba559802752f1490441533bb7fa25 test/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiReleaseGateTest.java 166 167eb701763d9391a8b78252c0deba24829d2745 test/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiSnapshotTest.java 125 file_count=45 === 8.1 도달성: WebJsonProfile 8개 필드 중 강제되는 것 === rejectUnknownProperties readers=json/WebObjectMapperFactory.java:66: profile.rejectUnknownProperties()) rejectDuplicateKeys readers=json/BoundedJsonFactory.java:40: if (profile.rejectDuplicateKeys()) { rejectTrailingTokens readers=json/WebObjectMapperFactory.java:68: DeserializationFeature.FAIL_ON_TRAILING_TOKENS, profile.rejectTrailingTokens()) caseSensitiveEnums readers=json/WebObjectMapperFactory.java:69: .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, !profile.caseSensitiveEnums()) json/WebObjectMapperFactory.java:71: MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, !profile.caseSensitiveEnums()) rejectScalarCoercion readers=json/WebObjectMapperFactory.java:75: if (profile.rejectScalarCoercion()) { maxDepth readers=json/BoundedJsonFactory.java:37: .maxNestingDepth(profile.maxDepth()) maxArrayElements readers= maxStringBytes readers=json/BoundedJsonFactory.java:38: .maxStringLength(profile.maxStringBytes()) === 8.2 조건 형제 비교: 두 개의 OpenApiCustomizer === $ grep -n 'OpenApiCustomizer' adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/config/OpenApiContractConfig.java 7:import org.springdoc.core.customizers.OpenApiCustomizer; 26: OpenApiCustomizer apiErrorDetailsObjectSchemaCustomizer() { exit=0 $ grep -rn 'WebOpenApiCustomizer' --include=*.java adapter/inbound/web/src app-bootstrap/src | sed 's|adapter/inbound/web/src/||' test/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiSnapshotTest.java:75: WebOpenApiCustomizer.standard().customise(springdoc); main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiCustomizer.java:18:public final class WebOpenApiCustomizer { main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiCustomizer.java:27: public WebOpenApiCustomizer(WebOpenApiProfile profile) { main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiCustomizer.java:32: public static WebOpenApiCustomizer standard() { main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiCustomizer.java:33: return new WebOpenApiCustomizer(WebOpenApiProfile.standard()); exit=0 === 8.3 XML/CBOR 표현의 런타임 배선 === $ grep -n 'compileOnly' adapter/inbound/web/build.gradle 39: compileOnly 'tools.jackson.dataformat:jackson-dataformat-cbor' 40: compileOnly 'tools.jackson.dataformat:jackson-dataformat-xml' exit=0 $ grep -rn 'WebXmlMapperFactory\|WebCborMapperFactory\|SecureXmlInputFactory' --include=*.java adapter/inbound/web/src app-bootstrap/src | sed 's|adapter/inbound/web/src/||' | awk -F: '{print $1}' | sort -u main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/SecureXmlInputFactory.java main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCborMapperFactory.java main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebXmlMapperFactory.java test/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCodecMapperTest.java test/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCodecSecurityTest.java exit=0 === 8.4 maxStringBytes 가 무엇에 적용되는가 === $ grep -n 'maxStringLength\|maxNestingDepth\|StreamReadConstraints' adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/json/BoundedJsonFactory.java 4:import tools.jackson.core.StreamReadConstraints; 36: StreamReadConstraints.builder() 37: .maxNestingDepth(profile.maxDepth()) 38: .maxStringLength(profile.maxStringBytes()) exit=0 $ grep -n 'maxArrayElements' adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/json/WebJsonProfile.java 18: * @param maxArrayElements most elements accepted in one array 28: int maxArrayElements, 32: if (maxDepth <= 0 || maxArrayElements <= 0 || maxStringBytes <= 0) { exit=0