# 전략 아키텍처·SOLID·리팩터링 기준 ## 아키텍처 경계 - Host: composition root, 인증/관제/Endpoint 조립만 담당한다. - Module: Vertical Slice와 모듈 내부 정책·저장소를 소유한다. - Domain: FastEndpoints, Dapper, Npgsql, Hangfire, HTTP를 참조하지 않는다. - Application: use case, idempotency, transaction, context loading, orchestration을 담당한다. - Infrastructure: SQL, 외부 Adapter, Outbox/Inbox, Projection 구현을 담당한다. - Contracts: 모듈 간 최소 integration event만 공유한다. 타 모듈 테이블 직접 조회를 금지한다. ## SOLID의 현장 적용 | 원칙 | 적용 | 금지 | |---|---|---| | SRP | Endpoint=HTTP, Handler=유스케이스, Policy=결정, Adapter=I/O | God Service, Hangfire Job 내 정책 | | OCP | 승인된 Policy/DQ/Adapter registry | reflection plugin framework | | LSP | Adapter contract test로 시간·단위·오류 의미 보장 | mock 성공만으로 교체 가능 판정 | | ISP | IClock, ContextReader, OutboxWriter 등 좁은 Port | 범용 Repository/Manager | | DIP | Domain은 외부 기술을 모름 | Npgsql/HTTP 타입의 Domain 침투 | ## 리팩터링 순서 1. Characterization/Golden test로 현재 동작을 고정한다. 2. 정책 변경과 구조 변경을 분리한다. 3. 이름·단위·시간 의미를 먼저 교정한다. 4. 중복은 문장이 아니라 **업무 의미와 변경축**이 같을 때만 통합한다. 5. PR마다 성능·데이터·감사·운영 영향과 rollback을 기록한다. 6. 기술부채는 Owner, Interest, Trigger, Gate, Exit Test를 가진다. ## Fitness Functions - 모듈→모듈 직접 project reference allowlist. - Domain의 Infrastructure namespace/package 참조 0. - 모듈 소유 schema 외 SQL 접근 0. - Endpoint마다 인증/권한 선언 100%. - API/DDL/Event/Job/UI/Test ID 중복 0. - 문서/DDL/OpenAPI/Test contract CI diff. - `AutomaticOrder=false`, `KisOrderAdapter=false` config scan.