fix/BU-231: 근태 조회 API attendances 테이블 조회 및 v1 엔드포인트 통일#129
Conversation
- EmployeeMyService: attendance_records 대신 attendances 테이블 조회 - DashboardService: 금일 출근/지각 인원을 attendances 테이블에서 조회 - AttendanceRepository: findBySiteIdAndSearchDate 메서드 추가 기존에 attendance_records 테이블을 조회하던 로직이 실제 데이터가 저장되는 attendances 테이블을 조회하도록 변경 Refs: BU-231
- EmployeeController: /sites/{siteId}/employees → /v1/sites/{siteId}/employees
- DocumentController: /documents → /v1/documents
Refs: BU-231
개요이 PR은 데이터 계층의 Attendance 엔티티로의 전환을 중심으로 진행되는 대규모 리팩토링이며, API 컨트롤러에 v1 버전 접두사를 추가하고, 테스트 데이터 파일 및 관련 스크립트를 제거합니다. 변경 사항
예상 코드 리뷰 난이도🎯 3 (중간) | ⏱️ ~25분
관련 PR
시
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro ⛔ Files ignored due to path filters (2)
📒 Files selected for processing (15)
💤 Files with no reviewable changes (15)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/main/java/com/concrete/buildup/domain/site/service/DashboardService.java (1)
203-221: Remove unused methodisContractActiveOnDateThe method at lines 203-221 is not called anywhere in the codebase. It appears to be leftover from the previous AttendanceRecord-based implementation and can be safely deleted.
🧹 Nitpick comments (1)
DEMO-SCENARIO.md (1)
67-79: Markdown 린터 경고 - 테이블 앞뒤 빈 줄 누락정적 분석 도구에서 테이블 앞뒤에 빈 줄이 필요하다고 경고합니다 (MD058). 시연 문서이므로 선택적으로 수정하셔도 됩니다.
예시 수정:
#### 기업 관리자 + | 항목 | 값 | |------|-----| | 아이디 | buildup_corp | | 비밀번호 | Test1234! | | 이름 | 김건설 | + #### 현장 관리자
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
DEMO-SCENARIO.md(1 hunks)src/main/java/com/concrete/buildup/domain/attendance/repository/AttendanceRepository.java(1 hunks)src/main/java/com/concrete/buildup/domain/document/controller/DocumentController.java(1 hunks)src/main/java/com/concrete/buildup/domain/employee/controller/EmployeeController.java(1 hunks)src/main/java/com/concrete/buildup/domain/employee/service/EmployeeMyService.java(6 hunks)src/main/java/com/concrete/buildup/domain/site/service/DashboardService.java(4 hunks)
🧰 Additional context used
🪛 markdownlint-cli2 (0.18.1)
DEMO-SCENARIO.md
67-67: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
74-74: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
101-101: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
123-123: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
144-144: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
165-165: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
181-181: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
195-195: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
215-215: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
228-228: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
240-240: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
269-269: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
284-284: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
296-296: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
309-309: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
324-324: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
339-339: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
362-362: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
382-382: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
393-393: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
405-405: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
412-412: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
424-424: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
443-443: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
456-456: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
469-469: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
481-481: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
499-499: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
513-513: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
527-527: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
547-547: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
562-562: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
574-574: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
594-594: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
604-604: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
620-620: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
642-642: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
665-665: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
679-679: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
691-691: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
709-709: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
719-719: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
731-731: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
740-740: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
752-752: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
767-767: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
772-772: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
787-787: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
822-822: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
833-833: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
850-850: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
857-857: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
869-869: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
892-892: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
920-920: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
996-996: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
1006-1006: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
1016-1016: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
1026-1026: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
1033-1033: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
1042-1042: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
1048-1048: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
1057-1057: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
1069-1069: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build-and-test
🔇 Additional comments (7)
src/main/java/com/concrete/buildup/domain/attendance/repository/AttendanceRepository.java (1)
95-102: LGTM!Spring Data JPA 명명 규칙을 따르는 새로운 쿼리 메서드입니다.
DashboardService에서 현장별 일일 출석 조회에 적절하게 활용됩니다. 기존 repository 패턴과 일관성 있게 구현되었습니다.src/main/java/com/concrete/buildup/domain/document/controller/DocumentController.java (1)
27-27: LGTM - API 버전 프리픽스 통일
/documents→/v1/documents로 엔드포인트가 변경되었습니다. PR 목표에 따른 API 버전 통일 작업으로,EmployeeController의/v1/sites/{siteId}/employees변경과 일관성을 유지합니다.프론트엔드에서 해당 엔드포인트 경로 업데이트가 필요합니다. 문서 관련 API 호출 경로가 모두 수정되었는지 확인해 주세요.
src/main/java/com/concrete/buildup/domain/employee/controller/EmployeeController.java (1)
33-33: LGTM - API 버전 프리픽스 통일
/sites/{siteId}/employees→/v1/sites/{siteId}/employees로 엔드포인트가 변경되었습니다.DocumentController와 동일하게 v1 프리픽스가 적용되어 API 버전 관리가 통일되었습니다.src/main/java/com/concrete/buildup/domain/site/service/DashboardService.java (1)
177-199: LGTM - AttendanceRecord에서 Attendance로의 마이그레이션출근/지각 인원 계산 로직이 개선되었습니다:
findBySiteIdAndSearchDate를 사용한 효율적인 조회distinct()를 통한 중복 제거로 동일 근로자 중복 카운팅 방지Boolean.TRUE.equals()로 null-safe한 지각 여부 체크기존 N+1 문제가 있던 로직 대비 더 깔끔하고 효율적인 구현입니다.
src/main/java/com/concrete/buildup/domain/employee/service/EmployeeMyService.java (3)
92-127: LGTM - 출퇴근 내역 조회 로직 개선
AttendanceRecord에서Attendance엔티티로의 마이그레이션이 잘 구현되었습니다:
LocalDate기반 조회로 타임스탬프 범위 조회 대비 단순화- Site 정보 일괄 조회로 N+1 문제 방지 유지
- 스트림 기반 변환으로 가독성 향상
147-160: LGTM - 근태 상태 결정 로직
Attendance엔티티의checkOutTime과searchDate를 기반으로 상태를 결정하는 로직이 명확합니다. 퇴근 완료/근무중/미퇴근 상태 구분이 적절합니다.
289-312: LGTM - 금일 근태 조회 로직
Attendance테이블 기반으로 금일 근태를 조회하는 로직이 잘 구현되었습니다. 첫 번째 출근 기록을 반환하는 것은 홈 화면 표시 목적에 적합합니다.
- 테스트 데이터 SQL 파일 삭제 - 테스트 스크립트 및 로그 파일 삭제 - 임시 문서 파일 삭제
Pull Request
📋 Jira Issue
📝 변경 사항 요약
주요 변경사항
attendances테이블을 조회하도록 수정attendances테이블을 조회하도록 수정/v1prefix 통일🎯 변경 목적
문제: 얼굴인식 출퇴근 시스템은
attendances테이블에 저장하지만, 근로자 본인 근태 조회 및 대시보드는attendance_records테이블을 조회하여 데이터가 표시되지 않는 버그가 있었음해결: 모든 근태 조회 로직이 실제 데이터가 저장되는
attendances테이블을 조회하도록 수정🔍 변경 내역 상세
버그 수정 (Bug Fixes)
attendance_records→attendances테이블 조회로 변경attendance_records→attendances테이블 조회로 변경Attendance.isLate필드 기반으로 실제 계산리팩토링 (Refactoring)
/sites/{siteId}/employees→/v1/sites/{siteId}/employees/documents→/v1/documentsfindBySiteIdAndSearchDate()메서드 추가🧪 테스트 방법
단위 테스트
수동 테스트
GET /v1/employees/me/attendance호출 → 얼굴인식 출퇴근 기록 표시 확인GET /v1/employees/me/home호출 → 금일 근태 정보 표시 확인GET /v1/sites/{siteId}/dashboard호출 → 금일 출근/지각 인원 표시 확인API 테스트 예시
Breaking Changes 설명:
EmployeeController엔드포인트 변경:/sites/{siteId}/employees→/v1/sites/{siteId}/employeesDocumentController엔드포인트 변경:/documents→/v1/documents🔗 의존성 변경
🗄️ 데이터베이스 변경
✅ 체크리스트
코드 품질
테스트
./gradlew clean build)보안
성능
문서
Git
Refs: BU-231)📌 리뷰어에게
attendance_records테이블은 현재 어디서도 사용되지 않음 (추후 삭제 또는 용도 재정의 필요)Summary by CodeRabbit
릴리스 노트
API 변경사항
/documents→/v1/documents/sites/{siteId}/employees→/v1/sites/{siteId}/employees개선사항
문서 정리
✏️ Tip: You can customize this high-level summary in your review settings.