init: 클린 기반 auth 서버 설계

This commit is contained in:
DongHyeonka
2026-07-24 14:30:18 +09:00
parent 471db0203d
commit 8a1ac1e769
3642 changed files with 275893 additions and 1 deletions
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="com.project.auth.application.auth.identity.internal.KeycloakUserLoaderTest" tests="5" skipped="0" failures="0" errors="0" timestamp="2026-05-12T06:24:22.880Z" hostname="donghyeon-960XGK" time="0.302">
<properties/>
<testcase name="loadAutoRegistersMissingInternalUser()" classname="com.project.auth.application.auth.identity.internal.KeycloakUserLoaderTest" time="0.25"/>
<testcase name="loadReturnsExistingUserByKeycloakSubject()" classname="com.project.auth.application.auth.identity.internal.KeycloakUserLoaderTest" time="0.002"/>
<testcase name="loadRejectsBlankClaimsAsInvalid()" classname="com.project.auth.application.auth.identity.internal.KeycloakUserLoaderTest" time="0.006"/>
<testcase name="loadRejectsMissingSubjectWhenEmailAlreadyBelongsToAnotherUser()" classname="com.project.auth.application.auth.identity.internal.KeycloakUserLoaderTest" time="0.002"/>
<testcase name="loadRejectsMalformedEmailClaimAsInvalid()" classname="com.project.auth.application.auth.identity.internal.KeycloakUserLoaderTest" time="0.002"/>
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="com.project.auth.application.support.exception.BusinessExceptionTest" tests="4" skipped="0" failures="0" errors="0" timestamp="2026-05-12T06:24:23.185Z" hostname="donghyeon-960XGK" time="0.008">
<properties/>
<testcase name="single_arg_constructor_uses_error_code_message()" classname="com.project.auth.application.support.exception.BusinessExceptionTest" time="0.001"/>
<testcase name="detail_message_constructor_overrides_message()" classname="com.project.auth.application.support.exception.BusinessExceptionTest" time="0.001"/>
<testcase name="detail_message_and_cause_constructor_preserves_both()" classname="com.project.auth.application.support.exception.BusinessExceptionTest" time="0.001"/>
<testcase name="cause_constructor_preserves_cause_and_uses_error_code_message()" classname="com.project.auth.application.support.exception.BusinessExceptionTest" time="0.001"/>
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="com.project.auth.application.support.exception.ErrorCodeEnumTest" tests="6" skipped="0" failures="0" errors="0" timestamp="2026-05-12T06:24:23.193Z" hostname="donghyeon-960XGK" time="0.102">
<properties/>
<testcase name="[1] AUTHENTICATION_REQUIRED" classname="com.project.auth.application.support.exception.ErrorCodeEnumTest" time="0.012"/>
<testcase name="[2] ACCESS_DENIED" classname="com.project.auth.application.support.exception.ErrorCodeEnumTest" time="0.001"/>
<testcase name="[3] KEYCLOAK_CLAIMS_INVALID" classname="com.project.auth.application.support.exception.ErrorCodeEnumTest" time="0.001"/>
<testcase name="[4] KEYCLOAK_USER_NOT_FOUND" classname="com.project.auth.application.support.exception.ErrorCodeEnumTest" time="0.001"/>
<testcase name="[5] KEYCLOAK_ACCOUNT_CONFLICT" classname="com.project.auth.application.support.exception.ErrorCodeEnumTest" time="0.001"/>
<testcase name="[1] INTERNAL_SERVER_ERROR" classname="com.project.auth.application.support.exception.ErrorCodeEnumTest" time="0.001"/>
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="com.project.auth.application.support.logging.LogSanitizerEdgeCaseTest" tests="7" skipped="0" failures="0" errors="0" timestamp="2026-05-12T06:24:23.296Z" hostname="donghyeon-960XGK" time="0.029">
<properties/>
<testcase name="normalize_single_arg_uses_default_max_length()" classname="com.project.auth.application.support.logging.LogSanitizerEdgeCaseTest" time="0.003"/>
<testcase name="[1] &quot;1.2.3.999&quot;" classname="com.project.auth.application.support.logging.LogSanitizerEdgeCaseTest" time="0.002"/>
<testcase name="[2] &quot;1.2.3.1234&quot;" classname="com.project.auth.application.support.logging.LogSanitizerEdgeCaseTest" time="0.002"/>
<testcase name="[3] &quot;1.2.3.abc&quot;" classname="com.project.auth.application.support.logging.LogSanitizerEdgeCaseTest" time="0.001"/>
<testcase name="[1] &quot;@example.com&quot;" classname="com.project.auth.application.support.logging.LogSanitizerEdgeCaseTest" time="0.001"/>
<testcase name="[2] &quot;user@&quot;" classname="com.project.auth.application.support.logging.LogSanitizerEdgeCaseTest" time="0.002"/>
<testcase name="[3] &quot;@&quot;" classname="com.project.auth.application.support.logging.LogSanitizerEdgeCaseTest" time="0.001"/>
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>
@@ -0,0 +1,160 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="com.project.auth.application.support.logging.LogSanitizerPropertyTest" tests="11" skipped="0" failures="0" errors="0" timestamp="2026-05-12T06:24:23.374Z" hostname="donghyeon-960XGK" time="2.257">
<properties/>
<testcase name="actorId for email masks local part" classname="com.project.auth.application.support.logging.LogSanitizerPropertyTest" time="0.89"/>
<testcase name="userAgent output length is bounded" classname="com.project.auth.application.support.logging.LogSanitizerPropertyTest" time="0.184"/>
<testcase name="actorId for blank anonymous returns anonymous" classname="com.project.auth.application.support.logging.LogSanitizerPropertyTest" time="0.04"/>
<testcase name="clientIp with valid ipv4 masks last octet" classname="com.project.auth.application.support.logging.LogSanitizerPropertyTest" time="0.511"/>
<testcase name="requestPath output length is bounded" classname="com.project.auth.application.support.logging.LogSanitizerPropertyTest" time="0.15"/>
<testcase name="actorId for non email non blank returns hash prefix" classname="com.project.auth.application.support.logging.LogSanitizerPropertyTest" time="0.165"/>
<testcase name="normalize null or blank returns dash" classname="com.project.auth.application.support.logging.LogSanitizerPropertyTest" time="0.016"/>
<testcase name="normalize output length is bounded by max plus three" classname="com.project.auth.application.support.logging.LogSanitizerPropertyTest" time="0.128"/>
<testcase name="normalize strips control whitespace equals pipe chars" classname="com.project.auth.application.support.logging.LogSanitizerPropertyTest" time="0.103"/>
<testcase name="clientIp with non ipv4 falls back to hash" classname="com.project.auth.application.support.logging.LogSanitizerPropertyTest" time="0.04"/>
<testcase name="clientIp for blank returns dash" classname="com.project.auth.application.support.logging.LogSanitizerPropertyTest" time="0.007"/>
<system-out><![CDATA[timestamp = 2026-05-12T15:24:24.268964781, LogSanitizerPropertyTest:actorId for email masks local part =
|-----------------------jqwik-----------------------
tries = 1000 | # of calls to property
checks = 1000 | # of not rejected calls
generation = RANDOMIZED | parameters are randomly generated
after-failure = SAMPLE_FIRST | try previously failed sample, then previous seed
when-fixed-seed = ALLOW | fixing the random seed is allowed
edge-cases#mode = MIXIN | edge cases are mixed in
edge-cases#total = 16 | # of all combined edge cases
edge-cases#tried = 16 | # of edge cases tried in current run
seed = 9079599534688328379 | random seed to reproduce generated values
timestamp = 2026-05-12T15:24:24.463365086, LogSanitizerPropertyTest:userAgent output length is bounded =
|-----------------------jqwik-----------------------
tries = 1000 | # of calls to property
checks = 1000 | # of not rejected calls
generation = RANDOMIZED | parameters are randomly generated
after-failure = SAMPLE_FIRST | try previously failed sample, then previous seed
when-fixed-seed = ALLOW | fixing the random seed is allowed
edge-cases#mode = MIXIN | edge cases are mixed in
edge-cases#total = 3 | # of all combined edge cases
edge-cases#tried = 3 | # of edge cases tried in current run
seed = -8720060840285361729 | random seed to reproduce generated values
timestamp = 2026-05-12T15:24:24.503929423, LogSanitizerPropertyTest:actorId for blank anonymous returns anonymous =
|-----------------------jqwik-----------------------
tries = 4 | # of calls to property
checks = 4 | # of not rejected calls
generation = EXHAUSTIVE | parameters are exhaustively generated
after-failure = SAMPLE_FIRST | try previously failed sample, then previous seed
when-fixed-seed = ALLOW | fixing the random seed is allowed
edge-cases#mode = MIXIN | edge cases are mixed in
edge-cases#total = 0 | # of all combined edge cases
edge-cases#tried = 0 | # of edge cases tried in current run
seed = 8904195071759405195 | random seed to reproduce generated values
timestamp = 2026-05-12T15:24:25.016843837, LogSanitizerPropertyTest:clientIp with valid ipv4 masks last octet =
|-----------------------jqwik-----------------------
tries = 1000 | # of calls to property
checks = 1000 | # of not rejected calls
generation = RANDOMIZED | parameters are randomly generated
after-failure = SAMPLE_FIRST | try previously failed sample, then previous seed
when-fixed-seed = ALLOW | fixing the random seed is allowed
edge-cases#mode = MIXIN | edge cases are mixed in
edge-cases#total = 625 | # of all combined edge cases
edge-cases#tried = 148 | # of edge cases tried in current run
seed = -6250169561580069028 | random seed to reproduce generated values
timestamp = 2026-05-12T15:24:25.166700790, LogSanitizerPropertyTest:requestPath output length is bounded =
|-----------------------jqwik-----------------------
tries = 1000 | # of calls to property
checks = 1000 | # of not rejected calls
generation = RANDOMIZED | parameters are randomly generated
after-failure = SAMPLE_FIRST | try previously failed sample, then previous seed
when-fixed-seed = ALLOW | fixing the random seed is allowed
edge-cases#mode = MIXIN | edge cases are mixed in
edge-cases#total = 3 | # of all combined edge cases
edge-cases#tried = 3 | # of edge cases tried in current run
seed = -5603906610245910658 | random seed to reproduce generated values
timestamp = 2026-05-12T15:24:25.334091836, LogSanitizerPropertyTest:actorId for non email non blank returns hash prefix =
|-----------------------jqwik-----------------------
tries = 1000 | # of calls to property
checks = 1000 | # of not rejected calls
generation = RANDOMIZED | parameters are randomly generated
after-failure = SAMPLE_FIRST | try previously failed sample, then previous seed
when-fixed-seed = ALLOW | fixing the random seed is allowed
edge-cases#mode = MIXIN | edge cases are mixed in
edge-cases#total = 2 | # of all combined edge cases
edge-cases#tried = 2 | # of edge cases tried in current run
seed = -8049545379471102578 | random seed to reproduce generated values
timestamp = 2026-05-12T15:24:25.348856958, LogSanitizerPropertyTest:normalize null or blank returns dash =
|-----------------------jqwik-----------------------
tries = 6 | # of calls to property
checks = 6 | # of not rejected calls
generation = EXHAUSTIVE | parameters are exhaustively generated
after-failure = SAMPLE_FIRST | try previously failed sample, then previous seed
when-fixed-seed = ALLOW | fixing the random seed is allowed
edge-cases#mode = MIXIN | edge cases are mixed in
edge-cases#total = 0 | # of all combined edge cases
edge-cases#tried = 0 | # of edge cases tried in current run
seed = -8999208271958527147 | random seed to reproduce generated values
timestamp = 2026-05-12T15:24:25.471211279, LogSanitizerPropertyTest:normalize output length is bounded by max plus three =
|-----------------------jqwik-----------------------
tries = 1000 | # of calls to property
checks = 1000 | # of not rejected calls
generation = RANDOMIZED | parameters are randomly generated
after-failure = SAMPLE_FIRST | try previously failed sample, then previous seed
when-fixed-seed = ALLOW | fixing the random seed is allowed
edge-cases#mode = MIXIN | edge cases are mixed in
edge-cases#total = 3 | # of all combined edge cases
edge-cases#tried = 3 | # of edge cases tried in current run
seed = -1917702041628164457 | random seed to reproduce generated values
timestamp = 2026-05-12T15:24:25.583555150, LogSanitizerPropertyTest:normalize strips control whitespace equals pipe chars =
|-----------------------jqwik-----------------------
tries = 1000 | # of calls to property
checks = 1000 | # of not rejected calls
generation = RANDOMIZED | parameters are randomly generated
after-failure = SAMPLE_FIRST | try previously failed sample, then previous seed
when-fixed-seed = ALLOW | fixing the random seed is allowed
edge-cases#mode = MIXIN | edge cases are mixed in
edge-cases#total = 2 | # of all combined edge cases
edge-cases#tried = 2 | # of edge cases tried in current run
seed = -9127916090391585149 | random seed to reproduce generated values
timestamp = 2026-05-12T15:24:25.623821470, LogSanitizerPropertyTest:clientIp with non ipv4 falls back to hash =
|-----------------------jqwik-----------------------
tries = 1000 | # of calls to property
checks = 1000 | # of not rejected calls
generation = RANDOMIZED | parameters are randomly generated
after-failure = SAMPLE_FIRST | try previously failed sample, then previous seed
when-fixed-seed = ALLOW | fixing the random seed is allowed
edge-cases#mode = MIXIN | edge cases are mixed in
edge-cases#total = 2 | # of all combined edge cases
edge-cases#tried = 2 | # of edge cases tried in current run
seed = -1099456930371871667 | random seed to reproduce generated values
timestamp = 2026-05-12T15:24:25.631015469, LogSanitizerPropertyTest:clientIp for blank returns dash =
|-----------------------jqwik-----------------------
tries = 6 | # of calls to property
checks = 6 | # of not rejected calls
generation = EXHAUSTIVE | parameters are exhaustively generated
after-failure = SAMPLE_FIRST | try previously failed sample, then previous seed
when-fixed-seed = ALLOW | fixing the random seed is allowed
edge-cases#mode = MIXIN | edge cases are mixed in
edge-cases#total = 0 | # of all combined edge cases
edge-cases#tried = 0 | # of edge cases tried in current run
seed = 2015364430866042887 | random seed to reproduce generated values
]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>