Skip to content

Conversation

@loseminho
Copy link
Collaborator

@loseminho loseminho commented Oct 1, 2025

📌 개요

RoomMember 엔티티의 실시간 상태 필드를 제거한 후,
이번 PR에서는 Redis를 활용한 실시간 참가자 추적 하도록했습니다.

  • WebSocket 연결/해제, Heartbeat, 방 입장/퇴장을 Redis 기반으로 관리
  • API 응답에서도 Redis 기반 실시간 참가자 수 제공

🔨 작업 내용

1. Redis 실시간 상태 관리

  • 기존 구현 활용
    • RedisSessionStore: Redis CRUD 레이어
    • UserSessionService: WebSocket 세션 생명주기 관리
    • RoomParticipantService: 방별 참가자 관리
    • WebSocketEventListener: 연결/해제 이벤트 처리
    • WebSocketMessageController: Heartbeat, 방 입장/퇴장 처리

2. DB 업데이트 로직 제거 (총 6곳)

  • RoomService 수정 (임시로 주석 처리 했습니다! 활용 가능성이 있을 수 있어서)
    • createRoom(): incrementParticipant() 주석 처리
    • joinRoom(): incrementParticipant() 주석 처리 (2곳)
    • leaveRoom(): decrementParticipant() 주석 처리
    • handleHostLeaving(): decrementParticipant() 주석 처리 (2곳)
    • kickMember(): decrementParticipant() 주석 처리

➡️ DB와 Redis 간 동기화 문제 해결

3. 실시간 참가자 수 조회 구현

  • WebSocketSessionManager
    • getBulkRoomOnlineUserCounts(List<Long> roomIds) 추가 → N+1 방지
  • RoomService 헬퍼 메서드 추가
    • toRoomResponse(Room)
    • toRoomResponseList(List<Room>)
    • toRoomDetailResponse(Room, List<RoomMember>)
    • toMyRoomResponse(Room, RoomRole)
    • toMyRoomResponseList(List<Room>, Long)
  • DTO 시그니처 변경
    • RoomResponse.from(Room, long currentParticipants)
    • RoomDetailResponse.of(Room, long currentParticipants, List<RoomMemberResponse>)
    • MyRoomResponse.of(Room, long currentParticipants, RoomRole)

4. Controller 수정

  • 모든 엔드포인트에서 Service 헬퍼 메서드 사용
    • POST /api/roomstoRoomResponse()
    • GET /api/roomstoRoomResponseList()
    • GET /api/rooms/{roomId}toRoomDetailResponse()
    • GET /api/rooms/mytoMyRoomResponseList()
    • GET /api/rooms/populartoRoomResponseList()

5. 테스트 코드 수정

  • RoomControllerTest
    • 5개 테스트에 새로운 헬퍼 메서드 Mock 설정 추가
    • toRoomResponse(), toRoomResponseList(), toRoomDetailResponse(), toMyRoomResponseList() verify 추가

🔗 관련 이슈

Closes #144

📝 참고 사항

아키텍처 변경

Before (PR #1 이전)

  • DB에 모든 상태 저장
    • RoomMember.isOnline
    • Room.currentParticipants (부정확)

After (PR #2)

  • Redis: 실시간 상태 관리
    • ws:user:{userId}WebSocketSessionInfo (TTL 6분)
    • ws:session:{sessionId} → userId
    • ws:room:{roomId}:users → 참가자 Set
  • DB: 영구 멤버십 데이터만 저장
    • MEMBER 이상 역할만 저장
    • VISITOR는 Redis에서만 관리
    • Room.currentParticipants 필드 유지 (단, 업데이트 안 함)

성능 개선

  • N+1 문제 해결
    • getBulkRoomOnlineUserCounts() 도입
    • 방 20개 조회 시 → Redis 호출 20번 → 1번으로 최적화

Breaking Changes

  • API 응답 변경

    • currentParticipants → Redis 기반 실시간 값 반환
    • (기존 DB 값 0 → 실제 온라인 사용자 수)
  • Room.currentParticipants는 현재 업데이트하지 않는 상태인데 통계용 배치에 필요하면 활용하고, 없다면 완전 제거 하겠습니다

향후 작업 예정

  • VISITOR 사용자는 DB에서 저장 제외 로직 예정!!!
  • 방장 위임 로직 Redis 기반 전환
  • findOnlineMembersByRoomId 쿼리 Redis 조회로 대체
  • 프론트앤드 파트와 중간 연동하기 위한 준비

✅ 체크리스트

  • 기능 동작 확인
  • 테스트 코드 작성
  • 문서/주석 추가 및 최신화

@loseminho loseminho self-assigned this Oct 1, 2025
@github-actions github-actions bot changed the title Feat : RoomMember 엔티티 필드 제거 기반 redis 연동 Feat : RoomMember 엔티티 필드 제거 기반 redis 연동 (#144) Oct 1, 2025
@loseminho loseminho merged commit 629b4ca into dev Oct 2, 2025
2 checks passed
@github-actions github-actions bot deleted the feat/144 branch October 2, 2025 03:12
namgigun pushed a commit that referenced this pull request Oct 4, 2025
* refactor: RoomMember 엔티티에서 실시간 상태 필드 제거, redis로 이관

* feat:제거 기반 redis 연동 테스트 완료
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants