Files
sodalive-ios/docs/20261028_마이_탭_공지사항_롤링/prd.md
T

7.1 KiB

마이 탭 최신 공지사항 롤링

문서 정보

항목 내용
문서 상태 사용자 계약·정상 동작 확인 / 제목 전용 롤링 보완 완료
작성일 / 최종 수정일 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. 성공 기준

  • 목 응답 0/1/2/3개와 순환·선택 payload·전체 본문·날짜를 검증했다. 실제 물리 탭은 별도 미검증이다.
  • 공통 nullable 필드 누락/null, 오류 및 배열 축소를 검증했다.
  • 제목 확장·화살표 유지·생명주기를 실제 소스 기반 native 하네스에서 확인했다.
  • 두 스킴 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에 누적한다.