From b729ae7f4cdc20f0f23c4ce9836c36359206bb73 Mon Sep 17 00:00:00 2001 From: kms152000 Date: Tue, 16 Dec 2025 14:31:23 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EA=B8=B0=EC=A1=B4=20sequenceOrder?= =?UTF-8?q?=EB=A5=BC=20startAt(LocalTime)=EC=9C=BC=EB=A1=9C=20=ED=83=80?= =?UTF-8?q?=EC=9E=84=EB=9D=BC=EC=9D=B8=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plans/dto/request/ScheduleAddRequest.java | 10 ++-- .../dto/request/ScheduleUpdateRequest.java | 8 +--- .../dto/response/PlanDetailResponse.java | 4 +- .../plans/dto/response/ScheduleResponse.java | 4 +- .../domain/plans/entity/Schedule.java | 14 ++---- .../plans/repository/ScheduleRepository.java | 4 +- .../domain/plans/service/PlanService.java | 48 ++----------------- 7 files changed, 18 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/request/ScheduleAddRequest.java b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/request/ScheduleAddRequest.java index 79b53e95..87ae7fa9 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/request/ScheduleAddRequest.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/request/ScheduleAddRequest.java @@ -12,7 +12,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; +import java.time.LocalTime; @Getter @NoArgsConstructor @@ -25,8 +25,8 @@ public class ScheduleAddRequest { @Size(max = 100, message = "제목은 100자 이하여야 합니다.") private String title; - @NotNull(message = "시작 일시는 필수입니다.") - private LocalDateTime startAt; + @NotNull(message = "시작 시간은 필수입니다.") + private LocalTime startAt; @NotNull(message = "소요 시간(분)은 필수입니다.") @Positive(message = "소요 시간은 양수여야 합니다.") @@ -52,10 +52,6 @@ public class ScheduleAddRequest { @NotBlank(message = "상세 정보는 필수입니다.") private String details; - // 정렬 순서 (미지정 시 자동 계산) - @Positive(message = "정렬 순서는 양수여야 합니다.") - private Integer sequenceOrder; - // 교통 수단인 경우 사용 @Min(value = -90, message = "출발지 위도는 -90 이상이어야 합니다.") @Max(value = 90, message = "출발지 위도는 90 이하여야 합니다.") diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/request/ScheduleUpdateRequest.java b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/request/ScheduleUpdateRequest.java index 9f9af0ae..6f9cd331 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/request/ScheduleUpdateRequest.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/request/ScheduleUpdateRequest.java @@ -10,7 +10,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; +import java.time.LocalTime; @Getter @NoArgsConstructor @@ -22,7 +22,7 @@ public class ScheduleUpdateRequest { @Size(max = 100, message = "제목은 100자 이하여야 합니다.") private String title; - private LocalDateTime startAt; + private LocalTime startAt; @Positive(message = "소요 시간은 양수여야 합니다.") private Integer duration; @@ -43,10 +43,6 @@ public class ScheduleUpdateRequest { private String details; - // 정렬 순서 (미지정 시 기존 값 유지) - @Positive(message = "정렬 순서는 양수여야 합니다.") - private Integer sequenceOrder; - // 교통 수단인 경우 사용 @Min(value = -90, message = "출발지 위도는 -90 이상이어야 합니다.") @Max(value = 90, message = "출발지 위도는 90 이하여야 합니다.") diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/response/PlanDetailResponse.java b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/response/PlanDetailResponse.java index 1562f05d..f1609bea 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/response/PlanDetailResponse.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/response/PlanDetailResponse.java @@ -6,6 +6,7 @@ import lombok.Getter; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.List; @@ -38,14 +39,13 @@ public static class ScheduleInfo { private Long id; private Schedule.ScheduleType scheduleType; private String title; - private java.time.LocalDateTime startAt; + private LocalTime startAt; private Integer duration; private String location; private Double locationLat; private Double locationLon; private Integer estimatedCost; private String details; - private Integer sequenceOrder; private Double startPlaceLat; private Double startPlaceLon; private Double endPlaceLat; diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/response/ScheduleResponse.java b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/response/ScheduleResponse.java index f63384ea..d8f75f4c 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/response/ScheduleResponse.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/dto/response/ScheduleResponse.java @@ -5,6 +5,7 @@ import lombok.Getter; import java.time.LocalDateTime; +import java.time.LocalTime; @Getter @Builder @@ -12,14 +13,13 @@ public class ScheduleResponse { private Long id; private Schedule.ScheduleType scheduleType; private String title; - private LocalDateTime startAt; + private LocalTime startAt; private Integer duration; private String location; private Double locationLat; private Double locationLon; private Integer estimatedCost; private String details; - private Integer sequenceOrder; // 교통 수단 정보 private Double startPlaceLat; private Double startPlaceLon; diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/entity/Schedule.java b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/entity/Schedule.java index 4567de35..30f46f60 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/entity/Schedule.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/entity/Schedule.java @@ -6,6 +6,7 @@ import org.hibernate.annotations.UpdateTimestamp; import java.time.LocalDateTime; +import java.time.LocalTime; @Entity @@ -32,7 +33,7 @@ public class Schedule { private String title; @Column(name = "start_at", nullable = false) - private LocalDateTime startAt; + private LocalTime startAt; @Column(name = "duration", nullable = false) private Integer duration; @@ -53,9 +54,6 @@ public class Schedule { @Column(name = "details", columnDefinition = "TEXT", nullable = false) private String details; - @Column(name = "sequence_order", nullable = false) - private Integer sequenceOrder; - // 교통 수단 정보 (schedule_type = 'TRANSPORT'인 경우 사용) @Column(name = "start_place_lat") private Double startPlaceLat; @@ -87,10 +85,9 @@ public class Schedule { @Builder public Schedule(Plan plan, ScheduleType scheduleType, String title, - LocalDateTime startAt, Integer duration, + LocalTime startAt, Integer duration, String location, Double locationLat, Double locationLon, Integer estimatedCost, String details, - Integer sequenceOrder, Double startPlaceLat, Double startPlaceLon, Double endPlaceLat, Double endPlaceLon, Integer distance, TransportType transportType) { @@ -104,7 +101,6 @@ public Schedule(Plan plan, ScheduleType scheduleType, String title, this.locationLon = locationLon; this.estimatedCost = estimatedCost; this.details = details; - this.sequenceOrder = sequenceOrder; this.startPlaceLat = startPlaceLat; this.startPlaceLon = startPlaceLon; this.endPlaceLat = endPlaceLat; @@ -114,10 +110,9 @@ public Schedule(Plan plan, ScheduleType scheduleType, String title, } public void update(ScheduleType scheduleType, String title, - LocalDateTime startAt, Integer duration, + LocalTime startAt, Integer duration, String location, Double locationLat, Double locationLon, Integer estimatedCost, String details, - Integer sequenceOrder, Double startPlaceLat, Double startPlaceLon, Double endPlaceLat, Double endPlaceLon, Integer distance, TransportType transportType) { @@ -130,7 +125,6 @@ public void update(ScheduleType scheduleType, String title, this.locationLon = locationLon; this.estimatedCost = estimatedCost; this.details = details; - this.sequenceOrder = sequenceOrder; this.startPlaceLat = startPlaceLat; this.startPlaceLon = startPlaceLon; this.endPlaceLat = endPlaceLat; diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/repository/ScheduleRepository.java b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/repository/ScheduleRepository.java index 26eacd1f..21c101cd 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/repository/ScheduleRepository.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/repository/ScheduleRepository.java @@ -11,9 +11,9 @@ public interface ScheduleRepository extends JpaRepository { /** - * 특정 Plan의 모든 일정을 순서대로 조회 + * 특정 Plan의 모든 일정을 시작 시간 순서대로 조회 */ - List findByPlan_PlanIdOrderBySequenceOrderAsc(Long planId); + List findByPlan_PlanIdOrderByStartAtAsc(Long planId); /** * 특정 Plan에 속한 Schedule의 개수 조회 (다음 순서 계산용) diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/service/PlanService.java b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/service/PlanService.java index 5239008c..8da17f0f 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/plans/service/PlanService.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/plans/service/PlanService.java @@ -128,9 +128,9 @@ public PlanDetailResponse getPlanDetail(Long planId, User user) { .build()) .collect(Collectors.toList()); - // 타임라인 형태로 일정 정렬 (sequenceOrder 기준) - Repository 메서드 사용으로 일관성 향상 + // 타임라인 형태로 일정 정렬 (startAt 기준) List sortedSchedules = scheduleRepository - .findByPlan_PlanIdOrderBySequenceOrderAsc(planId); + .findByPlan_PlanIdOrderByStartAtAsc(planId); List schedules = sortedSchedules.stream() .map(item -> PlanDetailResponse.ScheduleInfo.builder() @@ -144,7 +144,6 @@ public PlanDetailResponse getPlanDetail(Long planId, User user) { .locationLon(item.getLocationLon()) .estimatedCost(item.getEstimatedCost()) .details(item.getDetails()) - .sequenceOrder(item.getSequenceOrder()) .startPlaceLat(item.getStartPlaceLat()) .startPlaceLon(item.getStartPlaceLon()) .endPlaceLat(item.getEndPlaceLat()) @@ -256,13 +255,6 @@ public ScheduleResponse addSchedule(Long planId, User user, ScheduleAddRequest r } } - // 순서가 지정되지 않은 경우, 마지막 순서 + 1로 설정 - Integer sequenceOrder = request.getSequenceOrder(); - if (sequenceOrder == null) { - long count = scheduleRepository.countByPlan_PlanId(planId); - sequenceOrder = (int) count + 1; - } - Schedule schedule = Schedule.builder() .plan(plan) .scheduleType(request.getScheduleType()) @@ -274,7 +266,6 @@ public ScheduleResponse addSchedule(Long planId, User user, ScheduleAddRequest r .locationLon(request.getLocationLon()) .estimatedCost(request.getEstimatedCost()) .details(request.getDetails()) - .sequenceOrder(sequenceOrder) .startPlaceLat(request.getStartPlaceLat()) .startPlaceLon(request.getStartPlaceLon()) .endPlaceLat(request.getEndPlaceLat()) @@ -302,7 +293,7 @@ public ScheduleListResponse getSchedules(Long planId, User user) { findPlanWithParticipantCheck(planId, user); List schedules = scheduleRepository - .findByPlan_PlanIdOrderBySequenceOrderAsc(planId); + .findByPlan_PlanIdOrderByStartAtAsc(planId); List scheduleResponses = schedules.stream() .map(this::toScheduleResponse) @@ -420,7 +411,6 @@ public ScheduleResponse updateSchedule(Long planId, Long scheduleId, User user, request.getLocationLon() != null ? request.getLocationLon() : schedule.getLocationLon(), request.getEstimatedCost() != null ? request.getEstimatedCost() : schedule.getEstimatedCost(), request.getDetails() != null ? request.getDetails() : schedule.getDetails(), - request.getSequenceOrder() != null ? request.getSequenceOrder() : schedule.getSequenceOrder(), request.getStartPlaceLat() != null ? request.getStartPlaceLat() : schedule.getStartPlaceLat(), request.getStartPlaceLon() != null ? request.getStartPlaceLon() : schedule.getStartPlaceLon(), request.getEndPlaceLat() != null ? request.getEndPlaceLat() : schedule.getEndPlaceLat(), @@ -450,39 +440,8 @@ public ScheduleDeleteResponse deleteSchedule(Long planId, Long scheduleId, User .findByScheduleIdAndPlan_PlanId(scheduleId, planId) .orElseThrow(() -> new BusinessException(PlanErrorCode.SCHEDULE_NOT_FOUND)); - Integer deletedSequenceOrder = schedule.getSequenceOrder(); scheduleRepository.delete(schedule); - // 삭제된 일정 이후의 일정들의 sequenceOrder를 1씩 감소시켜 재정렬 - if (deletedSequenceOrder != null) { - List remainingSchedules = scheduleRepository - .findByPlan_PlanIdOrderBySequenceOrderAsc(planId); - - // 삭제된 순서보다 큰 일정들만 업데이트 - remainingSchedules.stream() - .filter(s -> s.getSequenceOrder() != null && s.getSequenceOrder() > deletedSequenceOrder) - .forEach(remainingSchedule -> { - remainingSchedule.update( - remainingSchedule.getScheduleType(), - remainingSchedule.getTitle(), - remainingSchedule.getStartAt(), - remainingSchedule.getDuration(), - remainingSchedule.getLocation(), - remainingSchedule.getLocationLat(), - remainingSchedule.getLocationLon(), - remainingSchedule.getEstimatedCost(), - remainingSchedule.getDetails(), - remainingSchedule.getSequenceOrder() - 1, - remainingSchedule.getStartPlaceLat(), - remainingSchedule.getStartPlaceLon(), - remainingSchedule.getEndPlaceLat(), - remainingSchedule.getEndPlaceLon(), - remainingSchedule.getDistance(), - remainingSchedule.getTransportType() - ); - }); - } - return ScheduleDeleteResponse.builder() .scheduleId(scheduleId) .build(); @@ -566,7 +525,6 @@ private ScheduleResponse toScheduleResponse(Schedule schedule) { .locationLon(schedule.getLocationLon()) .estimatedCost(schedule.getEstimatedCost()) .details(schedule.getDetails()) - .sequenceOrder(schedule.getSequenceOrder()) .startPlaceLat(schedule.getStartPlaceLat()) .startPlaceLon(schedule.getStartPlaceLon()) .endPlaceLat(schedule.getEndPlaceLat())