전체 구조 요약
역할 분리
- Write(진실): MySQL(RDB) — 게시글의 정합성/트랜잭션은 여기서만 확정
- Outbox(로컬 이벤트 로그): MySQL의 outbox_tb — “읽기 모델 갱신 작업”을 유실 없이 저장
- Read(조회 최적화):
- MongoDB: 화면용 문서(post_view)로 상세/목록 빠르게 제공
- Redis: 핫 캐시/최신글/랭킹/카운터 등 초고속 가속
쓰기 흐름(POST/PUT/DELETE)
- @Transactional 안에서
- board_tb에 게시글 저장/수정/삭제
- 동시에 outbox_tb에 이벤트(POST_CREATED/UPDATED/DELETED) 저장
- 트랜잭션 커밋되면 둘 다 함께 확정됨
→ Mongo/Redis가 죽어도 이벤트(outbox)가 남아서 유실 없음
Outbox 워커(백그라운드) 흐름
- @Scheduled 워커가 주기적으로 outbox_tb에서 NEW 이벤트를 배치로 가져옴(선점/락)
- 이벤트 타입에 따라
- Mongo upsert(뷰 문서 갱신)
- Redis 캐시/목록/랭킹 갱신
- 성공 → DONE
- 실패 → retry_count 증가 + next_retry_at 설정(백오프 재시도)
→ 장애 후에도 자동 복구 가능
읽기 흐름(GET)
상세 조회
- Redis hit → 바로 반환
- miss → Mongo hit → Redis에 캐시 후 반환