Feat/task의 데드라인을 날짜 기준으로 변경#30
Hidden character warning
Conversation
There was a problem hiding this comment.
Pull request overview
Task 및 일정 관련 API를 “날짜 + UTC 오프셋(자정 00:00 고정)” 기반으로 바꾸고, interfaces 레이어를 도메인별 패키지로 재구성하는 변경입니다. 기존 v1/v0 API는 deprecated로 두고, v2 엔드포인트와 DTO를 추가하여 마이그레이션 경로를 제공합니다.
Changes:
- Task 도메인의 마감 기한 표현을
ZonedDateTime(날짜·시간·ZoneId)에서LocalDate + ZoneOffset기반으로 변경하고, 커서 페이징 로직과 JPA 쿼리를 날짜 기준으로 재구성. - Task/Schedule/Statistics/Member 컨트롤러 및 DTO를
interfaces.task.*,interfaces.schedule.*,interfaces.statistics.*,interfaces.member.*로 재패키징하고, v2 컨트롤러(특히/v2/tasks,/v2/schedules,/v2/statistics,/v2/members)를 도입. - 새 날짜/오프셋 모델(
ZonedDateAttribute,DateWithOffset) 및 관련 서비스/레포지토리 테스트를 추가/보강하여 새로운 정렬·커서·동등성(equals) 규약을 검증.
Reviewed changes
Copilot reviewed 51 out of 51 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| src/test/java/me/gg/pinit/pinittask/interfaces/web/TaskControllerV2IntegrationTest.java | /v2/tasks 생성·조회·커서 API가 날짜+오프셋 기반 응답을 올바르게 반환하는지 통합 테스트 추가. |
| src/test/java/me/gg/pinit/pinittask/interfaces/web/TaskControllerV1Test.java | v1 Task 컨트롤러 테스트가 새 패키지(interfaces.task.*) DTO를 사용하도록 import 정리. |
| src/test/java/me/gg/pinit/pinittask/interfaces/web/TaskControllerV1IntegrationTest.java | v1 Task 통합 테스트의 마감 시각 기대값을 18:00 → 00:00으로 변경해 “자정 고정” 정책 반영. |
| src/test/java/me/gg/pinit/pinittask/interfaces/web/ScheduleControllerV1Test.java | v1 Schedule 컨트롤러 단위 테스트가 interfaces.schedule.* 패키지 DTO와 컨트롤러를 참조하도록 수정. |
| src/test/java/me/gg/pinit/pinittask/interfaces/web/ScheduleControllerV1IntegrationTest.java | v1 Schedule 통합 테스트가 새 DTO 패키지를 사용하도록 import 조정. |
| src/test/java/me/gg/pinit/pinittask/interfaces/web/ScheduleControllerV0IntegrationTest.java | 레거시 V0 스케줄 응답의 마감 필드 기대값을 날짜 자정 및 +09:00 오프셋으로 수정. |
| src/test/java/me/gg/pinit/pinittask/interfaces/dto/TaskCreateRequestTest.java | Task 생성 DTO 테스트가 새 task DTO 패키지를 사용하도록 import 수정. |
| src/test/java/me/gg/pinit/pinittask/domain/task/vo/TemporalConstraintTest.java | TemporalConstraint equals가 “날짜 + 오프셋 + duration” 기준으로 동작하는지 상세 케이스(시간 차, 날짜 차, 오프셋 차)를 검증하도록 갱신. |
| src/test/java/me/gg/pinit/pinittask/domain/task/repository/TaskRepositoryTest.java | findNextByCursor가 날짜→id 순으로 정렬·커서 동작하는지 검증하는 리포지토리 스프링 테스트 추가. |
| src/test/java/me/gg/pinit/pinittask/application/task/service/TaskServiceTest.java | 커서 기반 조회가 LocalDate 커서 및 새로운 레포지토리 시그니처를 사용하는지, hasNext/nextCursor 계약이 유지되는지 테스트 업데이트. |
| src/test/java/me/gg/pinit/pinittask/application/task/service/TaskAdjustmentServiceTest.java | Task 생성 시 도메인 dueDate가 요청의 날짜·오프셋(자정)과 일치하는지 검증 로직으로 수정. |
| src/test/java/me/gg/pinit/pinittask/application/schedule/service/ScheduleServiceTest.java | ScheduleService가 변경된 커스텀 리포지토리 메서드명(...StartTimeBetween)을 사용하는지 검증하도록 수정. |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/dto/TaskUpdateRequestV2.java | v2 Task 수정 요청 DTO를 추가해 DateWithOffset 기반 마감과 의존성 조정 명령(TaskDependencyAdjustCommand)으로 변환. |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/dto/TaskUpdateRequest.java | 기존 TaskUpdateRequest를 interfaces.task.dto로 이동하고 DateTimeWithZone import를 명시해 v1 API DTO 패키지 구조에 맞춤. |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/dto/TaskScheduleRequest.java | Task에서 Schedule 생성 요청 DTO를 task 패키지로 이동하고, 시작 시각을 DateTimeWithZone으로 전달. |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/dto/TaskResponseV2.java | v2 Task 응답 DTO를 추가해 도메인 TemporalConstraint를 DateWithOffset로 노출하고 의존성 정보(previous/next) 및 타임스탬프를 포함. |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/dto/TaskResponse.java | v1 Task 응답을 task DTO 패키지로 이동하고, 마감 기한 스키마 설명을 “00:00:00 고정, ZoneOffset 기반”으로 문서화. |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/dto/TaskCursorPageResponseV2.java | v2 Task 커서 페이지 응답(record) 추가로, v2 Response 타입과 nextCursor/hasNext를 캡슐화. |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/dto/TaskCursorPageResponse.java | 기존 Task 커서 페이지 응답을 task DTO 패키지로 이동. |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/dto/TaskCreateRequestV2.java | v2 Task 생성 요청 DTO를 추가해 LocalDate + ZoneOffset 마감과 의존성 placeholder 규칙을 TaskDependencyAdjustCommand로 변환. |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/dto/TaskCreateRequest.java | 기존 TaskCreateRequest를 task DTO 패키지로 이동해 v1 API를 그대로 유지. |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/dto/DependencyRequest.java | 스케줄/작업 양쪽에서 재사용되는 의존성 요청 DTO를 interfaces.task.dto로 이동. |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/TaskControllerV2.java | /v2/tasks CRUD, 커서 조회, 의존 관계 포함 조회 및 스케줄 생성 등 신규 v2 Task REST API를 정의(마감은 날짜+오프셋 기준). |
| src/main/java/me/gg/pinit/pinittask/interfaces/task/TaskControllerV1.java | v1 Task 컨트롤러를 interfaces.task로 이동하고 @deprecated 표시, 정렬 기준을 deadline.date로 변경, 커서 설명을 “자정 00:00:00 고정”으로 문서화. |
| src/main/java/me/gg/pinit/pinittask/interfaces/statistics/dto/StatisticsResponse.java | Statistics 응답 DTO를 interfaces.statistics.dto로 이동하고, 기준 주간 시작 시각을 DateTimeWithZone으로 노출. |
| src/main/java/me/gg/pinit/pinittask/interfaces/statistics/StatisticsControllerV2.java | /v2/statistics에서 LocalDateTime+ZoneId를 받아 DateTimeUtils로 ZonedDateTime을 만들고 StatisticsService에 위임하는 v2 통계 조회 API 추가. |
| src/main/java/me/gg/pinit/pinittask/interfaces/statistics/StatisticsControllerV1.java | 통계 v1 컨트롤러를 interfaces.statistics로 이동하고 @deprecated 추가. |
| src/main/java/me/gg/pinit/pinittask/interfaces/statistics/StatisticsControllerV0.java | 통계 v0 컨트롤러를 interfaces.statistics로 이동하여 패키지 구조를 정리. |
| src/main/java/me/gg/pinit/pinittask/interfaces/schedule/dto/ScheduleSimpleResponse.java | Schedule 요약 응답 DTO를 interfaces.schedule.dto로 이동하고, 시작 시각을 DateTimeWithZone으로 유지. |
| src/main/java/me/gg/pinit/pinittask/interfaces/schedule/dto/ScheduleSimpleRequest.java | 작업과 연결되지 않은 단순 스케줄 생성 요청 DTO를 schedule DTO 패키지로 이동. |
| src/main/java/me/gg/pinit/pinittask/interfaces/schedule/dto/ScheduleSimplePatchRequest.java | 단순 스케줄 수정 요청 DTO를 schedule DTO 패키지로 이동. |
| src/main/java/me/gg/pinit/pinittask/interfaces/schedule/dto/ScheduleResponse.java | 레거시 V0 스케줄+Task 응답 DTO를 schedule DTO 패키지로 이동하고, 마감/중요도/난이도 필드를 deprecated로 명시. |
| src/main/java/me/gg/pinit/pinittask/interfaces/schedule/dto/ScheduleRequest.java | V0용 일정-작업 의존성 생성 요청 DTO를 schedule DTO 패키지로 이동하고 DependencyRequest/DateTimeWithZone를 재사용. |
| src/main/java/me/gg/pinit/pinittask/interfaces/schedule/ScheduleControllerV2.java | /v2/schedules에 작업 없는 일정 생성·조회·주간조회·상태변경·삭제 API를 추가하고, Member의 타임존과 DateTimeUtils를 통해 일/주간 범위를 계산. |
| src/main/java/me/gg/pinit/pinittask/interfaces/schedule/ScheduleControllerV1.java | v1 Schedule 컨트롤러를 interfaces.schedule로 이동하고 @deprecated 부여. |
| src/main/java/me/gg/pinit/pinittask/interfaces/schedule/ScheduleControllerV0.java | v0 Schedule 컨트롤러를 interfaces.schedule로 이동해 레거시 엔드포인트를 정리. |
| src/main/java/me/gg/pinit/pinittask/interfaces/member/MemberControllerV2.java | /v2/members에서 현재 진행 중인 일정 ID와 사용자의 ZoneOffset 문자열을 조회하는 v2 Member API를 추가. |
| src/main/java/me/gg/pinit/pinittask/interfaces/member/MemberControllerV1.java | v1 Member 컨트롤러를 interfaces.member로 이동하고 @deprecated 추가. |
| src/main/java/me/gg/pinit/pinittask/interfaces/member/MemberControllerV0.java | v0 Member 컨트롤러를 interfaces.member로 이동하여 패키지 구조 통일. |
| src/main/java/me/gg/pinit/pinittask/interfaces/exception/TaskControllerAdvice.java | Task 컨트롤러 패키지 변경에 맞춰 import를 interfaces.task.TaskControllerV1로 조정(현재는 v1만 대상으로 예외 매핑). |
| src/main/java/me/gg/pinit/pinittask/interfaces/dto/DateWithOffset.java | LocalDate + ZoneOffset를 표현하는 새로운 DTO 추가로, 마감 날짜+오프셋 정보를 HTTP API에서 직렬화/역직렬화. |
| src/main/java/me/gg/pinit/pinittask/infrastructure/schedule/ScheduleRepositoryImpl.java | 커스텀 스케줄 조회 메서드명을 ...InstantBetween에서 ...StartTimeBetween으로 변경해 의미를 단순화하고 서비스 코드와 맞춤. |
| src/main/java/me/gg/pinit/pinittask/domain/task/vo/TemporalConstraint.java | 마감 기한을 ZonedDateAttribute(date + offsetId)로 매핑하고, LocalDate/ZoneOffset 기반 생성자 및 getter를 추가해 “날짜+오프셋 자정” 모델을 도메인 레벨에 반영. |
| src/main/java/me/gg/pinit/pinittask/domain/task/repository/TaskRepository.java | 커서 기반 쿼리를 LocalDate와 t.temporalConstraint.deadline.date 기준 정렬로 변경해 날짜 커서 모델로 전환. |
| src/main/java/me/gg/pinit/pinittask/domain/schedule/repository/ScheduleRepositoryCustom.java | 커스텀 리포지토리 시그니처를 ...StartTimeBetween으로 변경해 Instant 기반 일/주간 조회를 단순화. |
| src/main/java/me/gg/pinit/pinittask/domain/datetime/ZonedDateAttribute.java | date + offsetId를 보관하는 임베디드 값 객체로, ZonedDateTime ↔ (LocalDate, ZoneOffset) 변환을 책임. |
| src/main/java/me/gg/pinit/pinittask/application/task/service/TaskService.java | Task 커서 페이지네이션을 LocalDate 기반 커서로 변경하고, 다양한 포맷의 기존 커서 문자열을 허용하는 decode 로직 및 CursorPage 레코드를 도입. |
| src/main/java/me/gg/pinit/pinittask/application/schedule/service/ScheduleService.java | 일/주간 스케줄 조회에서 변경된 커스텀 리포지토리 메서드를 사용해 회원의 시간대 기준으로 Instant 범위를 계산. |
| src/main/java/me/gg/pinit/pinittask/application/datetime/DateTimeUtils.java | toStartOfDay(LocalDate, ZoneOffset) 헬퍼를 추가해 날짜+오프셋을 자정 ZonedDateTime으로 일관되게 변환. |
Comments suppressed due to low confidence (1)
src/test/java/me/gg/pinit/pinittask/application/task/service/TaskServiceTest.java:95
- The variable 'ownerId' is only assigned values of primitive type and is never 'null', but it is declared with the boxed type 'Long'.
|
|
||
| @RestController | ||
| @RequestMapping("/v2/members") | ||
| @Tag(name = "MemberV2", description = "회원 관련 정보 API (v1)") |
There was a problem hiding this comment.
(1) 문제점: MemberControllerV2의 @tag 설명이 "회원 관련 정보 API (v1)"로 되어 있어, 실제 버전(v2)와 문서가 일치하지 않습니다.
(2) 영향: Swagger/OpenAPI 문서를 참고하는 클라이언트가 현재 제공되는 API 버전을 혼동할 수 있습니다.
(3) 수정 제안: @tag(description ...)의 설명 문자열에서 "(v1)"을 제거하거나 "(v2)"로 변경해 실제 컨트롤러 버전에 맞게 정정해 주세요.
| @Tag(name = "MemberV2", description = "회원 관련 정보 API (v1)") | |
| @Tag(name = "MemberV2", description = "회원 관련 정보 API (v2)") |
| import lombok.extern.slf4j.Slf4j; | ||
| import me.gg.pinit.pinittask.domain.task.exception.TaskNotFoundException; | ||
| import me.gg.pinit.pinittask.interfaces.web.TaskControllerV1; | ||
| import me.gg.pinit.pinittask.interfaces.task.TaskControllerV1; |
There was a problem hiding this comment.
(1) 문제점: TaskControllerAdvice가 assignableTypes로 TaskControllerV1만 지정하고 있어, 새로 추가된 TaskControllerV2에는 TaskNotFoundException/IllegalArgumentException 등의 예외 매핑이 적용되지 않습니다.
(2) 영향: V2 작업 API에서 발생하는 예외는 V1과 다른 HTTP 상태 코드/에러 바디 형식으로 응답될 수 있어, 버전 간 에러 처리 일관성이 깨집니다.
(3) 수정 제안: @RestControllerAdvice의 assignableTypes에 TaskControllerV2를 함께 추가하거나, Task 관련 컨트롤러 전체를 포괄하는 설정으로 변경해 V1/V2 모두 동일한 에러 매핑을 사용하도록 해주세요.
| public List<ScheduleSimpleResponse> getSchedules(@Parameter(hidden = true) @MemberId Long memberId, | ||
| @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime time, | ||
| @RequestParam ZoneId zoneId) { | ||
| List<Schedule> schedules = scheduleService.getScheduleList(memberId, dateTimeUtils.toZonedDateTime(time, zoneId)); |
There was a problem hiding this comment.
(1) 문제점: ScheduleControllerV2의 신규 일정 조회/등록 API(getSchedules, getWeeklySchedules 등)는 시간대 변환과 주간 범위 계산 로직을 포함하고 있지만, V1에 존재하는 통합 테스트(ScheduleControllerV1IntegrationTest)에 상응하는 V2 통합 테스트가 추가되지 않았습니다.
(2) 영향: 신규 /v2/schedules 엔드포인트에서 날짜·시간 파라미터 처리나 응답 필드 매핑에 회귀가 발생해도 테스트로 검출되지 않을 수 있습니다.
(3) 수정 제안: V1 통합 테스트를 참고해 /v2/schedules 경로를 대상으로 하는 통합 테스트 클래스를 추가하고, 일/주간 조회, 생성, 상태 변경 등의 주요 시나리오를 검증해 주세요.
변경된 점