자동매매봇 티켓 분해 DAG
Wave 너비 분포
| Wave | 너비 | 티켓 |
|---|---|---|
| 1 | 2 | DB-01, BE-01 |
| 2 | 8 | BE-02, BE-03, BE-04, BE-05, BE-06, BE-07, BE-08, BE-09 |
| 3 | 3 | BE-10, BE-11, BE-12 |
| 4 | 3 | BE-13, BE-14, BE-15 |
| 5 | 2 | BE-16, BE-17 |
총 18티켓. 직선형 DAG가 아니다 — wave 2에서 8폭으로 벌어진다.
flowchart LR DB01[DB-01 스키마] --> W2[wave2 애그리게이트 8] BE01[BE-01 도메인 계약] --> W2 W2 --> W3[wave3 도메인서비스 3] W3 --> W4[wave4 UseCase 3] W4 --> W5[wave5 통합 2]
병목 처리
- 연관 병목은 하나로 묶었다 — enum·값 객체·Repository/Gateway interface를
BE-01한 티켓으로 합쳤다. 쪼개면 후행이 서로를 기다려 1→1→1 직렬 사슬이 된다. - 독립 병목은 쪼갰다 —
DB-01(Flyway SQL)은BE-01(Kotlin 계약)과 파일이 겹치지 않아 wave 1에서 병렬로 간다. - 후행 의존 카운트 ≥ 3인 티켓은
BE-01(전 후행)과DB-01(wave 2 애그리게이트 5개)뿐이며, 둘 다 더 쪼개면 직렬화되는 불가피한 병목이다.
Single Writer per File 검증
같은 wave 내 수정 파일 교집합이 ∅ 인지 확인한다.
Wave 1
| 티켓 | 수정 파일 범위 |
|---|---|
| DB-01 | backend/src/main/resources/db/migration/V*__create_autotrading_tables.sql |
| BE-01 | backend/.../autotrading/domain/ (enum·값객체·interface), backend/.../order/domain/ConditionalOrderGateway.kt |
교집합 ∅ ✓
Wave 2
| 티켓 | 수정 파일 범위 |
|---|---|
| BE-02 | autotrading/domain/AutoTradingPolicy.kt, autotrading/infrastructure/mysql/AutoTradingPolicy* |
| BE-03 | autotrading/domain/TradingDay.kt, autotrading/infrastructure/mysql/TradingDay* |
| BE-04 | autotrading/domain/OrderProposal.kt, autotrading/infrastructure/mysql/OrderProposal* |
| BE-05 | autotrading/domain/TradingPosition.kt·TradingFill.kt, autotrading/infrastructure/mysql/TradingPosition*·TradingFill* |
| BE-06 | autotrading/domain/TradingCostModel.kt·PositionSizer.kt, ml/tests/test_cost_model_parity.py |
| BE-07 | autotrading/domain/RiskGate.kt |
| BE-08 | order/infrastructure/toss/TossConditionalOrderGatewayImpl.kt·TossConditionalOrderDtos.kt |
| BE-09 | autotrading/infrastructure/notification/DiscordAutoTradingAlertGateway.kt |
교집합 ∅ ✓ — 애그리게이트마다 파일 접두사가 다르고, BE-08은 order 패키지 신규 파일만 만든다(기존 OrderGateway.kt 미수정).
Wave 3~5
| 티켓 | 수정 파일 범위 |
|---|---|
| BE-10 | autotrading/domain/PaperTradeExecutor.kt·LiveTradeExecutor.kt |
| BE-11 | autotrading/domain/AutoTradingDomainService.kt |
| BE-12 | autotrading/domain/TradingSettlementDomainService.kt·RiskTierPromotionDomainService.kt |
| BE-13 | autotrading/application/RunAutoTradingCycleUseCase.kt + Command/매퍼 |
| BE-14 | autotrading/application/{Approve,Reject}OrderProposalUseCase.kt·ToggleKillSwitchUseCase.kt·조회 UseCase 2종 |
| BE-15 | autotrading/application/{SyncPositionFills,SettleTradingDay,EvaluateRiskTier}UseCase.kt |
| BE-16 | autotrading/presentation/AutoTradingApiController.kt·스케줄러 2종, application.yml |
| BE-17 | backend/src/test/.../autotrading/isolation/·scenario/ |
교집합 ∅ ✓ — UseCase는 1개 = 1파일 원칙을 지키므로 파일 단위로 갈린다. 공통 파일(application.yml) 수정은 BE-16 통합 티켓 단독에 몰았다.
공용 테스트 헬퍼 선점 소유
BE-01이 소유한다. 아래를 만들고 판정 기준·근거를 티켓에 남긴다.
| 헬퍼 | 용도 |
|---|---|
TradeCandidateFixture | 신호 후보 픽스처 (등급·점수·현재가 조합) |
AutoTradingPolicyFixture | 모드·단계·킬스위치 조합 픽스처 |
CostModelParityFixture | ml/app/cost_model.py와 교차 검증할 공통 입력·기대값 표 |
후행 wave 티켓은 소비만 하고 새로 만들지 않는다. 새 헬퍼가 필요해지면 직접 만들지 말고 BE-01로 되돌려 보고한다.
실제 사고 이력: 두 티켓에 각각 리뷰 지적이 가서 두 구현자가 주석 한 줄만 다른 동일 헬퍼를 같은 경로에 만든 적이 있다. 설계 단계 Single Writer 검증은 통과한 상태였다.
마일스톤 매핑
| 마일스톤 | 티켓 |
|---|---|
| M1 페이퍼 루프 | DB-01, BE-01, BE-02~06, BE-10(Paper만), BE-11, BE-13, BE-16 |
| M2 리스크·안전장치 | BE-07, BE-09, BE-12, BE-14, BE-15, BE-17 |
| M3 조건부 자동 + 검증 | 신규 티켓 없음 — BE-14 승인 흐름과 BE-12 단계 평가를 운영으로 검증 |
| M4 라이브 전환 | BE-08, BE-10(Live) — 코드는 미리 배포하되 정책 모드가 PAPER인 한 호출되지 않는다 |