📌 개요
채팅 모듈에 부족한 실사용 기능들을 한 번에 개선한다. 6개 작업을 하나의 이슈로 묶어 진행하고, 각각 완료되는 대로 체크한다.
🎯 배경 / 목적
현재 채팅은 "Redis Pub/Sub 브로드캐스트 + DB 저장" 기본 골격만 있고, 읽음 상태·접속 상태·유실 복구·도배 방지·인증 안전성이 비어있음. notification 모듈에서 이미 검증한 Outbox/Pub-Sub 패턴을 최대한 재사용한다.
📦 범위
✅ 수용 기준 (Acceptance Criteria)
- 각 하위 작업이 기존 채팅 REST/WebSocket API와 하위 호환되게 동작 (기존 클라이언트 흐름 깨지지 않음)
- 항목별로 관련 unit/integration 테스트 포함
- 멀티 인스턴스(Redis Pub/Sub) 환경 전제 유지 — 로컬 메모리에만 의존하는 상태 추가 금지
📝 참고 사항
- 순서 권장: 1(읽음) → 2(Presence, 3의 미접속 판단에 필요) → 3(알림연동) → 4(재연결복구) → 6(레이트리밋) → 7(인증개선)은 언제 껴도 무방(독립적)
📌 개요
채팅 모듈에 부족한 실사용 기능들을 한 번에 개선한다. 6개 작업을 하나의 이슈로 묶어 진행하고, 각각 완료되는 대로 체크한다.
🎯 배경 / 목적
현재 채팅은 "Redis Pub/Sub 브로드캐스트 + DB 저장" 기본 골격만 있고, 읽음 상태·접속 상태·유실 복구·도배 방지·인증 안전성이 비어있음. notification 모듈에서 이미 검증한 Outbox/Pub-Sub 패턴을 최대한 재사용한다.
📦 범위
읽음 확인 / 안읽은 개수
ChatRoomMember에 last_read_message_id 추가, 방별 안읽은 개수 조회 API, 읽음 처리 API. notification.NotificationRecipient 패턴 참고.
Presence + 타이핑 인디케이터
방 입장/퇴장, 타이핑 시작/중단을 기존 chat:{room_id} Redis 채널에 ephemeral 이벤트로 브로드캐스트. DB 저장 불필요. 메시지 프로토콜에 type 필드 구분 필요.
채팅 ↔ 알림 파이프라인 연동
DM 수신자가 해당 방에 미접속 상태면 NotificationEvents에 이벤트 추가해 알림 발행. 발신자 본인 제외, 접속 중이면 중복 알림 방지.
재연결 시 메시지 유실 방지 (Gap Recovery)
WebSocket 연결 시 last_message_id 쿼리 파라미터 지원 → 연결 직후 그 이후 메시지를 DB에서 채워 재전송. 재전송과 실시간 수신 순서 꼬임 방지 필요.
레이트 리밋 (도배 방지)
Redis 기반으로 회원당 초당/분당 메시지 전송 제한. 초과 시 저장 없이 에러 응답.
WebSocket 인증 방식 개선
토큰을 쿼리 파라미터(?token=)로 받는 현재 방식은 로그에 토큰이 남을 수 있음 → 헤더 기반(Sec-WebSocket-Protocol) 또는 단기 티켓 발급 방식으로 변경.
✅ 수용 기준 (Acceptance Criteria)
📝 참고 사항