한 줄 목표
DB 상태 변경 직후 Server가 종료되거나 handler가 실패해도 후속 작업을 잃지 않고, 중복 전달에도 업무 결과가 한 번만 만들어지도록 합니다.
초보자용 설명
Task 생성·취소와 “다음에 처리할 이벤트”를 따로 저장하면 중간 종료 때 하나만 남을 수 있습니다. 같은 transaction 안에 두 내용을 저장하고, 실패하거나 서버가 재시작되면 안전하게 이어서 처리합니다.
확정한 기술 선택
DomainEventPublisher Port 뒤에 PostgreSQL Transactional Outbox adapter를 사용합니다.
event_publication은 처리할 이벤트, event_consumption은 handler별 완료 기록입니다.
- Spring Boot 4.1에서 lease·실패 분류·backoff·handler별 멱등성을 명시적으로 통제합니다.
- MVP에서는 Kafka/RabbitMQ와 별도 Testcontainers 의존성을 추가하지 않습니다.
- 실제 PostgreSQL 검증은 저장소의 기존 GitHub Actions PostgreSQL 17 service를 사용합니다.
Event envelope
eventId, eventType, payloadVersion
aggregateType, aggregateId, companyId
actorType, 안전한 actorId
requestId, traceId, occurredAt
- 기능별 allow-list를 통과한 최소 payload
JWT, Link 원문 token, 여권·외국인등록·전화·계좌번호, 비밀번호, 전체 Prompt를 넣지 않습니다.
구현 범위
AI retry와 섞지 않기
완료 조건
진행 상황
관계
한 줄 목표
DB 상태 변경 직후 Server가 종료되거나 handler가 실패해도 후속 작업을 잃지 않고, 중복 전달에도 업무 결과가 한 번만 만들어지도록 합니다.
초보자용 설명
Task 생성·취소와 “다음에 처리할 이벤트”를 따로 저장하면 중간 종료 때 하나만 남을 수 있습니다. 같은 transaction 안에 두 내용을 저장하고, 실패하거나 서버가 재시작되면 안전하게 이어서 처리합니다.
확정한 기술 선택
DomainEventPublisherPort 뒤에 PostgreSQL Transactional Outbox adapter를 사용합니다.event_publication은 처리할 이벤트,event_consumption은 handler별 완료 기록입니다.Event envelope
eventId,eventType,payloadVersionaggregateType,aggregateId,companyIdactorType, 안전한actorIdrequestId,traceId,occurredAtJWT, Link 원문 token, 여권·외국인등록·전화·계좌번호, 비밀번호, 전체 Prompt를 넣지 않습니다.
구현 범위
REVIEW_REQUIRED전환AI retry와 섞지 않기
fowoco/ai: 한 Runtime attempt 내부 Provider retry완료 조건
진행 상황
관계