--- title: 2026-05-28 일일 노트 source_type: daily-note status: raw tags: [daily, ca-tmpl, ca-skeleton, clean-architecture, archunit] date: 2026-05-28 branches: [ feature-architecture-enforcement-rules ] --- # 2026-05-28 > Layer: `raw/daily-notes/` — 그날의 **혼합 일일 기록**. 그 자체는 wiki로 옮기지 않으며, `/ingest`가 promotable 항목만 추출해 다른 wiki 영역으로 보낸다. 원본은 raw에 영구 보관. ## 활성 브랜치 `feature-skeleton-package-blueprint-contract` 다음으로 이어서 개발할 브랜치는 `feature-architecture-enforcement-rules`다. 오늘은 Phase C2 전체 roadmap을 처리하지 않고, 방금 구현된 multi-module skeleton의 경계가 깨지지 않도록 architecture enforcement를 실제 코드와 테스트로 붙이는 데 집중한다. - `feature-architecture-enforcement-rules` (local-verified, not merged) — [[raw/branch-notes/feature-architecture-enforcement-rules]] ## 오늘의 계획 브랜치별 항목은 `[branch-name]` 프리픽스. 오늘 개발 범위는 아래 3개로 제한한다. - [x] [feature-architecture-enforcement-rules] ca-tmpl repo의 현재 module dependency graph를 확인하고, 허용/금지 dependency matrix를 `domain-core`, `application-core`, `adapter-*`, `app-bootstrap`, `shared-contract`, `sample-ticket` 기준으로 확정한다. - [x] [feature-architecture-enforcement-rules] Gradle dependency guardrail을 구현해서 `domain-core -> Spring/adapter`, `application-core -> adapter-*`, production module -> `sample-ticket` 의존을 차단한다. - [x] [feature-architecture-enforcement-rules] ArchUnit test를 추가해서 forbidden import/annotation 규칙을 검증하고, 최소한 architecture test와 관련 Gradle verification task를 로컬에서 실행한다. ## 한 일 - ca-tmpl `src/build.gradle`의 `verifyCleanArchitectureDependencies`를 보강해 declared module coverage와 forbidden project dependency 메시지를 강화했다. - ca-tmpl `CleanArchitectureTest`에 application `@Transactional` 금지, controller direct domain response 금지, mapper boundary, shared-contract package allowlist 규칙을 추가했다. - 임시 위반 코드로 신규 ArchUnit 규칙 실패를 확인한 뒤 제거했다. - 임시 `app-bootstrap -> sample-ticket` 의존으로 Gradle dependency verifier 실패를 확인한 뒤 제거했다. - `cd src && ./gradlew :app-bootstrap:test verifyCleanArchitectureDependencies`, `cd src && ./gradlew test`를 실행해 로컬 검증을 마쳤다. ## 배운 점 > wiki/concepts/로 promotable 후보 - multi-module Clean Architecture에서는 package 위치보다 module dependency direction이 1차 경계다. - `sample-ticket`은 template fixture/reference module로 유지하되, production module이 sample에 의존하지 못하도록 enforcement rule이 필요하다. ## 트러블슈팅 > raw/errors/ 또는 wiki/projects/ 또는 관련 branch-note의 "마주친 문제" 섹션으로 promotable 후보 - Gradle wrapper가 `~/.gradle` lock 파일을 쓰려 하면서 sandbox 기본 실행에서는 `Read-only file system` 오류가 났다. 검증 명령은 승인된 escalated 실행으로 재수행했다. 상세: [[raw/errors/gradle-wrapper-readonly-cache-2026-05-28]] - repo 내부 `docs/superpowers/plans/2026-05-28-architecture-enforcement-rules.md`는 `.gitignore`의 `/docs` 규칙 때문에 git 변경 목록에 잡히지 않는다. 최종 wiki 기록은 [[raw/branch-notes/feature-architecture-enforcement-rules]]에 반영했다. ## 면접·포트폴리오로 옮길 만한 것 > 후보 표기만. daily-note에서 `wiki/interview/` 또는 `wiki/portfolio/`를 직접 만들지 않는다. - Clean Architecture skeleton에서 module boundary를 문서가 아니라 Gradle/ArchUnit rule로 강제한 이유. 글감 raw note: [[raw/blog-topics/clean-architecture-boundary-enforcement-2026-05-28]]. 예상 질문 raw note: [[raw/interviews/clean-architecture-boundary-enforcement]]. 실제 로컬 검증 후 `wiki/projects/ca-tmpl/clean-architecture-package-layout` 또는 별도 architecture enforcement canonical 문서로 승급 후보. ## 내일로 넘긴 것 - [feature-application-port-usecase-contract] architecture enforcement가 통과한 뒤 `application/port/in`, `application/port/out`, transaction runner, repository port 위치를 정리한다. - [feature-sample-removal-adoption-contract] architecture enforcement에 production module -> `sample-ticket` 금지 rule이 반영된 뒤 sample-off runtime isolation 구현 범위를 구체화한다. ## 잡담 / 회의 / 기타 - 오늘 daily-note는 `feature-skeleton-package-blueprint-contract` 다음 개발 착수 범위를 제한하기 위한 계획이다.