## ✨ Description Dashboard와 Records 화면에서 사용할 읽기 전용 조회 API를 구현합니다. 기존 Paycheck·TaxCheck·ExitCheck 저장 데이터를 집계하며, 별도 결과 테이블이나 인증·공통 사용자 정책은 추가하지 않습니다. - 담당: 박시현 (@foxihyun) - 작업 브랜치: `feature/dashboard-records` - 현재 진행 상태: 로컬 구현·테스트·스테이징 완료. 커밋·푸시·PR 생성 및 팀 리뷰는 남아 있습니다. - TaxCheck 이슈 #5 / PR #7과 별도 작업입니다. ## 📌 구현 내용 ### Dashboard - [x] `GET /api/dashboard?year=2026` 구현 - [x] 요청 연도의 Paycheck 실제 입금액(`actual_amount`)만 집계 - [x] 급여 기록 개월 수, 금액이 확인된 개월 수, 금액 미확인 기간 제공 - [x] 기록 없음·금액 미확인(`null`)과 확인된 0원 구분 - [x] 유형별 최신 기록 및 전체 최근 기록 3건 제공 - [x] 연도 필터는 급여 합계에만 적용하고, 최신 기록은 전체 연도 기준으로 조회 - [x] BigDecimal 사용, 총급여 대체·연간 금액 추정·세금 재계산 없음 ### Records - [x] `GET /api/records` 통합 기록 조회 구현 - [x] 선택적 `type=PAYCHECK|TAX_CHECK|EXIT_CHECK` 필터 지원 - [x] 유형 필터와 무관한 전체·유형별 건수 제공 - [x] `TYPE:id` 기록 키로 서로 다른 테이블의 ID 충돌 방지 - [x] 분석 시각(없으면 생성 시각) 기준 정렬 및 동률 정렬 규칙 적용 - [x] 실제 저장된 결과만 조회하며, 저장하지 않는 시뮬레이션 결과는 제외 ### 구조·예외·문서 - [x] `domain/overview`에 Controller·Service·Repository·DTO·Rule 분리 - [x] 기존 DataSource/JdbcTemplate 기반 읽기 전용 projection 사용 - [x] 미병합 TaxCheck·ExitCheck Java 엔티티에 대한 컴파일 의존 없이 구현 - [x] 공통 ApiResponse, 입력 검증, 사용자 없음 처리, 조회 응답 `Cache-Control: no-store` 적용 - [x] 조회 실패·원본 데이터 오류를 정상적인 빈 결과나 0원으로 숨기지 않음 - [x] API 명세 및 `docs/DASHBOARD_RECORDS_IMPLEMENTATION.md` 작성 - [x] 신규 테이블·운영 DDL·기록 삭제·기존 분석 결과 수정 없음 ## 🧪 검증 결과 - [x] 규칙 테스트, Service 테스트, Dashboard/Records API 통합 테스트 작성 - [x] 개발자 로컬에서 `.\gradlew.bat test --console=plain` 실행 성공 - 2026-09-02 09:55 KST 사용자 제공 실행 로그 - `BUILD SUCCESSFUL in 2m 37s` - compileJava·compileTestJava·test 실행 확인 - [x] 스테이징 범위 확인: 16 files changed, 1013 insertions(+) - [x] `git diff --cached --check` 오류 없음 - [x] .gradle·.idea 및 전달용 .patch 파일이 스테이징 범위에서 제외됨 구현 문서의 패키지 제작 환경에서 Gradle을 실행하지 못했다는 설명은 제작 당시 기록입니다. 이후 위 사용자 로컬 환경에서 전체 테스트 실행 성공을 확인했습니다. 이 결과는 GitHub CI 또는 실제 MySQL·프론트 연동 검증 완료를 뜻하지 않습니다. ## ⏳ 남은 작업 / 완료 조건 - [ ] 본 이슈 번호를 포함한 커밋 및 원격 브랜치 푸시 - [ ] `dev` 대상 별도 PR 생성 - [ ] 코드 리뷰 및 지적 사항 확인·반영 - [ ] 실제 소스 도메인 테이블이 준비된 환경에서 MySQL 통합 조회 검증 - [ ] 팀 리뷰 후 병합 프론트의 localStorage를 API 호출로 교체하는 작업은 후속 연동 범위입니다. ## ⚠️ 의존성 및 데모 제한 - 관련 작업: TaxCheck #5 / PR #7, 온보딩·ExitCheck #4 / PR #6. - 컴파일 의존은 분리했지만 실제 실행에는 `users`, `paychecks`, `tax_checks`, `exit_checks` 테이블과 필요한 컬럼이 있어야 합니다. - `src/test/resources/dashboard-records-fixture-schema.sql`은 격리된 H2 테스트용 보완 스키마입니다. 운영 마이그레이션이 아니며 운영 DB에 적용하지 않습니다. - 현재 userId·데모 헤더 방식은 인증 수단이 아닙니다. 공통 인증·데이터 접근 제어는 별도 합의 사항으로 남기며, 이 작업만으로 공개 URL에서 실제 개인정보·문서를 안전하게 처리할 수 있다고 간주하지 않습니다. - 개발·검증에는 합성 데이터를 사용하고, 공통 사용자 생성·초기화·삭제 정책 및 공개 실데이터 배포는 이번 범위에 포함하지 않습니다.
✨ Description
Dashboard와 Records 화면에서 사용할 읽기 전용 조회 API를 구현합니다. 기존 Paycheck·TaxCheck·ExitCheck 저장 데이터를 집계하며, 별도 결과 테이블이나 인증·공통 사용자 정책은 추가하지 않습니다.
feature/dashboard-records📌 구현 내용
Dashboard
GET /api/dashboard?year=2026구현actual_amount)만 집계null)과 확인된 0원 구분Records
GET /api/records통합 기록 조회 구현type=PAYCHECK|TAX_CHECK|EXIT_CHECK필터 지원TYPE:id기록 키로 서로 다른 테이블의 ID 충돌 방지구조·예외·문서
domain/overview에 Controller·Service·Repository·DTO·Rule 분리Cache-Control: no-store적용docs/DASHBOARD_RECORDS_IMPLEMENTATION.md작성🧪 검증 결과
.\gradlew.bat test --console=plain실행 성공BUILD SUCCESSFUL in 2m 37sgit diff --cached --check오류 없음구현 문서의 패키지 제작 환경에서 Gradle을 실행하지 못했다는 설명은 제작 당시 기록입니다. 이후 위 사용자 로컬 환경에서 전체 테스트 실행 성공을 확인했습니다. 이 결과는 GitHub CI 또는 실제 MySQL·프론트 연동 검증 완료를 뜻하지 않습니다.
⏳ 남은 작업 / 완료 조건
dev대상 별도 PR 생성프론트의 localStorage를 API 호출로 교체하는 작업은 후속 연동 범위입니다.
users,paychecks,tax_checks,exit_checks테이블과 필요한 컬럼이 있어야 합니다.src/test/resources/dashboard-records-fixture-schema.sql은 격리된 H2 테스트용 보완 스키마입니다. 운영 마이그레이션이 아니며 운영 DB에 적용하지 않습니다.