## 어떤 기능인가요? > 선행: #111 (JVM 기본 시간대 서울 고정) 푸시 알림 발송의 기반이 되는 트랜잭셔널 아웃박스를 구현한다(`architecture.md` 6-2절의 미구현 부분). 알림을 일으키는 곳(행사·사물함·공지·대여)과 토큰·알림 설정·발송 포트가 있는 곳(member 모듈)이 서로 다른 도메인 모듈이라 직접 호출할 수 없다. 도메인은 자기 트랜잭션 안에서 이벤트를 아웃박스에 기록하고, 릴레이가 이를 인프로세스로 다시 발행한다. ## 📝 작업 상세 내용 - [ ] `V18__create_outbox_events_table.sql` — 문서 스키마에 `attempts`, `FAILED` 상태 추가 - [ ] `core:common`에 `OutboxWriter` 포트와 `common.event` 패키지 - [ ] `infrastructure:outbox`에 `JpaOutboxWriter`(트랜잭션 밖 호출 시 실패), `OutboxRelay`(1초 간격 폴링, 실패 5회면 `FAILED`) - [ ] `bootstrap`에 `@EnableScheduling` - [ ] 발행 완료 후 7일 지난 행 정리 작업 - [ ] `flyway-migration.md` 5절, `architecture.md` 6-2절 반영 (리스너는 `@EventListener`) ## 📁 참고 자료 (선택) - 릴레이는 트랜잭션 밖에서 발행하고, 리스너가 예외 없이 끝나면 `PUBLISHED`로 표시한다. 리스너 실패 시 재시도된다 - 재전달로 드물게 생기는 중복 알림은 허용한다 - 환경마다 인스턴스 하나로 보고 ShedLock은 두지 않는다
Activity