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이 같은 제품을 구성하므로 아래 계약은 흔들리면 안 됩니다.

  • SignalPacket
  • PreprocessedSignal
  • RiskAssessment
  • MonitoringSnapshot
  • ReviewQueueItem
  • RiskMonitor

이 계약은 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를 검증합니다.

5. 관련 문서