2.9 KiB
2.9 KiB
관리자 콘텐츠 배너 예약 리뷰
리뷰 정보
| 항목 | 내용 |
|---|---|
| 대상 | P1-T1, P1-T1-R1의 working tree 변경 |
| 일자 | 2026-10-27 |
| 리뷰어 | 독립 scoped reviewer, parent 실행 검증 |
| 기준 | ../prd.md SCH-001~005, ../plan-task.md |
| 상태 | 수정 검증 완료 |
범위와 근거
- 관리자 create/update/list, nullable entity 시각, KST/UTC 변환, MySQL DDL 및 실제 HTTP/DB 테스트를 검토했다.
AdminContentBannerService.kt,GetAdminContentBannerResponse.kt,AdminContentBannerRepository.kt및 요청 DTO와 entity의 변경을 확인했다.AdminContentBannerControllerIntegrationTest.kt의 multipart POST/PUT/GET, H2TIMESTAMP(0)별도 트랜잭션 재조회 및 S3 미호출 assertion을 확인했다.- 공개 기간 필터는 다음 P1-T2 범위이므로 이 리뷰에서 판정하지 않았다. 운영 MySQL과 JDBC/session timezone은 검증하지 않았다.
발견 사항
| ID | 심각도 | 상태 | 내용 | 후속 Goal |
|---|---|---|---|---|
| REV-ADMIN-001 | Medium | 수정 완료 | 예약 필드에 JSON 객체/배열이 오면 DTO 매핑 단계에서 실패해 common.error.unknown으로 반환됨 |
P1-T1-R1 |
REV-ADMIN-001
- 관찰:
startDate: {}또는endDate: []에서 Jackson 매핑 예외가 날짜 검증 전에 발생했고, 일반 예외 처리기가 예약 오류 계약과 다른 결과를 반환했다. - 재현: create/update × start/end × 객체/배열의 HTTP 사례 8개를 추가했다. 실제 RED에서 기존 64건은 통과하고 신규 8건만 실패했다.
- 조치: 같은 JSON 트리에서 두 예약 필드의 타입을 DTO 변환 전에 검사한다. 문자열/null/생략만 허용하며 다른 필드의 기존 매핑 계약이나 전역 예외 처리는 바꾸지 않았다.
- 검증: 오류 키
common.error.invalid_request, S3 미호출, 생성 미저장 및 수정 전후 DB row 일치를 확인했다. 기존 생략/null·시간대·관리자 목록 테스트도 유지했다.
실행 증거
./gradlew test --rerun --tests '*AdminContentBannerControllerIntegrationTest' --tests '*AdminContentBannerServiceTest' --tests '*AudioContentBannerRepositoryTest' --console=plain
parent가 위 명령을 실행해 exit 0, BUILD SUCCESSFUL in 36s를 확인했다. XML 집계는 통합 72 + 기존 서비스 1 + 공개 repository 1 = 74건이며 failures/errors/skipped는 모두 0이다. 구현자의 ktlintCheck tasks --all도 exit 0이다. LSP 도구가 없어 Kotlin 컴파일/ktlint를 사용했다.
종료 판정
- 최초 발견 사항은 기존 완료 이력을 되돌리지 않고 P1-T1-R1로 누적했다.
- scoped 재검토 결과 REV-ADMIN-001은 ADDRESSED, 명세 준수와 코드 품질 모두 APPROVE다. 수정 범위의 새 actionable finding은 없다.
- 관리자 기능의 미해결 finding은 없다. P1-T2와 최종 Gate는 별도로 수행한다.