TEXT_CHAT_E2E_2026-05-25
- 상위 Task: VOICE_CHAT_ROOM_수다방
- 작성자: Codex PM
- 검증일: 2026-05-25
- 검증 환경: Flutter Web on Windows Chrome,
http://localhost:8101, APIhttps://api.playmmx.com - 비검증 환경: Android native, Windows desktop native, Agora voice
1. 검증 목적
수다방 중 음성 기능을 제외한 텍스트 채팅 MVP가 실제 Flutter 클라이언트와 운영 API 조합에서 동작하는지 확인한다.
2. 검증 결과 요약
통과:
- 방 목록 조회
- 기존 방 입장
- 공개 방 생성 및 생성자 자동 입장
- 비밀번호 방 생성 및 생성자 자동 입장
- 비밀번호 오답 차단
- 비밀번호 정답 입장
- 메시지 전송
- 양방향 메시지 동기화
- 재입장 후 기존 메시지 조회
발견 이슈:
TEXT_CHAT_UI_01: 내가 보낸 메시지가 왼쪽 정렬되어 상대 메시지와 구분이 약함.TEXT_CHAT_STATE_01: 브라우저 새로고침 시 초기 화면으로 돌아감.TEXT_CHAT_PARTICIPANT_02: 앱바 뒤로가기 사용 시 leave API가 호출되지 않아 인원 수가 감소하지 않음.TEXT_CHAT_LOBBY_SYNC_01: 한 세션 퇴장 후 다른 세션의 로비 인원 표시가 즉시 일치하지 않음.
3. 대표님과 진행한 수동 테스트 로그
Codex smoke room이 로비에 표시됨.- 기존 방 입장 성공.
- 시스템 메시지 표시 확인:
[codexsmoke]방 생성 메시지[마이닉]입장 메시지
테스트 메시지 1전송 성공.- 새로고침 시 초기 화면으로 돌아감.
- 같은 닉네임으로 재입장 시 기존 메시지 유지 확인.
- 두 번째 테스트 메시지 전송 성공.
- 앱 안 뒤로가기 후 로비 복귀 시 기존 방 인원이 줄지 않는 현상 확인.
테스트방-수동1생성 성공, 생성 후 자동 입장 확인.- 생성자 뒤로가기 후 로비에 방이 계속 보이고 인원이 유지되는 현상 확인.
테스트방-비번1생성 성공.- 다른 브라우저에서 닉네임
둘리로 로비 입장. - 비밀번호
1111오답 시 입장 차단 확인. - 비밀번호
0038정답 시 입장 성공, 인원2/8확인. 둘리 테스트메시지가 양쪽 브라우저에 동기화됨.둘리퇴장 후 로비 인원이 세션별로 다르게 보임.
4. 즉시 조치
2026-05-25 20:08 KST 기준 아래 패치를 진행했다.
- 방 화면의 앱바 뒤로가기 버튼이
leaveRoom을 호출하도록 변경. - 시스템/상대/내 메시지 스타일을 분리하고, 내 메시지를 오른쪽 정렬로 표시.
- 로비에 5초 자동 갱신을 추가해 다른 세션의 인원 변경을 주기적으로 반영.
5. 남은 확인
패치 후 재검증 필요:
- 앱바 뒤로가기 후 로비 인원이 감소하는지
- 생성자 퇴장 시 방 종료 정책에 따라 로비에서 방이 사라지는지
둘리퇴장 후 양쪽 로비 인원이 5초 안에 동일해지는지- 내가 보낸 메시지가 오른쪽 정렬로 표시되는지
아직 미검증:
- Android 실제 기기 실행
- Windows desktop native 실행
- 브라우저 새로고침 후 닉네임/방 복구
- Agora 음성
6. 자동 검증
2026-05-25 20:16 KST 기준 실행 결과:
/snap/bin/flutter analyze통과./snap/bin/flutter test통과, 14개 테스트 성공./home/sglee/.local/bin/uv run pytest tests -qAPI 기준 통과, 69개 테스트 성공, 1개 warning.
추가한 회귀 테스트:
flutter/mmx_player/test/voice_chat_room_screen_test.dart- 방 화면의 앱바 뒤로가기 버튼이
leaveRoom을 호출하고 로비로 복귀하는지 검증한다.
- 방 화면의 앱바 뒤로가기 버튼이
주의:
- 자동 테스트는 API mock/단위 검증과 Flutter widget 검증이다.
- 운영 API와 브라우저를 붙인 재수동 검증은 아직 다시 수행하지 않았다.
7. 자동 퇴장 보강
2026-05-25 추가 조치:
- 명시적 "방 나가기"와 앱바 뒤로가기는 HTTP
leaveRoom을 호출한다. - Flutter Web 탭 닫기/새로고침은
pagehide,beforeunload이벤트에서navigator.sendBeacon으로 leave API를 호출한다. - Native app 종료는 lifecycle
detached에서 best-effort leave를 호출한다.
검증:
/snap/bin/flutter analyze통과./snap/bin/flutter test통과, 14개 테스트 성공./snap/bin/flutter build web통과.
주의:
- 탭 닫기/앱 종료 시 네트워크 전송은 브라우저/OS가 중단할 수 있다.
- 따라서 이 패치는 즉시 가능한 best-effort 보강이며, 완전한 presence 정합성은 heartbeat/TTL 설계로 닫아야 한다.