Skip to content

[FEAT] 채팅 기능 개선 #19

Description

@KIMB0B

📌 개요

채팅 모듈에 부족한 실사용 기능들을 한 번에 개선한다. 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)

  • 각 하위 작업이 기존 채팅 REST/WebSocket API와 하위 호환되게 동작 (기존 클라이언트 흐름 깨지지 않음)
  • 항목별로 관련 unit/integration 테스트 포함
  • 멀티 인스턴스(Redis Pub/Sub) 환경 전제 유지 — 로컬 메모리에만 의존하는 상태 추가 금지

📝 참고 사항

  • 순서 권장: 1(읽음) → 2(Presence, 3의 미접속 판단에 필요) → 3(알림연동) → 4(재연결복구) → 6(레이트리밋) → 7(인증개선)은 언제 껴도 무방(독립적)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions