diff --git a/docs/20260610_DM_채팅화면/plan-task.md b/docs/20260610_DM_채팅화면/plan-task.md index e294560a..0499b069 100644 --- a/docs/20260610_DM_채팅화면/plan-task.md +++ b/docs/20260610_DM_채팅화면/plan-task.md @@ -604,10 +604,11 @@ - `OpenRoom` 성공 전에는 WebSocket 연결을 시작하지 않는다. - `roomOpenedEventLiveData` 또는 동등한 단발 이벤트는 Activity가 WebSocket 연결 시작을 트리거하는 용도로 유지한다. - 기존 SSE `connected` callback 기준 상태 갱신을 제거하고, WebSocket `JOINED` 수신 시점에만 실시간 수신 가능 상태로 판단한다. + - Phase 9 코드 리뷰 반영: socket 연결 시도 직후 `isRealtimeConnected=true`로 확정하지 않고, 연결 시도 상태와 `JOINED` 완료 상태를 분리한다. - 같은 `roomId`로 이미 연결 중이면 중복 socket 연결과 중복 `JOIN_ROOM` 전송을 막는다. - 검증: - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.dm.DmChatRoomViewModelTest" --max-workers=1` - - Expected: OpenRoom 전 미연결, OpenRoom 후 connect + `JOIN_ROOM`, `JOINED` 후 connected 상태, 중복 connect 방지 테스트가 PASS. + - Expected: OpenRoom 전 미연결, OpenRoom 후 connect + `JOIN_ROOM`, `JOINED` 전 connected 미확정, `JOINED` 후 connected 상태, 중복 connect 방지 테스트가 PASS. - [ ] **Task 10.2: MESSAGE 수신 반영으로 교체** - Files: @@ -631,6 +632,8 @@ - 작업: - `sendText(text)`는 trim 후 blank면 종료한다. - 전송 시 `requestId`를 생성하고 local pending item에 보존한다. + - Phase 9 코드 리뷰 반영: 단일 `isSending` 전역 제한을 제거하고, 서로 다른 텍스트 메시지는 각각의 `requestId`로 독립 pending 상태를 가질 수 있게 한다. + - pending 상태는 `requestId` 기준 map 또는 동등하게 검증 가능한 구조로 관리한다. - REST `repository.sendTextMessage()` 호출을 제거하고 WebSocket `SEND_TEXT`를 전송한다. - `SEND_ACK` 수신 시 `requestId`로 pending item을 찾아 서버 `messageId`, `createdAt`, `senderNickname`, `senderProfileImageUrl` 기준으로 확정한다. - `ERROR` 또는 timeout 시 해당 pending item을 `FAILED`로 전환한다. @@ -638,7 +641,7 @@ - 같은 `requestId`의 `SEND_ACK`가 중복 수신되면 첫 번째 확정 결과만 반영한다. - 검증: - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.dm.DmChatRoomViewModelTest" --max-workers=1` - - Expected: blank 무시, pending 추가, `SEND_TEXT` 송신, `SEND_ACK` requestId 매칭, `ERROR` 실패, timeout 실패, retry 새 requestId, 중복 ack 무시 테스트가 PASS. + - Expected: blank 무시, pending 추가, 서로 다른 텍스트의 독립 pending, `SEND_TEXT` 송신, `SEND_ACK` requestId 매칭, `ERROR` 실패, timeout 실패, retry 새 requestId, 중복 ack 무시 테스트가 PASS. - [ ] **Task 10.4: SEND_ACK보다 MESSAGE가 먼저 도착하는 race 처리** - Files: @@ -653,6 +656,19 @@ - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.dm.DmChatRoomViewModelTest" --max-workers=1` - Expected: MESSAGE 선도착, ACK 후도착, timeout 후 ACK 복구, 중복 `messageId` 방지 테스트가 PASS. +- [ ] **Task 10.5: Phase 9 코드 리뷰 결과 회귀 테스트 반영** + - Files: + - Modify: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/chat/dm/DmChatRoomViewModelTest.kt` + - Modify: `docs/20260610_DM_채팅화면/plan-task.md` + - 작업: + - Task 10.1 검증에 `JOINED` 전 connected 미확정 테스트를 추가했는지 확인한다. + - Task 10.3 검증에 서로 다른 텍스트 메시지의 독립 pending 테스트를 추가했는지 확인한다. + - Phase 9 코드 리뷰에서 지적된 부정확한 leave 중복 테스트는 실제 연결 없는 `closeCount == 0` 검증으로 유지하지 않는다. + - `LEAVE_ROOM + close`의 상세 lifecycle 동작 검증은 기존 범위대로 Task 11.1에서 수행하되, Phase 10 완료 시 해당 테스트 gap이 남아 있음을 문서에 명확히 남긴다. + - 검증: + - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.dm.DmChatRoomViewModelTest" --max-workers=1` + - Expected: Phase 9 리뷰 3개 항목 중 ViewModel 세션/전송 항목은 Phase 10 테스트로 고정되고, leave/close 항목은 부정확한 테스트 제거 또는 Task 11.1 이관 기록으로 남는다. + ### Phase 11: Lifecycle, reconnect, heartbeat, token 갱신 처리 - [ ] **Task 11.1: LEAVE_ROOM 후 socket close로 lifecycle 해제 전환**