STK10-13 worker 서버 스캐폴드·이벤트 소비

작업 내용

신규 worker 서버(:8091, Spring Boot, Hexagonal)를 만들고 marketflow.collected.v1을 소비하는 진입점을 구현한다. 후행 도메인 재계산(STK10-14~16)이 공유하는 선행이다.

  • 신규 모듈 worker/ (build.gradle.kts, application, OTel Java agent 적용 — STK-OBS 자동계측)
  • presentation: MarketFlowCollectedEventWorker@KafkaListener(marketflow.collected.v1), DTO 직접 매핑
  • consumer 설정: JsonDeserializer + trusted.packages, 재시도 + DLQ(DefaultErrorHandler + DeadLetterPublishingRecoverer)
  • 소비 시 도메인 Refresh UseCase를 호출하는 골격 (실제 재계산은 STK10-14~16)

be-code-convention 준수: Consumer는 presentation ~EventWorker.kt, UseCase 경유, Repository/DomainService 직접 호출 금지.

다이어그램

처리 흐름

sequenceDiagram
    participant Topic as collected.v1
    participant EW as MarketFlowCollectedEventWorker
    participant UC as Refresh UseCases
    participant Dlq as DLQ
    Topic->>EW: consume(event)
    EW->>UC: refresh(baseDate)
    alt 성공
        UC-->>EW: done
    else 재시도 초과
        EW->>Dlq: 격리
    end

클래스 의존

flowchart LR
    EW[MarketFlowCollectedEventWorker] --> UC[Refresh UseCases]
    EW --> ErrorHandler[DefaultErrorHandler]
    ErrorHandler --> Dlq[collected.v1.DLQ]

테스트 케이스

  • worker가 collected.v1을 소비해 Refresh UseCase를 호출한다 (TestContainers Kafka)
  • 이벤트 DTO가 JsonDeserializer로 매핑된다
  • 처리 실패 시 재시도 후 DLQ로 격리된다
  • 동일 이벤트 재수신 시 멱등하게 처리된다 (재계산이 덮어쓰기)
  • worker 기동 시 OTel 자동계측으로 consumer lag이 노출된다