Skip to content

Feat/task의 데드라인을 날짜 기준으로 변경#30

Merged
GoGradually merged 21 commits intomasterfrom
feat/Task의-데드라인을-날짜-기준으로-변경
Jan 23, 2026

Hidden character warning

The head ref may contain hidden characters: "feat/Task\uc758-\ub370\ub4dc\ub77c\uc778\uc744-\ub0a0\uc9dc-\uae30\uc900\uc73c\ub85c-\ubcc0\uacbd"
Merged

Feat/task의 데드라인을 날짜 기준으로 변경#30
GoGradually merged 21 commits intomasterfrom
feat/Task의-데드라인을-날짜-기준으로-변경

Conversation

@GoGradually
Copy link
Collaborator

변경된 점

  • task의 데드라인이 기존 Time 정보까지 같이 받던 걸 날짜 기준으로 변경
  • interfaces의 패키지 구조를 도메인 모듈 별로 변경

Copilot AI review requested due to automatic review settings January 23, 2026 04:08
@GoGradually GoGradually merged commit 36ff36b into master Jan 23, 2026
4 checks passed
@GoGradually GoGradually deleted the feat/Task의-데드라인을-날짜-기준으로-변경 branch January 23, 2026 04:08
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 커서 기반 쿼리를 LocalDatet.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)")
Copy link

Copilot AI Jan 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(1) 문제점: MemberControllerV2의 @tag 설명이 "회원 관련 정보 API (v1)"로 되어 있어, 실제 버전(v2)와 문서가 일치하지 않습니다.
(2) 영향: Swagger/OpenAPI 문서를 참고하는 클라이언트가 현재 제공되는 API 버전을 혼동할 수 있습니다.
(3) 수정 제안: @tag(description ...)의 설명 문자열에서 "(v1)"을 제거하거나 "(v2)"로 변경해 실제 컨트롤러 버전에 맞게 정정해 주세요.

Suggested change
@Tag(name = "MemberV2", description = "회원 관련 정보 API (v1)")
@Tag(name = "MemberV2", description = "회원 관련 정보 API (v2)")

Copilot uses AI. Check for mistakes.
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;
Copy link

Copilot AI Jan 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(1) 문제점: TaskControllerAdvice가 assignableTypes로 TaskControllerV1만 지정하고 있어, 새로 추가된 TaskControllerV2에는 TaskNotFoundException/IllegalArgumentException 등의 예외 매핑이 적용되지 않습니다.
(2) 영향: V2 작업 API에서 발생하는 예외는 V1과 다른 HTTP 상태 코드/에러 바디 형식으로 응답될 수 있어, 버전 간 에러 처리 일관성이 깨집니다.
(3) 수정 제안: @RestControllerAdvice의 assignableTypes에 TaskControllerV2를 함께 추가하거나, Task 관련 컨트롤러 전체를 포괄하는 설정으로 변경해 V1/V2 모두 동일한 에러 매핑을 사용하도록 해주세요.

Copilot uses AI. Check for mistakes.
Comment on lines +70 to +73
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));
Copy link

Copilot AI Jan 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(1) 문제점: ScheduleControllerV2의 신규 일정 조회/등록 API(getSchedules, getWeeklySchedules 등)는 시간대 변환과 주간 범위 계산 로직을 포함하고 있지만, V1에 존재하는 통합 테스트(ScheduleControllerV1IntegrationTest)에 상응하는 V2 통합 테스트가 추가되지 않았습니다.
(2) 영향: 신규 /v2/schedules 엔드포인트에서 날짜·시간 파라미터 처리나 응답 필드 매핑에 회귀가 발생해도 테스트로 검출되지 않을 수 있습니다.
(3) 수정 제안: V1 통합 테스트를 참고해 /v2/schedules 경로를 대상으로 하는 통합 테스트 클래스를 추가하고, 일/주간 조회, 생성, 상태 변경 등의 주요 시나리오를 검증해 주세요.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant