docs(mypage): 공지 롤링 요구사항과 검증을 기록한다

This commit is contained in:
Yu Sung
2026-10-28 17:15:48 +09:00
parent 42bdfb8779
commit e0e59e5acf
2 changed files with 323 additions and 0 deletions
@@ -0,0 +1,126 @@
# 마이 탭 최신 공지사항 롤링
## 문서 정보
| 항목 | 내용 |
|---|---|
| 문서 상태 | 사용자 계약·정상 동작 확인 / 제목 전용 롤링 보완 완료 |
| 작성일 / 최종 수정일 | 2026-10-28 |
| 대상 제품 | SodaLive iOS 메인 마이 탭 상단 공지 |
| 작성자·결정권자 | 에이전트 / 사용자 |
| 관련 API Contract | 이 문서 §11, 사용자 제공 계약 |
| 관련 구현 계획 | `plan-task.md` |
| 관련 review | `reviews/phase1-my-page-notices.md` |
## 1. Overview
마이 탭 상단에서 서버가 반환한 최신 공지 최대 3개를 순서대로 보여준다. 기존 상세 화면과 본문 표시를 재사용하고 제목을 읽을 수 있는 폭을 넓힌다.
## 2. Problem Statement
현재 단일 공지만 표시하며 우측 `자세히` 문구가 제목 폭을 차지한다. 배열 응답에 맞게 상태와 표시를 변경해야 한다.
## 3. Goals
- 0개는 숨김, 1개는 고정, 2~3개는 자동 순환한다.
- 현재 보이는 공지를 누르면 해당 제목·본문·날짜의 기존 상세 화면으로 이동한다.
- 제목·화살표 외 별도 표시나 조작 UI를 추가하지 않는다.
## 4. Non-Goals
- 서버 구현·배포·서버 구형 endpoint 삭제, 홈 응답/화면 변경.
- 페이지네이션, 개수 파라미터, 수동 스와이프·페이지 표시기, 주기적 API 재조회.
- 공통 인증 플러그인 변경, 새 의존성, 관련 없는 리팩터링.
## 5. Target Users and Permissions
로그인 여부와 무관하게 마이 탭을 방문하는 iOS 사용자. 신규 GET은 인증 불필요이며 본문·query parameter가 없다.
## 6. 핵심 사용자 흐름
1. 마이 탭 진입 시 최신 공지 배열을 조회한다.
2. 첫 항목부터 표시하고 2개 이상이면 5초마다 다음 항목으로 순환한다.
3. 공지를 누르면 기존 `.noticeDetail(notice:)`로 이동한다.
4. 화면 이탈·앱 비활성화 시 롤링을 중지한다. 데이터 변경 시 첫 항목으로 초기화한다.
## 7. 정보 구조와 라우팅
`MainView(.my) → MyPageView → UpdateBannerView → AppStep.noticeDetail → NoticeDetailView`를 유지한다.
## 8. 기능 요구사항
| ID | 상태 | 요구사항 | 수용 기준 | Goal |
|---|---|---|---|---|
| NOTICE-001 | 확정 | 신규 v2 배열 조회 | 정확한 GET 경로, body/query 없음, 배열 순서 유지 | P1-T1 |
| NOTICE-002 | 확정 | 개수별 표시 | 0 숨김, 1 고정, 2/3 순환과 마지막→첫 항목 | P1-T1 |
| NOTICE-003 | 확정 | 제목 폭 확보 | 자세히 제거, 화살표 유지, 긴 제목 겹침 없음 | P1-T1 |
| NOTICE-004 | 확정 | 기존 상세 재사용 | 각 항목의 전체 본문과 date 문자열 그대로 전달 | P1-T1 |
| NOTICE-005 | 확정 | 기존 상태·인접 기능 보존 | 실패 시 기존 공지 유지, 빈 배열은 숨김, 목록·홈 변경 없음 | P1-GATE |
| NOTICE-006 | 확정 | 구형 호출 제거 | 미사용 `/notice/latest` 클라이언트 API 제거 | P1-T1 |
## 9. 반응형 기능 범위
기존 iPhone 화면 폭과 글꼴·색상·여백을 유지한다. 긴 제목은 화살표와 겹치지 않게 표시한다.
## 10. UI/UX Expectations
- 기존 배너 스타일을 재사용하며 우측 문구가 차지하던 폭을 제목에 제공한다.
- 5초 간격은 기존 `V2/Component/Banner/BannerCarousel.swift`의 관례를 따른 구현 선택이다.
- 짧은 세로 전환으로 순환하며 동작 줄이기 설정에서는 위치 이동을 피한다.
- 화살표와 배너 버튼은 고정하고 제목만 세로 전환한다. 기존 간격·상세 이동·클릭 영역은 유지한다.
- 기존 로딩·오류 정책을 유지한다. 오류를 빈 배열로 오인하지 않는다.
## 11. API 계약
| 항목 | 계약 |
|---|---|
| 요청 | `GET /api/v2/notices/latest`, body/query 없음, 비로그인 허용 |
| 성공 | HTTP 200, `success=true`, `data: [공지]` |
| 개수 / 순서 | 활성 공지 id 내림차순 최대 3개, 클라이언트 재정렬 없음 |
| 공지 필드 | `id`: Long 정수, `title`: String, `content`: 전체 본문 String, `date`: `yyyy-MM-dd` String |
| 날짜 | Asia/Seoul 날짜 문자열을 그대로 전달, 시간대 변환 없음 |
| 공통 필드 | `message`, `errorProperty`는 nullable이며 JSON 포함 여부에 의존하지 않음 |
| 빈 결과 | `data=[]` |
| 유지 | 기존 `/notice` 목록, 기존 홈의 `latestNotice` 계약 |
## 12. 보안과 데이터 취급
공개 최신 공지 요청에 인증을 요구하지 않는다. 토큰·실서비스 본문을 문서나 목 데이터에 기록하지 않는다. 기존 HTML 표시 방식을 변경하지 않는다.
## 13. 성능과 품질 요구사항
iOS 16.6 이상과 기존 SwiftUI/Combine/Moya 구조를 유지한다. 테스트는 기존 `work/tests`의 독립 Swift 드라이버 패턴을 따른다. 앱 소스에 테스트 전용 mock 또는 자동 fallback을 추가하지 않는다.
## 14. 성공 기준
- [x] 목 응답 0/1/2/3개와 순환·선택 payload·전체 본문·날짜를 검증했다. 실제 물리 탭은 별도 미검증이다.
- [x] 공통 nullable 필드 누락/null, 오류 및 배열 축소를 검증했다.
- [x] 제목 확장·화살표 유지·생명주기를 실제 소스 기반 native 하네스에서 확인했다.
- [x] 두 스킴 iOS/Simulator 빌드·전체 13개 회귀 검사·리뷰 APPROVE를 계획 문서에 기록했다.
## 15. Open Questions
제품 구현을 막는 미결 사항 없음. 다음 외부 사항은 실서버 완료로 간주하지 않는다.
| ID | 상태 | 확인 사항 | 담당 / 시점 |
|---|---|---|---|
| EXT-001 | 사용자 확인 완료 | 사용자가 계약 및 정상 동작 확인을 전달함. 환경별 세부 결과를 에이전트가 별도 재측정한 것은 아님 | 2026-10-28 후속 사용자 메시지 |
| EXT-002 | 외부 의존 | 구형 서버 API 삭제는 다른 앱·배포 버전의 사용 여부까지 확인 필요 | 서버 담당 / endpoint 제거 전 |
## 16. 요구사항 추적표
NOTICE-001~006 → §11 → `plan-task.md` Phase 1 → 목 드라이버 / 네이티브 QA / 리뷰.
## 17. Decision Log
| 날짜 | ID | 상태 | 결정 | 근거 |
|---|---|---|---|---|
| 2026-10-28 | DEC-001 | 확정 | 요청 범위만 구현하고 질문 대신 조사 결과와 최소 해석으로 진행 | 사용자 ulw 지시 |
| 2026-10-28 | DEC-002 | 확정 | 5초 간격, 화면·앱 활성 시만 롤링 | 기존 V2 배너 간격 및 생명주기 |
| 2026-10-28 | DEC-003 | 확정 | 구형 API 제거는 이 저장소의 미사용 클라이언트 선언에 한정 | 서버/이전 앱 사용 여부는 이 저장소에서 보증 불가 |
| 2026-10-28 | DEC-004 | 확정 | 제공 계약으로 클라이언트 구현하되 실서버 통합은 미완료로 구분 | 테스트 서버 신규 경로 무인증 GET 결과 HTTP 401, 자동 구형 fallback 금지 |
| 2026-10-28 | DEC-005 | 정정 | 기존 서버 확인 대기는 사용자 확인으로 해소. 롤링 정상 동작 확인 후 화살표 고정·제목만 롤링하도록 보완 | 사용자 후속 요청, P1-T2 |
## 18. 변경 관리
후속 결정·검증은 기존 기록을 유지하며 이 PRD와 `plan-task.md`에 누적한다.