5.4 KiB
5.4 KiB
유저-크리에이터 채팅 다중행 입력 PRD
문서 정보
| 항목 | 내용 |
|---|---|
| 상태 | 구현·네이티브 하네스 검증 완료 / 실제 DM 통합 QA 미실행 |
| 작성일 | 2026-10-16 |
| 대상 | iOS 유저-크리에이터 DM 입력창 |
| 결정권자 | 사용자, 조사 결과에 대한 진행하자 승인 |
| 계획 | plan-task.md |
| 리뷰 | phase1-multiline-input.md |
| API 계약 | 기존 SEND_TEXT/textMessage 문자열 유지, 별도 변경 없음 |
1. 개요와 문제
현재 DM 입력창은 단일 행 TextField라 긴 메시지를 작성하며 앞뒤 문맥을 확인하기 어렵다. 입력창은 한 줄에서 시작해 최대 세 줄까지 확장되고, 그 이상은 입력창 안에서 스크롤해 확인할 수 있어야 한다.
2. 목표와 제외 범위
- 목표: 내용 손실 없이 최대 세 줄 표시, 초과 내용 스크롤, Return 줄바꿈, 기존 전송 버튼 사용.
- 제외: AI 채팅·커뮤니티 입력 변경, 글자 수 제한 추가, ViewModel/서버/DTO 변경, 새로운 공용 컴포넌트나 UIKit 래퍼, 날짜 구분선 변경.
- 현재 브랜치
main을 유지한다. 별도 브랜치·worktree·원격 push는 만들지 않는다.
3. 사용자 흐름과 요구사항
| ID | 상태 | 요구사항 | 수용 기준 | 연결 |
|---|---|---|---|---|
| INPUT-001 | 확정 | 입력 내용에 따라 1~3줄 높이로 자동 확장 | 1/2/3줄에서 높이가 증가하고 4줄 이상은 더 커지지 않음 | P1-T1 |
| INPUT-002 | 확정 | 세 줄 초과 내용은 내부 세로 스크롤 | 긴 내용이 잘리거나 전송 데이터에서 제거되지 않고 앞뒤 확인 가능 | P1-T1 |
| INPUT-003 | 확정 | Return은 줄바꿈, 전송은 기존 버튼 | Return으로 자동 전송하지 않으며 버튼 전송 후 입력이 비워짐 | P1-T1 |
| INPUT-004 | 확정 | 기존 전송 가드와 문자열 처리를 유지 | 미연결 상태 입력 금지, 공백·줄바꿈만 있는 메시지 전송 금지, 본문 중간 줄바꿈 보존 | P1-T1 |
| INPUT-005 | 확정 | 다중행에 맞춘 전송 버튼 하단 정렬 | 1~3줄 변화 시 버튼이 입력 영역 하단에 정렬되고 모서리가 글자를 가리지 않음 | P1-T1, P1-GATE |
4. 기술·UX 제약
- 대상:
SodaLive/Sources/V2/Main/Chat/UserCreatorChat/UserCreatorChatRoomView.swift의 inputBarView. - 기존 커뮤니티 입력 패턴처럼
TextField(..., axis: .vertical).lineLimit(1...3)사용. 최소 iOS16.6에서 지원되는 iOS16 API다. - 별도 ScrollView, 문자 수 기준 높이 계산 또는 TextEditor로 교체하지 않는다. 스크롤 인디케이터는 시스템 동작을 사용하며 항상 표시되는 커스텀 바는 추가하지 않는다.
- 전송 전 양끝 공백·줄바꿈 제거, 전송 시 키보드 닫기와 입력 비우기는 변경하지 않는다.
- 기존 색상·14pt 글꼴·간격을 유지한다. 모서리는 다중행 글자 보호를 위해 필요하면 기존 커뮤니티의 고정 rounded-rectangle 반경20 패턴을 적용한다(구현 판단).
- 입력 높이 증가에 따른 대화 영역 축소는 기존 VStack 배치를 따르며, 메시지 목록 스크롤 정책을 새로 설계하지 않는다.
5. 성공 기준
- 한 줄에서 세 줄까지 확장, 초과 내용 내부 스크롤을 네이티브 UI로 확인했다. 내부 스크롤은 native contentOffset 조작으로 검증했다.
- 실제 키보드/IME·클립보드 붙여넣기 및 터치 기반 전송·스크롤을 실제 DM에서 확인한다. native Return·삭제·비우기와 긴 문자열 상태 주입은 하네스에서 통과했다.
- 기존 전송 버튼의 action과 입력 가능 조건을 보존하고 빌드·회귀 검사가 통과했다. 실제 전송 버튼 탭 검증과 구별한다.
- 네이티브 하네스 검증과 실제 로그인 DM 검증의 범위를 구분해 기록했다.
6. 열린 질문과 외부 조건
제품 결정의 열린 질문은 없다. 서버의 줄바꿈 저장·재조회 보존 및 실제 채팅방에서의 키보드/목록 상호작용은 승인된 테스트 계정·roomId가 필요한 외부 검증이다. 클라이언트 JSON 인코딩만으로 서버 통과를 주장하지 않는다.
7. Decision Log
| ID | 결정 | 근거 |
|---|---|---|
| DEC-001 | 조사 단계는 읽기 전용, 후속 진행하자부터 구현 |
사용자 승인 전 구현 금지 및 후속 승인 |
| DEC-002 | 1~3줄·내부 스크롤·Return 줄바꿈·버튼 전송·하단 정렬 | 직전 조사 제안에 대한 사용자 승인 |
| DEC-003 | 현재 main 유지, 제품 소스 한 파일의 최소 변경 | 사용자 현재 브랜치 작업 지시 및 기존 native 패턴 |
8. 구현·검증 기록
- 제품 변경: inputBarView4줄 추가/4줄 삭제, commit
14b415e. 서버·ViewModel·날짜 목록·전송 handler는 변경하지 않았다. - 입력 높이1/2/3/4/8줄:17/34/50/50/50pt. 8줄 content134pt, 내부 offset0→84pt에서 전체 문자열 보존. Return은 줄바꿈만 넣고 삭제·초기화 후17pt로 축소됐다.
- 최종 두 타깃 빌드와 기존12개 검사 스크립트/19회 실행 통과. 별도 신규 비즈니스 로직 테스트를 만들지 않았으며 native 동작·소스22검사 + PNG44검사로 증거를 검증했다.
- 독립 코드 APPROVE, 최종 입력 캡처22장 시각 PASS. 실제 DM·서버·IME·터치·키보드/목록 연동 검증으로 확대하지 않는다.