📘알림 기능의 전체 흐름을 정리
전체 흐름
도메인에서 발생한 이벤트를 조합하여 유저에게 알림 발송

- 도메인 서비스 (이벤트 발생)
- 생성, 수정, 삭제 등 유저에게 직접적인 영향을 주는 이벤트 발생 시 메시지 발행.
- RabbitMQ (메시지 브로커)
- 각 도메인에서 발행한 메시지를 MessageHub로 전달.
- MessageHub (메시지 분리/가공)
- 수신한 메시지를 분리 및 가공하여 Notification 서비스에서 처리 가능한 형태로 변환.
- Notification 서비스 (DB 저장 및 발송)
- 메시지를 DB에 저장하고, SSE와 FCM을 통해 유저에게 발송.
- 발송 결과(성공/실패)를 로그로 기록.
Message Hub
도메인 메세지를 받아서 메세지 조합 및 저장 후 알림 도메인으로 전달.
저장된 메세지는 스케줄러로 예약 발송에 사용 후 삭제.

- Consumer (메시지 소비)
- 각 도메인에서 RabbitMQ로 발행한 이벤트 메시지를 수신.
- Handler (데이터 전체 흐름 관리)
- 수신한 메시지의 처리 과정을 총괄하고 다음 단계로 전달.
- Provider (메시지 분리/가공)
- 메시지를 Notification 서비스에서 처리 가능한 형태로 변환.
- 가공 과정에서 Service를 호출해 Redis에 예약 정보 및 중복 발송 방지 플래그를 저장.
- Service (메시지 저장)
- UserClient (발송 대상 정보 확보)
- Util (메시지 문자열 조합)
- Scheduler (예약 알림 발행)
- 특정 시간에 발송해야 하는 메세지 발행
- Redis 에서 메세지 확보 후 발행 후 삭제
- Publisher (RabbitMQ 발행)
- 가공된 메시지를 반복 발행하여 Notification 서비스로 전달.
Notification
메세지 DB 저장 및 유저에게 전송. 실패 시 재시도

- Consumer (메시지 소비)
- RabbitMQ로부터 발송 대상 메시지를 수신.
- 수신 즉시 Handler로 전달하여 발송 절차 시작.
- Handler (데이터 전체 흐름 관리)
- 메시지 발송 전 필요한 데이터 전처리 수행.
- Service를 호출해 발송 로그 및 상태를 DB에 저장.
- Service (데이터 DB 저장)
- 발송 성공/실패 여부를 기록.
- 실패 시, 재발행 로직을 트리거하여 Consumer 또는 재시도 큐로 재전송.
- SSE / FCM 발송
- 처리 완료된 메시지를 SSE(실시간 연결) 또는 FCM(Push 알림)으로 사용자에게 전송.
- SSE 로 전송 후 실패시 FCM 으로 전송.
- 실패 시 재발행
- 발송 실패 시, 메시지가 재발행되어 Consumer로 돌아가 다시 처리 시도.
- 재발행은 DB 저장 시, 최대 3회까지 시도 후 전송 중단.