From b6534860b1ae41144e90f4996ea55e6b5b7004be Mon Sep 17 00:00:00 2001 From: eldeoddt Date: Thu, 14 Aug 2025 17:03:27 +0900 Subject: [PATCH] =?UTF-8?q?[FIX]=20task=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/todo/repository/TaskRepository.java | 7 ++++--- .../service/task/TaskCommandServiceImpl.java | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/indayvidual/server/domain/todo/repository/TaskRepository.java b/src/main/java/com/indayvidual/server/domain/todo/repository/TaskRepository.java index 7989cb4..d9b4581 100644 --- a/src/main/java/com/indayvidual/server/domain/todo/repository/TaskRepository.java +++ b/src/main/java/com/indayvidual/server/domain/todo/repository/TaskRepository.java @@ -20,15 +20,16 @@ public interface TaskRepository extends JpaRepository { List findByUserIdAndCategoryIdAndDueDate(Long userId, Long categoryId, LocalDate date); /** - * 카테고리 내에서 현재 등록된 Task의 최대 position을 조회합니다. + * 특정 날짜와 카테고리 내에서 현재 등록된 Task의 최대 position을 조회합니다. *

* - 새로운 Task 생성 시 position 지정에 사용됩니다. + * - 값이 없으면 null을 반환합니다. * * @param categoryId + * @param date * @return max position 값 (null 가능) */ - @Query("SELECT MAX(t.position) FROM Task t WHERE t.category.id = :categoryId") - Integer findMaxPositionByCategoryId(@Param("categoryId") Long categoryId); + Integer findTopByCategoryIdAndDueDateOrderByPositionDesc(Long categoryId, LocalDate date); List findAllByUserIdAndCategoryId(Long userId, Long categoryId); diff --git a/src/main/java/com/indayvidual/server/domain/todo/service/task/TaskCommandServiceImpl.java b/src/main/java/com/indayvidual/server/domain/todo/service/task/TaskCommandServiceImpl.java index f197ac4..ea77573 100644 --- a/src/main/java/com/indayvidual/server/domain/todo/service/task/TaskCommandServiceImpl.java +++ b/src/main/java/com/indayvidual/server/domain/todo/service/task/TaskCommandServiceImpl.java @@ -19,6 +19,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; @@ -46,7 +47,7 @@ public TaskResponseDTO createTask(Long userId, Long categoryId, TaskCreateReques .orElseThrow(() -> new GeneralException(ErrorStatus.TASK_CATEGORY_NOT_FOUND)); // position 지정 - Integer position = generateNextPosition(categoryId); + Integer position = generateNextPosition(categoryId, request.getDate()); Task task = taskConverter.toEntity(request, category, user, position); taskRepository.save(task); @@ -57,19 +58,24 @@ public TaskResponseDTO createTask(Long userId, Long categoryId, TaskCreateReques /** * 새로운 할 일의 position 을 계산합니다. - * 카테고리 내 task의 최대 position을 조회한 후, - * 없으면 0번, 있으면 max+1로 지정합니다. + * 특정 날짜와 카테고리 내 task의 최대 position을 조회한 후, + * 없으면 0, 있으면 max+1로 지정합니다. * * @param categoryId + * @param date * @return 새로운 할 일의 position */ - private Integer generateNextPosition(Long categoryId) { - Integer max = taskRepository.findMaxPositionByCategoryId(categoryId); + private Integer generateNextPosition(Long categoryId, LocalDate date) { + Integer max = taskRepository.findTopByCategoryIdAndDueDateOrderByPositionDesc(categoryId, date); if (max == null) { log.debug("[TASK][generateNextPosition] max가 null이므로 기본값 0으로 시작합니다."); return 0; } - return max + 1; + int next = max + 1; + log.debug("[TASK][generateNextPosition] date={}, categoryId={} 의 max={} -> next={}", + date, categoryId, max, next); + + return next; } /**