- PassDelivery(pass_deliveries) outbox 엔티티: 발송 결과(SENT/FAILED)·채널·수신처·시도횟수·오류 기록.
- PassNotifier 계약 변경: 실패 시 예외 throw(+ channel()/recipient()). Hanbank/Email이 실패를
더 이상 삼키지 않고 throw → PassDeliveryService가 결과를 outbox에 기록(승인은 롤백 안 됨).
- PassDeliveryRetryScheduler: 매 10분(acs.delivery.retry-cron) FAILED & attempts<max(기본5) 재발송.
- 관리 API: GET /api/admin/deliveries?status=FAILED, POST /api/admin/deliveries/{id}/retry (ADMIN).
- ApprovalService는 passDeliveryService.deliver(vr)로 위임(QR생성·발송·기록 일원화).
- Flyway V3__pass_delivery.sql. FlywayValidationTest가 V1+V2+V3를 엔티티와 대조.
- 테스트: PassDeliveryTest(발송 실패→FAILED 기록→재시도→SENT). 전체 8건 통과.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
17 lines
758 B
SQL
17 lines
758 B
SQL
-- 출입증 발송 outbox: 발송 결과 기록 + 실패건 재발송 추적
|
|
-- Hibernate ddl-auto=validate 가 검증하므로 PassDelivery 엔티티와 컬럼명·타입이 일치해야 한다.
|
|
|
|
CREATE TABLE pass_deliveries (
|
|
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|
created_at TIMESTAMP NOT NULL,
|
|
updated_at TIMESTAMP NOT NULL,
|
|
visit_request_id BIGINT NOT NULL,
|
|
channel VARCHAR(20),
|
|
recipient VARCHAR(120),
|
|
status VARCHAR(20) NOT NULL,
|
|
attempts INTEGER NOT NULL,
|
|
last_error VARCHAR(500)
|
|
);
|
|
CREATE INDEX idx_pd_status ON pass_deliveries (status);
|
|
CREATE INDEX idx_pd_visit_request ON pass_deliveries (visit_request_id);
|