Architecture
source-repo의 샘플 코드는 하나의 Hospital-at-Home SaMD product를 가정하고 Clean Architecture, DDD, TDD를 작은 단위로 보여줍니다.
1. 핵심 방향
안쪽 코드는 바깥쪽 코드를 몰라야 합니다.
domain -> usecase/ports -> adapters/bootstrap -> app entrypoint
domain은 제품 언어와 판단 규칙을 표현합니다.usecase는 stateless application action입니다.ports는 usecase가 외부 세계에 기대하는 최소 계약입니다.adapters는 HTTP, PostgreSQL, Redis, React, Zephyr, Kubernetes 같은 기술을 port로 변환합니다.app은 runtime config와 concrete adapter를 조립합니다.
2. 제품 계약
여러 언어와 app이 같은 제품을 구성하므로 아래 계약은 흔들리면 안 됩니다.
SignalPacketPreprocessedSignalRiskAssessmentMonitoringSnapshotReviewQueueItemRiskMonitor
이 계약은 JSON Schema, shared fixture, package API, test로 고정합니다.
3. 언어별 책임
| Language | Bounded context | Responsibility |
|---|---|---|
| C/Firmware | Device signal | sample, packet, quality evidence, firmware artifact |
| Rust | Preprocessing | 성능 민감한 feature extraction과 Rust preprocessing core |
| Python | Risk workflow | signal ingestion, risk assessment, alarm/review API, repository port |
| TypeScript | Monitoring UI | clinical dashboard, view model, alarm presentation, frontend contract |
| Go | Runtime operations | Kubernetes operator, controller, drift/status automation |
각 언어는 같은 기능을 반복 구현하지 않습니다. 각자 생태계에 자연스러운 책임을 맡되, domain/usecase/port/adapter 경계는 유지합니다.
이 경계는 선택 사항이 아니라 review 기준입니다. C/Firmware가 clinical risk를 계산하거나, TypeScript가 alarm severity를 다시 산출하거나, Go operator가 model threshold policy를 해석하기 시작하면 bounded context가 섞인 것입니다.
4. 테스트 기준
테스트는 작은 의미에서 큰 조립으로 올라갑니다.
| Layer | Test style |
|---|---|
| Domain | unit test |
| Usecase | fake port 기반 integration test |
| Adapter | contract/integration test |
| App | smoke/acceptance test |
make demo/check는 HTTP 기반 end-to-end path를 검증하고, make demo/check/storage는 PostgreSQL/Redis adapter까지 포함한 path를 검증합니다.