Files
sodalive-ios/docs/20260319_라이브룸채팅삭제기능구현계획.md

10 KiB

20260319_라이브룸채팅삭제기능구현계획.md

개요

  • 라이브룸 V2 채팅에서 방장(크리에이터)만 특정 채팅을 삭제할 수 있는 기능을 추가한다.
  • 삭제 대상 채팅을 길게 누르면 삭제 확인 알림창을 노출하고, 삭제 시 모든 참여자의 채팅 목록에서 해당 항목을 동시에 제거한다.
  • 유저 강퇴 시에는 확인 알림창 없이 즉시 해당 유저의 채팅을 일괄 삭제하고, 동일하게 모든 참여자에게 동기화한다.
  • 본 문서는 구현 전 상세 설계/영향 파일/검증 기준을 고정하기 위한 계획 문서다.

요구사항 해석(고정)

  • 채팅 삭제 권한: liveRoomInfo.creatorId == UserDefaults.int(forKey: .userId) 인 경우만 허용.
  • 롱프레스 대상: 일반 채팅(LiveRoomNormalChat) 버블.
  • 삭제 확인 알림창 표시 포맷: [닉네임]: [채팅 내용].
  • 알림창 버튼: 취소 / 삭제.
  • 삭제 전파 범위: 현재 룸의 모든 참여자 클라이언트.
  • 강퇴 연계: 강퇴 확정 시 해당 유저 채팅 일괄 삭제를 즉시 실행(추가 확인 알림창 없음).

설계 결정

1) 삭제 전파 채널

  • 채팅 삭제 동기화는 RTM group raw message(LiveRoomChatRawMessage)로 전파한다.
  • 강퇴는 기존처럼 peer KICK_OUT을 유지하되, 별도로 group 삭제 이벤트를 추가 전송한다.

2) 단건 채팅 식별자

  • 단건 삭제 정확도를 위해 일반 채팅 모델에 chatId를 추가한다.
  • 일반 채팅 송신은 텍스트 publish 경로 대신 raw message(type = NORMAL_CHAT)로 전환하여 chatId를 모든 클라이언트에 동일 전달한다.

3) 강퇴 시 일괄 삭제 기준

  • targetUserId 기준으로 메시지 배열에서 작성자 매칭 항목을 제거한다.
  • 기본 범위: 일반 채팅(userId) + 후원 채팅(memberId) + 룰렛 후원 채팅(작성자 식별 필드 추가 시 memberId).

완료 기준 (Acceptance Criteria)

  • AC1: 방장이 아닌 사용자는 채팅 롱프레스 시 삭제 액션이 노출되지 않는다.
  • AC2: 방장이 일반 채팅 롱프레스 시 삭제 알림창이 노출되고, 본문이 [닉네임]: [채팅 내용] 포맷으로 표시된다.
  • AC3: 삭제 알림창에서 취소 선택 시 채팅 목록 변경이 없다.
  • AC4: 삭제 알림창에서 삭제 선택 시 해당 채팅 1건이 로컬에서 즉시 제거되고, 같은 룸 모든 사용자 화면에서도 제거된다.
  • AC5: 강퇴 확정 시 대상 유저의 채팅이 확인 알림창 없이 즉시 일괄 제거된다.
  • AC6: 강퇴 일괄 삭제도 같은 룸 모든 사용자 화면에 동기화된다.
  • AC7: 기존 기능(채팅금지/채팅 얼림/스피커 초대/강퇴 팝업)은 회귀 없이 동작한다.

구현 체크리스트

A. 채팅 모델/이벤트 확장

  • SodaLive/Sources/Live/Room/Chat/LiveRoomChat.swift
    • LiveRoomNormalChatchatId 필드 추가.
    • 강퇴 일괄 삭제 범위를 위해 LiveRoomRouletteDonationChat 작성자 식별 필드(memberId) 추가 여부 확정 및 반영.
  • SodaLive/Sources/Live/Room/Chat/LiveRoomChatRawMessage.swift
  • LiveRoomChatRawMessageTypeNORMAL_CHAT, DELETE_CHAT, DELETE_CHAT_BY_USER 추가.
    • payload 필드(chatId, targetUserId)를 optional로 추가.

B. ViewModel 삭제 로직/동기화

  • SodaLive/Sources/Live/Room/LiveRoomViewModel.swift
    • 일반 채팅 송신을 raw NORMAL_CHAT 이벤트 기반으로 전환하고 로컬 append 시 chatId를 유지.
  • RTM 수신 분기에 NORMAL_CHAT, DELETE_CHAT, DELETE_CHAT_BY_USER 처리 분기 추가.
    • 방장 권한 가드가 포함된 deleteChat(_:)(단건) / deleteChatsByUserId(_:)(일괄) 메서드 추가.
    • 강퇴 성공 경로(kickOut())에 일괄 삭제 로컬 적용 + group 삭제 이벤트 브로드캐스트 추가.
    • 메시지 제거 후 invalidateChat() 호출 일관화.

C. UI 롱프레스/삭제 확인 알림창

  • SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomChatView.swift
    • 일반 채팅 항목 롱프레스 콜백 전달 구조 추가(onLongPressChat).
    • 방장 여부 인자(isCreator)를 받아 롱프레스 활성 조건 반영.
  • SodaLive/Sources/Live/Room/Chat/LiveRoomChatItemView.swift
    • 채팅 버블 영역에 롱프레스 제스처 추가.
    • 롱프레스 시 부모 콜백으로 LiveRoomNormalChat 전달.
  • SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift
    • 삭제 대상 채팅 상태(selectedChatForDelete)와 삭제 알림창 표시 상태 추가.
    • LiveRoomChatView 콜백 바인딩 및 방장 조건 연결.
    • SodaDialog로 삭제 확인 UI 추가(취소/삭제, 본문 [닉네임]: [채팅 내용]).
    • 삭제 확인 시 viewModel.deleteChat(...) 호출, 취소 시 상태 초기화.

D. 문구/국제화

  • SodaLive/Sources/I18n/I18n.swift
    • I18n.LiveRoom에 채팅 삭제 알림창 제목/실패 메시지(필요 시) 키 추가.
    • 버튼 라벨은 기존 I18n.Common.cancel, I18n.Common.delete 재사용.

영향 파일(예상)

필수

  • SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift
  • SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomChatView.swift
  • SodaLive/Sources/Live/Room/Chat/LiveRoomChatItemView.swift
  • SodaLive/Sources/Live/Room/LiveRoomViewModel.swift
  • SodaLive/Sources/Live/Room/Chat/LiveRoomChat.swift
  • SodaLive/Sources/Live/Room/Chat/LiveRoomChatRawMessage.swift
  • SodaLive/Sources/I18n/I18n.swift

리스크 및 대응

  • 단건 삭제 식별자 미도입 시 동일 문구 중복 채팅 오삭제 위험이 있어 chatId 도입을 필수로 둔다.
  • 일반 채팅 송신 경로를 raw로 전환하면 구버전 클라이언트 호환성 리스크가 있으므로 배포 시점 동기화가 필요하다.
  • 강퇴와 삭제 이벤트 전파 순서가 뒤섞일 수 있으므로 강퇴 성공 콜백에서 삭제 이벤트를 먼저 브로드캐스트하고 UI 종료 흐름을 유지한다.

검증 계획

  • 정적 진단: 수정 파일 lsp_diagnostics 확인.
  • 빌드:
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
  • 수동 QA 시나리오:
    • 방장/일반유저 2계정 접속 후 일반유저 채팅 롱프레스 삭제 전파 확인.
    • 일반유저 계정에서는 롱프레스 삭제 불가 확인.
    • 동일 유저 강퇴 시 채팅 일괄 삭제 즉시 전파 확인(알림창 미노출).

검증 기록

  • 2026-03-19 (계획 문서 초안)

    • 무엇/왜/어떻게: 라이브룸 채팅 삭제 기능 구현 전, 현재 iOS 코드 경로(채팅 렌더링/RTM 수신/강퇴 처리)를 조사해 영향 파일과 구현 단계를 문서화했다.
    • 실행 명령/도구:
      • read(LiveRoomViewV2.swift, LiveRoomViewModel.swift, LiveRoomChatView.swift, LiveRoomChatItemView.swift, LiveRoomChatRawMessage.swift, LiveApi.swift, LiveRepository.swift, I18n.swift 등)
      • grep("KICK_OUT|sendMessage|didReceiveMessageEvent|LiveRoomChatRawMessageType|onLongPressGesture", include:"*.swift")
      • glob("docs/*.md")
    • 결과:
      • 문서 파일 생성 완료.
      • 코드 구현/동작 변경은 아직 수행하지 않음.
  • 2026-03-19 (채팅 삭제 기능 구현)

  • 무엇/왜/어떻게: 계획 문서 기준으로 방장 전용 롱프레스 채팅 삭제, 삭제 확인 다이얼로그([닉네임]: [채팅 내용]), RTM 단건/일괄 삭제 전파(NORMAL_CHAT, DELETE_CHAT, DELETE_CHAT_BY_USER), 강퇴 시 채팅 즉시 일괄 삭제를 구현했다.

    • 실행 명령/도구:
      • lsp_diagnostics(LiveRoomChatRawMessage.swift, LiveRoomChat.swift, LiveRoomViewModel.swift, LiveRoomChatView.swift, LiveRoomChatItemView.swift, LiveRoomRouletteDonationChatItemView.swift, LiveRoomViewV2.swift, I18n.swift)
      • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build
      • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
      • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test
      • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test
  • grep("chatDeleteTitle|isShowChatDeleteDialog|deleteChat|NORMAL_CHAT|DELETE_CHAT|DELETE_CHAT_BY_USER|onLongPressChat", include:"*.swift")

    • 결과:
      • SodaLive, SodaLive-dev Debug 빌드 모두 ** BUILD SUCCEEDED ** 확인.
      • 두 스킴 모두 test action 미구성으로 자동 테스트 실행 불가(Scheme ... is not currently configured for the test action).
      • lsp_diagnostics는 단일 파일 분석 한계로 일부 false positive(No such module, scope)가 있었으나, 실제 컴파일 유효성은 xcodebuild 성공으로 검증했다.
      • CLI 환경 제약으로 2계정 실기기/시뮬레이터 상호작용 수동 QA는 후속 필요.
  • 2026-03-19 (Oracle 사후 점검 반영)

    • 무엇/왜/어떻게: Oracle 리뷰에서 식별된 정합성 리스크(구버전 text 메시지 삭제 동기화, 삭제 브로드캐스트 실패 시 불일치, 공백 메시지 송수신 조건 불일치)를 보완했다.
    • 실행 명령/도구:
      • task(subagent_type="oracle")
      • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build
      • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
      • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test
      • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test
    • 결과:
      • deleteChat(_:), deleteChatsByUserId(_:)에 RTM completion/fail 처리와 공통 오류 토스트 경로를 추가했다.
      • DELETE_CHAT 수신 시 chatId 미일치 상황을 대비해 (targetUserId + message) fallback 삭제를 추가했다.
      • sendMessage의 공백 메시지 판별을 송수신 동일 기준(trimmingCharacters)으로 맞췄다.
      • 보강 후 SodaLive, SodaLive-dev Debug 빌드 재성공 확인.
      • 테스트는 두 스킴 모두 test action 미구성으로 자동 실행 불가.