# 최근 공지사항 v2 PRD ## 문서 정보 | 항목 | 내용 | |---|---| | 상태 | 구현·HTTP 15개·패키징·lint 검증 완료, 전체 회귀 시간 초과로 최종 Gate 미완료, 미배포 | | 작성일 | 2026-10-28 | | 결정권자 | 요청 사용자 | | 계약 | [api-contract.md](api-contract.md) | | 구현 계획 | [plan-task.md](plan-task.md) | | 클라이언트 전달 | [client-prompt.md](client-prompt.md) | ## 목표와 문제 기존 `/notice/latest`는 공지 하나 또는 null을 반환한다. 이 계약과 홈 응답을 유지하면서 클라이언트가 최근 활성 공지 최대 3개를 익명으로 조회할 수 있는 별도 API를 제공한다. 최신은 작성 시각이 아니라 기존 공지 정책인 id 내림차순이다. ## 확정 요구사항과 수용 기준 | ID | 요구사항 | 수용 기준 | 추적 | |---|---|---|---| | NOTICE-001 | 익명 `GET /api/v2/notices/latest` | HTTP 200, `ApiResponse>` | 계약 §1, P1-T1 | | NOTICE-002 | 활성 공지 중 id 내림차순 최대 3개 | 활성 4개 이상과 더 큰 비활성 id fixture에서 정확한 3개 반환, createdAt 정렬 금지 | 계약 §2, P1-T1 | | NOTICE-003 | 기존 필드와 날짜 보존 | id/title/content/date 전체 일치, 본문 생략 없음, UTC→Asia/Seoul `yyyy-MM-dd` 날짜 경계 검증 | 계약 §2, P1-T1 | | NOTICE-004 | 적은 데이터도 배열 | 0/1/2개 및 전부 비활성 시 각각 0/1/2개와 빈 배열 | 계약 §3, P1-T1 | | NOTICE-005 | 기존 동작·권한 보존 | v1 객체/null 유지, 익명 POST와 인접 보호 경로는 401 | 계약 §4, P1-T1 | ## 구현 제약과 제외 - Kotlin 1.6.21, Java 17, Spring Boot 2.7.14 및 기존 의존성을 사용한다. - 신규 v2 controller와 읽기 전용 service가 기존 `ServiceServiceNoticeRepository.getNoticeList(PageRequest.of(0, 3))`를 호출한다. 기존 `NoticeItem`과 `ApiResponse`를 재사용한다. - 공개 보안 허용은 정확히 새 GET 한 경로만 추가한다. 공지 본문은 기존 활성 공지의 공개 데이터이며 새 사용자·인증 데이터는 취급하지 않는다. - v1 공지 함수, 홈 응답, 기존 repository 쿼리, DB 스키마, 공통 JSON·오류 정책과 의존성은 변경하지 않는다. - UI·캐러셀·자동 fallback·캐시·페이지네이션·신규 DTO·port·범용 facade·배포는 제외한다. ## 검증과 배포 상태 실제 SecurityConfig, RANDOM_PORT HTTP 서버, TestRestTemplate, 실제 repository, 로컬 H2와 embedded Redis로 통합 검증한다. 새 구현 클래스 참조 없이 HTTP로 먼저 실패를 확인한다. H2는 기존 MySQL 날짜 함수 alias로 쿼리를 실행하며 운영 MySQL 실검증은 별도다. 공지 HTTP 11개와 기존 배포 엔드포인트 HTTP 4개가 통과했고, `bootJar`와 전체 `ktlintCheck`가 성공했다. 전체 `build --continue`는 test 단계에서 20분 제한으로 종료되어 전체 회귀는 미검증이다. 최종 Gate 상태와 독립 리뷰는 구현 계획에 기록한다. 구현·로컬 검증은 배포 완료를 뜻하지 않으며 클라이언트는 배포 확인 전 명시적 mock을 사용한다. ## Decision Log | 날짜 | ID | 결정 | 근거 | |---|---|---|---| | 2026-10-28 | NOTICE-D1 | 기존 목록 쿼리를 page 0/size 3으로 호출 | 기존 쿼리에 활성 필터·id 역순·offset/limit·날짜 projection이 존재 | | 2026-10-28 | NOTICE-D2 | 기존 v1과 홈은 전혀 수정하지 않음 | 사용자 승인 범위 및 객체/null 호환성 | | 2026-10-28 | NOTICE-D3 | 전체 Gate는 부모 실행자가 수행 | 명시적 작업 분담, 이 작업은 focused HTTP 검증까지만 수행 |