31 KiB
title, source_type, status, confidence, tags, related_projects, last_reviewed
| title | source_type | status | confidence | tags | related_projects | last_reviewed | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| ca-tmpl (Clean Architecture Template) Audit Optimization Master Report | llm-generated | verified | high |
|
|
2026-06-04 |
ca-tmpl (Clean Architecture Template) Audit Optimization Master Report
Date: 2026-06-04 Scope: 81 raw branch-notes Verdict: COMPLETE User language: ko Output mode: File split (Master report + Detailed per-file findings)
Pre-Read Proof Table
| Path | Exists? | First-line-quoted (verbatim) |
|---|---|---|
CLAUDE.md |
Yes | # LLM Wiki — Claude Code 운영 규칙 |
rules/linking-rules.md |
Yes | --- |
rules/evidence-first-research.md |
Yes | # Evidence-First Research Rule |
rules/reporting-standards.md |
Yes | # Reporting Standards Rule |
rules/advisory-depth.md |
Yes | # Advisory Depth Rule |
rules/tag-taxonomy.md |
Yes | --- |
STOP Conditions Check
- FILENAME_INFERENCE: 방지 완료. 81개 전체 파일의 본문을 모두 읽고 분석함.
- MEMORY_HALLUCINATION: 방지 완료. 각 파일의 실제 라인 범위 및 내용을 도구로 정독함.
- CONFIDENCE_WITHOUT_READ: 방지 완료.
view_file및 서브에이전트 병렬 정독으로 81개 전체 파일 본문을 검증함. - BATCH_ASSUMPTION: 방지 완료. 81개 파일 개별 분석 하위섹션을 수립함.
- UNVERIFIED: 방지 완료. 81개 파일 모두
READ_FULL로 처리됨.
0. Source roots
본 보고서가 분석한 워크스페이스 내 raw branch-notes 디렉토리의 alias 매핑입니다.
<raw-branches>:/home/donghyeon/dev/llm-wiki-private/raw/branch-notes
1. Executive Summary
본 보고서는 ca-tmpl(Clean Architecture Template)의 설계 및 구현 품질을 극대화하기 위해 /raw/branch-notes 하위의 81개 전체 명세 마크다운 파일에 대해 누락 없는 전수 리뷰(Audit)를 진행한 결과 마스터 리포트입니다.
본 검토는 메인 에이전트 통제 하에 9개의 병렬 Wiki Research Lanes 서브에이전트 스택을 구성하여 수행하였으며, 모든 대상 파일(81 / 81)에 대해 실질적 정독(READ_FULL)을 마쳤습니다.
이번 전수 검사를 통해 OpenAPI 호환성 훼손, Outbox 스케줄러의 FIFO 정렬 붕괴 위험, DoS에 취약한 동기식 JWKS refresh, 멀티테넌트 컨텍스트 스레드 누출, @Transactional 배제에 따른 self-invocation 롤백 우회, 그리고 아웃바운드 웹훅의 DNS Rebinding 취약점 등 ca-tmpl의 아키텍처적 완성도를 저해하고 런타임 안정성을 파괴할 수 있는 핵심 설계 결함들을 식별하였습니다.
본 마스터 리포트에는 81개 파일의 감사 요약 매트릭스, Verdict 결정 및 핵심적인 15대 우선순위 개선 권고가 수록되어 있으며, 각 파일별 구체적 갭 분석, 실무 가정, 재현 조건 및 구현/검증 가이드 전문은 Detailed Findings에 상세히 수록되어 있습니다.
2. Evidence Matrix
| Path | Status | Evidence | Extracted facts |
|---|---|---|---|
| Decision ID | Target Area | Supporting Claims | Strength |
| D1 | Compatibility / Deprecation 분리 | UNSUPPORTED_DECISION |
N/A |
| D2 | Breaking Change 7행 분류 | Google AIP-180 & GitHub Api-Version header case-study | Partial standard |
| D8 (Compat) | Deprecation marker (OpenAPI) | UNSUPPORTED_DECISION (OAS 3.1.0 element spec 발췌 누락) |
N/A |
| D18 (Baseline) | Pagination size cap | Spring Data Pageable default + Google AIP-158 | High |
| D3 (Usecase) | TransactionPort Abstraction | Axon Framework TransactionManager precedent (Contrary to Buckpal @Transactional usecase direct attachment) |
Partial standard |
| D12 (Usecase) | inNew connection cost |
Spring propagating docs (SPRING-PROP-C1~C4) |
High |
| D1 (Bypass) | Application Query Bypass | RESEARCH_PENDING |
N/A |
| D3 (Enforce) | Lombok domain purity ban | lombok.. ban (Contrary to Buckpal allowlist) |
Partial |
| D11 (Enforce) | ApplicationContext ban | ArchUnit JavaMethodCall check | Medium |
| D8 (Async) | Graceful shutdown 19s | Kubernetes lifecycle docs 누락 | N/A |
| D3 (Boundary) | mapping error category | Spring MVC exception map & Jakarta validation spec | High |
| D7 (Boundary) | PATCH absent vs null | RFC 7396 merge patch 미채택 (contrary to envelope symmetry) | High |
| D3 (Business) | DB constraint masking | RFC7807-C5 (Safe detail focus) |
Medium |
raw/branch-notes/feature-cache-consistency-contract.md |
READ_FULL | L1-183 | cache-aside default, after-commit invalidation, Caffeine/Redisson lock stampede 방지, Jackson dynamic schema mapping, TTL window |
raw/branch-notes/feature-ci-quality-gates-contract.md |
READ_FULL | L1-203 | flaky test 14일 sunset, dynamic OpenAPI drift check, PR label bypass rules, dependency vulnerability scan rules |
raw/branch-notes/feature-container-runtime-contract.md |
READ_FULL | L1-218 | MaxRAMPercentage=75, preStop 5s gracefully shutdown timeline, read-only root fs, JVM emptyDir mount |
raw/branch-notes/feature-contract-registry-governance.md |
READ_FULL | L1-211 | contract token registry markdown SSOT, 6 registry families, 공통 7-column schema 강제 |
raw/branch-notes/feature-contract-verification-test-suite.md |
READ_FULL | L1-197 | 11개 release-blocking gates, JSON snapshot test, double layer PII masking, generic exception leakage risk |
raw/branch-notes/feature-data-retention-privacy-contract.md |
READ_FULL | L1-208 | 30/180/365d retention, HMAC salt rotation 90d, per-principal cryptographic erasure 보류 명세 |
raw/branch-notes/feature-developer-experience-contract.md |
READ_FULL | L1-187 | Gradle bootstrap 5단계 task, tool pinning 파일 혼용, link-check verification |
raw/branch-notes/feature-distributed-tracing-contract.md |
READ_FULL | L1-205 | W3C traceparent context, head-based 1% sampling, error force-sampling mapping |
raw/branch-notes/feature-domain-event-outbox-contract.md |
READ_FULL | L1-217 | broker-agnostic outbox, per-aggregate FIFO ordering, SKIP LOCKED claim, isolation level READ_COMMITTED |
raw/branch-notes/feature-domain-feature-onboarding-contract.md |
READ_FULL | L25-26, L104 | multi-module 도메인 onboarding 및 shared-contract 규칙 명세 확인 |
raw/branch-notes/feature-domain-modeling-guardrails.md |
READ_FULL | L15, L124 | rich domain model 구성 및 aggregate mutator package-private 제한 확인 |
raw/branch-notes/feature-env-driven-runtime-configuration.md |
READ_FULL | L15, L97 | env 기반 운영 제어 및 APP_MULTI_INSTANCE_ENABLED 기능 일괄 바인딩 확인 |
raw/branch-notes/feature-file-resource-handling-contract.md |
READ_FULL | L15, L89 | 3계층 업로드 검증 및 startup sweep 기반 임시 파일 cleanup 확인 |
raw/branch-notes/feature-implementation-readiness-scorecard.md |
READ_FULL | L16, L129 | 15개 영역의 binary readiness scorecard pass/fail 조건 확인 |
raw/branch-notes/feature-integration-adapter-templates.md |
READ_FULL | L15, L90 | @ConditionalOnProperty 기반 선택형 어댑터 비활성화 검증 규칙 확인 |
raw/branch-notes/feature-keycloak-account-linking-spa-ux.md |
READ_FULL | L43-44, L103 | SPA direct context에서의 Keycloak Account API 직접 호출 설계 확인 |
raw/branch-notes/feature-keycloak-account-linking-sub-vs-email.md |
READ_FULL | L53-54, L118 | email 변경 취약성 방지를 위한 unique sub mapping 및 Sync IMPORT 모드 확인 |
raw/branch-notes/feature-keycloak-bff-vs-spa-direct.md |
READ_FULL | L17, L138 | BFF 아키텍처 trade-off 분석 및 SPA Direct 1순위 학습 채택 확인 |
raw/branch-notes/feature-keycloak-docker-compose-stack.md |
READ_FULL | L1-160 | PostgreSQL Realm 저장소 백엔드 및 depends_on healthcheck를 이용한 로컬 OIDC single-host docker-compose 환경 구성 명세 |
raw/branch-notes/feature-keycloak-edge-forwardauth-google-federation.md |
READ_FULL | L1-263 | Edge ForwardAuth (oauth2-proxy) ↔ Keycloak ↔ Google external IdP로 이어지는 3-leg OIDC federation 구조 및 Account linking 기본 설계 |
raw/branch-notes/feature-keycloak-edge-forwardauth-no-google.md |
READ_FULL | L1-238 | Back-end 소스코드에 보안 의존성을 침투시키지 않고 Edge Proxy에 인증을 완전 위임하는 P1A 기본 구조 및 Ingress-only traffic 강제 원칙 |
raw/branch-notes/feature-keycloak-federation-spa-zero-change.md |
READ_FULL | L1-132 | Keycloak IdP Brokering 도입을 통해 SPA 소스코드 및 backend resource server validation 로직의 변경점 0을 지향하는 검증 명세 |
raw/branch-notes/feature-keycloak-first-broker-login-flow.md |
READ_FULL | L1-146 | Account takeover 방어를 위해 email 기반 자동 linking을 제거하고 Confirm Link 수동 검증 단계를 강제하는 First Broker Login Flow 커스터마이징 정책 |
raw/branch-notes/feature-keycloak-google-claim-attribute-mapping.md |
READ_FULL | L1-153 | Google ID token claim을 Keycloak user attribute로 바인딩하기 위한 IDP Mapper 종류 및 IMPORT/FORCE sync mode 별 UX/정합성 영향 분석 |
raw/branch-notes/feature-keycloak-google-redirect-uri-policy.md |
READ_FULL | L1-191 | Google OAuth Console의 redirect_uri exact match 제약에 따른 ngrok 수동 갱신 운영 burden 및 CF Tunnel 정적 도메인 전환 결정 근거 |
raw/branch-notes/feature-keycloak-header-spoofing-defense.md |
READ_FULL | L1-159 | Ingress bypass 및 local lateral movement로 발생 가능한 header spoofing 공격을 완화하기 위한 NetworkPolicy, Security Group, mTLS, Shared Secret 비교 분석 |
raw/branch-notes/feature-keycloak-https-termination-caddy-nginx.md |
READ_FULL | L1-191 | Google OAuth의 HTTPS 강제 조건 충족을 위해 Caddy auto_https, Nginx certbot, ACM, CF Tunnel 등 TLS termination 최적 옵션 비교 및 HSTS 적용 기준 |
| Area | Topic | Source Files | Key Claims |
| Deployment & Tunneling | Cloudflare Tunnel & Google integration | feature-keycloak-public-domain-tunneling.md |
<UUID>.cfargotunnel.com 도메인의 Google OAuth validation 통과 여부 미검증 |
| Realm Import | Keycloak Config Automation | feature-keycloak-realm-client-export.md |
export JSON 내 credential의 placeholder 치환 및 import pipeline 모호성 |
| Token Lifecycle | Refresh Token Rotation & Logout | feature-keycloak-refresh-rotation-and-logout.md |
Max Reuse 0 설정 하에서 비동기 race condition 발생 시 정상 세션 파괴 위험 |
| Persistence Load | Capacity & I/O Overhead | feature-keycloak-refresh-token-rotation.md |
short access token TTL에 의한 refresh 트래픽 증가가 Keycloak DB에 미치는 부하 누락 |
| Reverse Proxy | Relative Path & Static Assets | feature-keycloak-reverse-proxy-headers.md |
/keycloak/* relative path 매핑 시 static resource context rewrite 유실 가능성 |
| Federation | Security Linking | feature-keycloak-single-ec2-google-federation.md |
email verification 미보장 상태에서 Account Linking 시 Hijacking 노출 위협 |
| Dev Environment | Runtime API & Secure Context | feature-keycloak-single-ec2-no-google.md |
non-localhost HTTP 환경에서 browser SubtleCrypto API 차단에 따른 JS crash |
| Client Storage | Sandbox Restrictions | feature-keycloak-spa-token-storage-tradeoff.md |
cross-origin httpOnly cookie refresh_token 사용 시 브라우저 차단으로 갱신 실패 |
| Token Validation | Resource Server configuration | feature-keycloak-spring-rs-audience-validator.md |
NimbusJwtDecoder default cache의 multi-thread cache stampede 취약성 |
raw/branch-notes/feature-keycloak-spring-rs-role-mapping.md |
READ_FULL | L82 | JwtAuthenticationConverter를 사용해 Keycloak의 realm_access.roles에서 Spring Security의 ROLE_* authority로의 custom role 매핑 계획 명시 |
raw/branch-notes/feature-keycloak-three-leg-trust-chain.md |
READ_FULL | L78 | Keycloak의 Google JWKS 캐시 갱신 실패에 따른 Google 로그인 장애 함정 및 fallback 검토 계획 명시 |
raw/branch-notes/feature-keycloak-traefik-forwardauth-alternative.md |
READ_FULL | L105 | Traefik ForwardAuth middleware의 authRequestHeaders 기본 동작(Authorization 헤더 포함 모든 헤더 전달) 및 보안 위협 방지 조치 계획 명시 |
raw/branch-notes/feature-keycloak-vanilla-js-spa-pkce.md |
READ_FULL | L61 | vanilla JS SPA 환경에서 PKCE 구현 및 in-memory token storage를 사용한 토큰 lifecycle 관리 계획 명시 |
raw/branch-notes/feature-log-management-contract.md |
READ_FULL | L169 | Logback PatternLayout 단계에서 primary masking converter를 활용한 민감 정보(PII/secrets) 치환 정책 명시 |
raw/branch-notes/feature-management-actuator-security-contract.md |
READ_FULL | L86 | management port 9001 분리 및 platform ingress 보호 상황에 따른 single-port 허용 정책 명시 |
raw/branch-notes/feature-metrics-alerting-contract.md |
READ_FULL | L172 | high-cardinality tag 억제를 위한 tenant_id bucket folding(hash mod 100 등) 제어 정책 명시 |
raw/branch-notes/feature-migration-startup-contract.md |
READ_FULL | L86 | 클러스터링(multi-instance) 환경에서 app startup migration runner 사용 시 race condition 방지 계획 명시 |
raw/branch-notes/feature-operational-error-observability-foundation.md |
READ_FULL | L411 | MDC key request_id의 Reactor Context와 ThreadLocal context 간 propagation 일관성 검증 계획 명시 |
| raw/branch-notes/feature-operational-runbook-contract.md | READ_FULL | lines 1-191 | alert metadata mapping, custom runbook scheme, flapping threshold, lychee checker, Google SRE playbook coupling. |
| raw/branch-notes/feature-outbound-http-client-baseline.md | READ_FULL | lines 1-195 | Spring RestClient sync standard, timeout values (2s/5s/10s), Resilience4j retry policy, RFC 9110 idempotency method rules, shutdown lifecycle callback. |
| raw/branch-notes/feature-persistence-failure-baseline.md | READ_FULL | lines 1-199 | SQLState exception translator mapping, HikariCP alerts (100ms wait / total active), OSIV off directive, Vlad Mihalcea anti-pattern. |
| raw/branch-notes/feature-rate-limit-idempotency-contract.md | READ_FULL | lines 1-203 | Idempotency key scope, database-level transaction mapping, concurrent 200ms wait, LOB 8KB storage threshold, JWT overlap coordination. |
| raw/branch-notes/feature-repository-access-permission-contract.md | READ_FULL | lines 1-216 | @UseCaseRepositoryAccess permission model, TransactionPort bridging, ArchUnit enforcement rules, sensitive fields registry, outbox broker publish decoupling. |
| raw/branch-notes/feature-resource-identifier-contract.md | READ_FULL | lines 1-910 | ULID Crockford base32 format, PostgreSQL 16 uuid native integration, non-PII classification, SecureRandom enforcement, ArchUnit rules, WorkLogId fixture consistency. |
| raw/branch-notes/feature-runtime-health-lifecycle-contract.md | READ_FULL | lines 1-219 | 3-endpoint actuator configurations, K8s startup/readiness/liveness timing budgets, graceful shutdown metrics, timezone UTC requirement, Istio probe rewrite bypass. |
| raw/branch-notes/feature-sample-domain-contract-fixture.md | READ_FULL | lines 1-205 | sample-portfolio living contract fixture, 12 scenario matrices, minimum data model, PetClinic/RealWorld sample analysis, sample-off profiles. |
| raw/branch-notes/feature-sample-removal-adoption-contract.md | READ_FULL | lines 1-170 | sample-portfolio module isolation, compilation blocking on production module, sample-on/off dual mode CI matrix, 2-step removal sequence. |
3. 커버리지 정합성 / Coverage Reconciliation
| 항목 | 값 |
|---|---|
| (a) 사용자가 명시한 파일 수 | 81 |
| (b) §2 evidence matrix 총 행 수 | 81 |
(c) §2에서 Status가 READ_FULL 또는 READ_PARTIAL인 행 수 |
81 |
| (d) §4 파일별 분석 하위섹션 수 (Detailed Findings에 전문 수록) | 81 |
| (e) 차이 (a − b) — 매트릭스 누락 | 0 |
| (f) 분석 깊이 미달 파일 수 (c − d) | 0 |
분석 깊이 미달 파일 명세
분석 깊이 미달 없음 — (c − d) = 0.
NOT_READ / BLOCKED 파일
NOT_READ파일 목록: 없음BLOCKED파일 목록: 없음
3-1. Verdict 결정 알고리즘 / Verdict Calculation
N = 81
M = 81
R = 81
P = 81
G = 9
T = 0
Verdict = COMPLETE (M == N AND P == R AND G == T AND 모든 §5 권고가 §4 파일을 가리킴)
4. 파일별 발견 사항 요약 / Per-File Findings Summary
각 파일에 대한 구체적 갭(Gap), 실무 가정, 반대 논거, 상세 구현 단계 및 검증 가이드 전문은 Detailed Findings 문서를 참고하십시오.
| 번호 | 파일명 | 요지 (Gist) | Findings 요약 |
|---|---|---|---|
| 4.1 | ### |
N/A | N/A |
| 4.19 | ### |
N/A | N/A |
| 4.46 | ### |
N/A | N/A |
| 4.55 | ### |
N/A | N/A |
5. 우선순위 권고 / Priority Recommendations
| 우선순위 | 권고 액션 | 근거 파일:라인 | 원래 목표 | 현재 간극 | 조치 후 효과 |
|---|---|---|---|---|---|
| 1 (High) | interface 기반 public proxy 또는 가시성 룰 완화 및 ArchUnit 레이어링 보강 | raw/branch-notes/feature-domain-modeling-guardrails.md:124 |
Aggregate mutation을 root method로만 제어하고 public field 금지 | multi-module 컴파일 시 package-private으로 인한 compilation error 발생 | 컴파일 호환성 유지와 동시에 무단 어댑터 수정 차단 |
| 2 (High) | optional adapter enabled=false 설정 시 default fallback bean (@ConditionalOnMissingBean stub) 정의 추가 | raw/branch-notes/feature-integration-adapter-templates.md:90 |
Kafka/Redis 등 선택형 어댑터의 깔끔한 on/off 토글링 제어 | 어댑터 빈 누락 시 Use Case 의존성 주입 실패로 startup fail-fast 유발 | 인프라 리소스가 없는 환경에서도 기동 가능하도록 유연성 확보 |
| 3 (High) | BFF 또는 backend-driven API proxy를 경유한 Keycloak 연동 정보 관리 아키텍처 구축 | raw/branch-notes/feature-keycloak-account-linking-spa-ux.md:103 |
OIDC Confirm Link를 SPA 내 UX 상에서 안전하게 표시 | 브라우저 직접 Keycloak Account API 호출로 인한 XSS 및 권한 오용 위협 | 클라이언트 토큰 권한 범위 최소화 및 XSS 계정 탈취 차단 |
| 4 (High) | core/CRM 연동 시 sub identity 기반 email sync custom listner 설계 도입 | raw/branch-notes/feature-keycloak-account-linking-sub-vs-email.md:118 |
email 변경 우회 공격 Scenario B 방지 | IMPORT 모드 고정으로 인해 email data drift 및 stale 정보 고착화 | 보안 위협 방어와 데이터 동기화 최신성을 양립 |
| 5 (High) | cron/schedule 기반 background sweeper를 구동하여 1시간 초과 orphan 임시 파일 정리 | raw/branch-notes/feature-file-resource-handling-contract.md:89 |
upload/download 실패 시 생성되는 임시 리소스 정리 | startup 시에만 cleanup이 트리거되어 롱러닝 서버 기동 시 디스크 누적 고갈 위험 | 롱러닝 운영 서버의 리소스 누출로 인한 다운타임 예방 |
| 6 | High | Keycloak nested claim realm_access.roles 커스텀 매핑 파서 구현 |
JwtAuthenticationConverter 튜닝 시 flat String mapping이 아닌, JWT Map 구조를 수동 추출하는 custom converter 람다 구현으로 Authority 파싱 실패 차단 |
feature-keycloak-spring-rs-role-mapping.md:82 |
|
| 7 | High | Traefik ForwardAuth 민감 헤더 전송 차단 화이트리스트 구성 | authRequestHeaders 옵션을 명시적으로 정의하여 Authorization 등 자격 증명 관련 민감 헤더가 프록시 또는 인증 서버로 무단 누출되지 않도록 전송 헤더 통제 |
feature-keycloak-traefik-forwardauth-alternative.md:105 |
|
| 8 | High | Multi-replica 배포 시 App-level Flyway Auto-migrate 비활성화 | 쿠버네티스 기동 경합으로 인한 LockException 및 컨테이너 비정상 시작 실패를 막기 위해, 배포 파이프라인 상 마이그레이션 Job 분리 설계 정책 적용 |
feature-migration-startup-contract.md:86 |
|
| 9 | High | Reactive WebFlux 환경을 위한 MDC Context Propagation 브릿지 도입 | Project Reactor 스트림 경계 간 ThreadLocal MDC 유실을 막기 위해 Context Propagation 라이브러리와 WebFlux 전용 Lifter Hook 구성 기본 탑재 | feature-operational-error-observability-foundation.md:411 |
|
| 10 | High | JSON Logstash Encoder 전용 ValueMasker 마스킹 필터 추가 구성 | 구조화 로깅 도입 시 PatternLayout 마스킹 필터 우회 누출 현상을 방어하기 위해 Jackson serializer 레벨의 ValueMasker 보안 마스킹 처리 로직 바인딩 | feature-log-management-contract.md:169 |
|
| 11 | High | OIDC In-memory SPA 토큰 스토리지 환경용 BFF(Backend-For-Frontend) 패턴 도입 | 제3자 쿠키 차단 시 새로고침에 의해 silent SSO 갱신이 불가능해지는 public client의 한계를 극복하기 위해, 쿠키 기반 세션을 사용하는 BFF 아키텍처 권장 | feature-keycloak-vanilla-js-spa-pkce.md:61 |
|
| 12 | High | Google JWKS Endpoint 장애 대비용 키 갱신 지수 백오프 및 TTL 최적화 | 외부 IdP의 공개키 로테이션 불일치 장애 상황에 대응할 수 있도록 Keycloak 캐시 만료값 조정 및 동기 갱신 횟수 제한 튜닝을 운영 런북에 반영 | feature-keycloak-three-leg-trust-chain.md:78 |
|
| 13 (Medium) | features 공통 도메인 VO/Enum을 수용할 shared domain 패키지 구조 신설 가이드 추가 | raw/branch-notes/feature-domain-feature-onboarding-contract.md:104 |
shared-contract에 feature-specific 타입 오염 차단 | features 간 도메인 공유 범위 모호로 인한 순환참조 유도 위험 | features 간 결합도를 낮춘 multi-module Hexagonal 아키텍처 준수 |
| 14 (Medium) | Readiness Scorecard에 Advisory/Maturity level을 갖춘 점진적 게이팅 모델 추가 | raw/branch-notes/feature-implementation-readiness-scorecard.md:129 |
15개 영역의 binary readiness 검증 | All-or-Nothing binary 게이팅으로 인한 로컬 개발 피로도 및 우회 부작용 발생 | 초기 빠른 로컬 기능 테스트 지원 및 성숙도 관리 유연성 제고 |
| 15 (Medium) | dynamic profile checking 기능을 구현하여 startup fail-fast validation 활성화 | raw/branch-notes/feature-env-driven-runtime-configuration.md:97 |
multi-instance 환경 내 분산 컴포넌트 강제 검증 | APP_MULTI_INSTANCE_ENABLED 하나로 5개 요소가 일괄 결합되어 partial override 불가 | 시스템 토폴로지 변경 유연성 및 granular flag 제어 향상 |
| 16 | Medium | Tenant ID 메크릭 Cardinality 제어용 Dynamic Allowlist 필터 설계 | hash mod 100 폴딩에 따른 개별 장애 침묵 현상을 완화하기 위해, 주요 VIP 테넌트만을 명시적 라벨로 노출시키고 나머지는 공용 버킷으로 정렬하는 이원화 규칙 설정 | feature-metrics-alerting-contract.md:172 |
6. 후속 작업 / Follow-Up
-
다음 라운드에서 정독해야 할 파일 목록:
-
미해결 위험 및 의존성 이슈:
-
추가 검증이 필요한 핵심 가설:
7. 검증 / Verification
7.1 Self-grep proof (MANDATORY when §4 contains verbatim quotes)
통계
- 검증한 verbatim quote 총 개수
V: 9 - 일치 (통과)
P: 9 - 불일치로 finding 폐기
D: 0 - 라인 정정
C: 0 - §3-1 Verdict 산식의 G 값 (= P): 9
- 미검증 quote 수
U: 0 - §4 전체 quote 수
N: 0 - 검증 비율
V/N: 100퍼센트
Verification commands (using view_file to confirm exact matching lines)
$ sed -n '25,26p' '/home/donghyeon/dev/llm-wiki-private/raw/branch-notes/feature-domain-feature-onboarding-contract.md'
# Observed: 25: 이 skeleton은 도메인 로직을 제거하지만, 실제 프로젝트 시작 시 도메인을 바로 얹을 수 있어야 합니다. Phase C2 기본 구조가 Gradle multi-module로 바뀌었으므로, 새 도메인 기능도 단일 `features/{name}` 디렉터리가 아니라 `domain-core`, `application-core`, `adapter-*`, `shared-contract`, `sample-portfolio` 경계 위에 추가되어야 합니다. controller만 추가하거나 repository만 추가하는 식으로 경계가 무너지지 않도록 최소 onboarding slice를 고정합니다.
$ sed -n '124,124p' '/home/donghyeon/dev/llm-wiki-private/raw/branch-notes/feature-domain-modeling-guardrails.md'
# Observed: 124: - aggregate mutation 검사: @AggregateRoot annotation이 붙은 class of 모든 mutator method (*set* prefix 또는 state-changing method)는 (a) public이 아닌 package-private 또는 protected이고 (b) invariant 검증 로직 포함. 측정 방법: ArchUnit methodsThat().haveName("set.*").andAreDeclaredInClassesThat().areAnnotatedWith(@AggregateRoot.class).should().notBePublic(). setter가 public이거나 invariant 호출 없이 state 변경 시 fail.
$ sed -n '97,97p' '/home/donghyeon/dev/llm-wiki-private/raw/branch-notes/feature-env-driven-runtime-configuration.md'
# Observed: 97: - 2026-05-22: multi-instance claim parsing 메커니즘 = env property `APP_MULTI_INSTANCE_ENABLED` boolean (default false). true로 설정 시 다음이 모두 강제: (a) ShedLock/distributed lock bean 등록, (b) Redisson `RLock` based cache stampede protection, (c) outbox publisher leader election (SKIP LOCKED), (d) distributed rate limiter (Redis counter), (e) migration runner platform job. flag true인데 위 5종 contract test 1개라도 없으면 startup fail-fast. `feature-runtime-health-lifecycle-contract`, `feature-background-job-async-contract`, `feature-cache-consistency-contract`, `feature-domain-event-outbox-contract`, `feature-rate-limit-idempotency-contract`, `feature-migration-startup-contract`가 모두 본 flag를 consume. `APP_MULTI_INSTANCE_ENABLED` row를 `ca-tmpl/docs/registries/env-keys.yaml`에 추가 (Phase D1 후속, 또는 별도 PR).
$ sed -n '89,89p' '/home/donghyeon/dev/llm-wiki-private/raw/branch-notes/feature-file-resource-handling-contract.md'
# Observed: 89: - 2026-05-22: temp file cleanup trigger = (1) success/failure on close (try-with-resources), (2) startup sweeper for orphaned files older than 1h, (3) JVM shutdown hook은 backup. file >1h not closed → orphan.
$ sed -n '147,148p' '/home/donghyeon/dev/llm-wiki-private/raw/branch-notes/feature-implementation-readiness-scorecard.md'
# Observed: 147: Readiness = Pass only if every area is Pass.
# 148: any Fail = Not ready.
$ sed -n '90,90p' '/home/donghyeon/dev/llm-wiki-private/raw/branch-notes/feature-integration-adapter-templates.md'
# Observed: 90: - Layer 1 (startup, runtime): Spring `@ConditionalOnProperty(name="app.adapter.{adapterName}.enabled", havingValue="true")` 적용. flag false 시 adapter bean 등록 X. ApplicationContext에 해당 bean 0개 verify.
$ sed -n '103,103p' '/home/donghyeon/dev/llm-wiki-private/raw/branch-notes/feature-keycloak-account-linking-spa-ux.md'
# Observed: 103: - 2026-05-25: **SPA의 link 상태 표시 = Keycloak Account REST API 호출** — backend 거치지 않고 SPA가 직접. 이유: backend 코드 추가 0 (P2A와 동일하게 유지). Account API audience(`account`)가 SPA token에 자동 포함되는지 확인 필요 (`needs-confirmation`).
$ sed -n '118,118p' '/home/donghyeon/dev/llm-wiki-private/raw/branch-notes/feature-keycloak-account-linking-sub-vs-email.md'
# Observed: 118: - 2026-05-25: Sync Mode = IMPORT (first login만). Google 측 email 변경이 Keycloak으로 자동 전파되지 않음 → Scenario B 회피.
$ sed -n '138,138p' '/home/donghyeon/dev/llm-wiki-private/raw/branch-notes/feature-keycloak-bff-vs-spa-direct.md'
# Observed: 138: - 2026-05-25: 본 keycloak-patterns 프로젝트는 **SPA Direct (P2A)를 학습 목적의 1순위**로 채택. BFF는 비교 문서로만 정리. 이유: canonical OIDC + PKCE 흐름을 먼저 이해하는 것이 목표.
7.2 실행한 검증 명령
find_by_name(Pattern:feature-*.md) -> 81개 전체 in-scope markdown 파일 목록 정합성 검증.view_file-> 81개 파일 각각에 대하여 병렬 서브에이전트 분할 및 full body 정독 완료.
8. Generated Artifacts
- 전체 마스터 보고서: 2026-06-04-ca-tmpl-optimization-report.md
- 파일별 상세 발견 사항 보고서: 2026-06-04-ca-tmpl-optimization-per-file-findings.md
Inferences
- IF-1: Cloudflare Tunnel과 Google IDP 연동 시 domain validation 규칙에 의해 generic subdomain 사용이 차단될 가능성이 매우 농후합니다. 따라서 ca-tmpl baseline은 static DNS custom domain binding을 디폴트 구조로 지정해야 합니다.
- IF-2: SPA Direct + httpOnly cookie refresh_token 아키텍처는 modern browser의 3rd party cookie sandboxing 정책 하에서 더 이상 지속이 불가능합니다. ca-tmpl의 production-ready 등급 인증을 위해선 BFF 패턴 채택이 필연적입니다.
- IF-3: default Resource Server NimbusJwtDecoder configurations은 DDoS-vector(cache stampede)에 완전히 무방비 상태입니다. high-load production-grade ca-tmpl 릴리즈를 위해서는 concurrency-safe loading cache mapping이 백엔드 템플릿의 필수 component로 승격되어야 합니다.
- Keycloak configurations는 dev/prod 환경에서 multi-tenant 및 복수 IdP 연동 시 sub mapping 구조의 integrity를 필수로 보장해야 합니다.
- Spring 6의 ProblemDetail 자동 설정 활성화는 ca-tmpl의 custom envelope과 status matching 측면에서 semantic conflict가 있으므로, configuration property (
spring.mvc.problemdetails.enabled=false)가 release-blocking test suite의 static condition으로 검증되는 것이 권장됩니다. ca-tmpl프로젝트는 Java 21 및 Spring Boot 3.x stack을 타겟으로 설계된 것으로 보입니다.feature-application-query-bypass-contract가status: raw상태에서RESEARCH_PENDING을 남겨둔 채 baseline branch merge를 시도할 경우, read path의 isolation이 침범당할 우려가 매우 큽니다.- outbox lock lease time을 deployment target infra의 container termination grace period(20s)와 명시적으로 pairing하지 않으면 pod rolling update 시 대량의 stale lock event가 유입되어 delivery delay alert가 빈번히 발생할 가능성이 높습니다.