From 51f977522631e89d7b01406b80d514dc615cc8c6 Mon Sep 17 00:00:00 2001 From: songhyeonpk Date: Fri, 15 Aug 2025 17:08:37 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EB=BD=80=EB=AA=A8=EB=8F=84?= =?UTF-8?q?=EB=A1=9C=20=EC=A7=91=EC=A4=91=20=EC=84=B8=EC=85=98=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EC=9A=94=EC=B2=AD=EB=B0=9B=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: 뽀모도로 엔티티 focusCount 필드 -> focusSessionCount 변경 * refactor: 뽀모도로 엔티티 생성 시 고정된 focusSessionCount 값을 지정하지 않고 요청받은 정보로 지정하도록 리팩토링 * refactor: CreatePomodoroRequest DTO focusSessionCount 필드 추가 * refactor: PomodoroInfo 클래스에 focusSessionCount 필드 추가 * refactor: LoadDailyGoalDetailResponse DTO pomodoro 정보에 focusSessionCount 필드 추가 * test: PomodoroService 단위 테스트의 뽀모도로를 생성하는 테스트 코드 수정 * test: DailyGoalController 통합 테스트에서 뽀모도로 focusSessionCount 관련 예외 발생 테스트 코드 추가 --- .../application/dto/PomodoroInfo.java | 7 ++- .../application/service/PomodoroService.java | 4 +- .../domain/factory/PomodoroFactory.java | 5 ++- .../pomodoro/domain/model/Pomodoro.java | 6 +-- .../dto/request/CreatePomodoroRequest.java | 3 +- .../response/LoadDailyGoalDetailResponse.java | 6 ++- .../service/PomodoroServiceTest.java | 3 +- .../CreateDailyGoalRequestFixture.java | 2 +- .../DailyGoalControllerIntegrationTest.java | 45 +++++++++++++++++++ 9 files changed, 68 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/ject/studytrip/pomodoro/application/dto/PomodoroInfo.java b/src/main/java/com/ject/studytrip/pomodoro/application/dto/PomodoroInfo.java index 5d0fb23..d220335 100644 --- a/src/main/java/com/ject/studytrip/pomodoro/application/dto/PomodoroInfo.java +++ b/src/main/java/com/ject/studytrip/pomodoro/application/dto/PomodoroInfo.java @@ -2,8 +2,11 @@ import com.ject.studytrip.pomodoro.domain.model.Pomodoro; -public record PomodoroInfo(Long pomodoroId, int focusDurationInMinute) { +public record PomodoroInfo(Long pomodoroId, int focusDurationInMinute, int focusSessionCount) { public static PomodoroInfo from(Pomodoro pomodoro) { - return new PomodoroInfo(pomodoro.getId(), pomodoro.getFocusDurationInSeconds() / 60); + return new PomodoroInfo( + pomodoro.getId(), + pomodoro.getFocusDurationInSeconds() / 60, + pomodoro.getFocusSessionCount()); } } diff --git a/src/main/java/com/ject/studytrip/pomodoro/application/service/PomodoroService.java b/src/main/java/com/ject/studytrip/pomodoro/application/service/PomodoroService.java index 538f6c4..2d11c0d 100644 --- a/src/main/java/com/ject/studytrip/pomodoro/application/service/PomodoroService.java +++ b/src/main/java/com/ject/studytrip/pomodoro/application/service/PomodoroService.java @@ -18,7 +18,9 @@ public class PomodoroService { public Pomodoro createPomodoro(DailyGoal dailyGoal, CreatePomodoroRequest request) { int focusDurationInSeconds = request.focusDurationInMinute() * 60; - Pomodoro pomodoro = PomodoroFactory.create(dailyGoal, focusDurationInSeconds, 1, 0); + Pomodoro pomodoro = + PomodoroFactory.create( + dailyGoal, focusDurationInSeconds, request.focusSessionCount(), 0); return pomodoroRepository.save(pomodoro); } diff --git a/src/main/java/com/ject/studytrip/pomodoro/domain/factory/PomodoroFactory.java b/src/main/java/com/ject/studytrip/pomodoro/domain/factory/PomodoroFactory.java index cc5df8f..75588a1 100644 --- a/src/main/java/com/ject/studytrip/pomodoro/domain/factory/PomodoroFactory.java +++ b/src/main/java/com/ject/studytrip/pomodoro/domain/factory/PomodoroFactory.java @@ -10,8 +10,9 @@ public class PomodoroFactory { public static Pomodoro create( DailyGoal dailyGoal, int focusDurationInSeconds, - int focusCount, + int focusSessionCount, int breakDurationInSeconds) { - return Pomodoro.of(dailyGoal, focusDurationInSeconds, focusCount, breakDurationInSeconds); + return Pomodoro.of( + dailyGoal, focusDurationInSeconds, focusSessionCount, breakDurationInSeconds); } } diff --git a/src/main/java/com/ject/studytrip/pomodoro/domain/model/Pomodoro.java b/src/main/java/com/ject/studytrip/pomodoro/domain/model/Pomodoro.java index 9a9a18c..22f225c 100644 --- a/src/main/java/com/ject/studytrip/pomodoro/domain/model/Pomodoro.java +++ b/src/main/java/com/ject/studytrip/pomodoro/domain/model/Pomodoro.java @@ -22,7 +22,7 @@ public class Pomodoro extends BaseTimeEntity { private DailyGoal dailyGoal; private int focusDurationInSeconds; // 집중 시간(초) - private int focusCount; // 집중 세션 횟수 + private int focusSessionCount; // 집중 세션 횟수 private int breakDurationInSeconds; // 휴식 시간(초) private int totalFocusTimeInSeconds; // 총 집중 시간(초) @@ -31,12 +31,12 @@ public class Pomodoro extends BaseTimeEntity { public static Pomodoro of( DailyGoal dailyGoal, int focusDurationInSeconds, - int focusCount, + int focusSessionCount, int breakDurationInSeconds) { return Pomodoro.builder() .dailyGoal(dailyGoal) .focusDurationInSeconds(focusDurationInSeconds) - .focusCount(1) + .focusSessionCount(focusSessionCount) .breakDurationInSeconds(0) .totalFocusTimeInSeconds(0) .build(); diff --git a/src/main/java/com/ject/studytrip/pomodoro/presentation/dto/request/CreatePomodoroRequest.java b/src/main/java/com/ject/studytrip/pomodoro/presentation/dto/request/CreatePomodoroRequest.java index debccae..fd53db7 100644 --- a/src/main/java/com/ject/studytrip/pomodoro/presentation/dto/request/CreatePomodoroRequest.java +++ b/src/main/java/com/ject/studytrip/pomodoro/presentation/dto/request/CreatePomodoroRequest.java @@ -3,4 +3,5 @@ import jakarta.validation.constraints.Min; public record CreatePomodoroRequest( - @Min(value = 1, message = "뽀모도로 최소 집중 시간은 1분입니다.") int focusDurationInMinute) {} + @Min(value = 1, message = "뽀모도로 최소 집중 시간은 1분입니다.") int focusDurationInMinute, + @Min(value = 1, message = "뽀모도로 최소 집중 세션 개수는 1개입니다.") int focusSessionCount) {} diff --git a/src/main/java/com/ject/studytrip/trip/presentation/dto/response/LoadDailyGoalDetailResponse.java b/src/main/java/com/ject/studytrip/trip/presentation/dto/response/LoadDailyGoalDetailResponse.java index 23f6ee5..b49866c 100644 --- a/src/main/java/com/ject/studytrip/trip/presentation/dto/response/LoadDailyGoalDetailResponse.java +++ b/src/main/java/com/ject/studytrip/trip/presentation/dto/response/LoadDailyGoalDetailResponse.java @@ -25,9 +25,11 @@ public static LoadDailyGoalDetailResponse of( public record DailyGoalPomodoroResponse( @Schema(name = "뽀모도로 ID") Long pomodoroId, - @Schema(name = "뽀모도로 집중 시간(분)") int focusDurationInMinute) { + @Schema(name = "뽀모도로 집중 시간(분)") int focusDurationInMinute, + @Schema(name = "뽀모도로 집중 세션 개수") int focusSessionCount) { public static DailyGoalPomodoroResponse of(PomodoroInfo info) { - return new DailyGoalPomodoroResponse(info.pomodoroId(), info.focusDurationInMinute()); + return new DailyGoalPomodoroResponse( + info.pomodoroId(), info.focusDurationInMinute(), info.focusSessionCount()); } } diff --git a/src/test/java/com/ject/studytrip/pomodoro/application/service/PomodoroServiceTest.java b/src/test/java/com/ject/studytrip/pomodoro/application/service/PomodoroServiceTest.java index be0bd83..80cf3c0 100644 --- a/src/test/java/com/ject/studytrip/pomodoro/application/service/PomodoroServiceTest.java +++ b/src/test/java/com/ject/studytrip/pomodoro/application/service/PomodoroServiceTest.java @@ -52,7 +52,7 @@ class createPomodoro { @DisplayName("뽀모도로를 생성해 저장하고 반환한다") void shouldCreateAndReturnPomodoro() { // given - CreatePomodoroRequest request = new CreatePomodoroRequest(30); + CreatePomodoroRequest request = new CreatePomodoroRequest(30, 1); given(pomodoroRepository.save(any())).willReturn(pomodoro); // when @@ -61,6 +61,7 @@ void shouldCreateAndReturnPomodoro() { // then assertThat(result).isNotNull(); assertThat(result.getFocusDurationInSeconds()).isEqualTo(30 * 60); + assertThat(result.getFocusSessionCount()).isEqualTo(1); } } diff --git a/src/test/java/com/ject/studytrip/trip/fixture/CreateDailyGoalRequestFixture.java b/src/test/java/com/ject/studytrip/trip/fixture/CreateDailyGoalRequestFixture.java index 9e391ac..66e882c 100644 --- a/src/test/java/com/ject/studytrip/trip/fixture/CreateDailyGoalRequestFixture.java +++ b/src/test/java/com/ject/studytrip/trip/fixture/CreateDailyGoalRequestFixture.java @@ -6,7 +6,7 @@ public class CreateDailyGoalRequestFixture { - private CreatePomodoroRequest pomodoro = new CreatePomodoroRequest(30); + private CreatePomodoroRequest pomodoro = new CreatePomodoroRequest(30, 1); private List missionIds = List.of(1L, 2L); public CreateDailyGoalRequestFixture withPomodoro(CreatePomodoroRequest pomodoro) { diff --git a/src/test/java/com/ject/studytrip/trip/presentation/controller/DailyGoalControllerIntegrationTest.java b/src/test/java/com/ject/studytrip/trip/presentation/controller/DailyGoalControllerIntegrationTest.java index 6bbf3f9..41b57f4 100644 --- a/src/test/java/com/ject/studytrip/trip/presentation/controller/DailyGoalControllerIntegrationTest.java +++ b/src/test/java/com/ject/studytrip/trip/presentation/controller/DailyGoalControllerIntegrationTest.java @@ -21,6 +21,7 @@ import com.ject.studytrip.pomodoro.domain.error.PomodoroErrorCode; import com.ject.studytrip.pomodoro.domain.model.Pomodoro; import com.ject.studytrip.pomodoro.helper.PomodoroTestHelper; +import com.ject.studytrip.pomodoro.presentation.dto.request.CreatePomodoroRequest; import com.ject.studytrip.stamp.domain.error.StampErrorCode; import com.ject.studytrip.stamp.domain.model.Stamp; import com.ject.studytrip.stamp.helper.StampTestHelper; @@ -173,6 +174,50 @@ void shouldReturnBadRequestWhenInvalidRequiredFields() throws Exception { .value())); } + @Test + @DisplayName("데일리 목표의 뽀모도로 정보 중 집중 시간이 1분 미만이면 400 Bad Request를 반환한다") + void shouldReturnBadRequestWhenDailyGoalPomodoroFocusTimeInMinuteIsLessThanOneMinute() + throws Exception { + // given + CreateDailyGoalRequest request = + fixture.withPomodoro(new CreatePomodoroRequest(0, 1)).build(); + // when + ResultActions resultActions = getResultActions(token, trip.getId(), request); + + // then + resultActions + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.success").value(false)) + .andExpect( + jsonPath("$.status") + .value( + CommonErrorCode.METHOD_ARGUMENT_NOT_VALID + .getStatus() + .value())); + } + + @Test + @DisplayName("데일리 목표의 뽀모도로 정보 중 집중 세션이 1개 미만이면 400 Bad Request를 반환한다") + void shouldReturnBadRequestWhenDailyGoalPomodoroFocusSessionCountIsLessThanOne() + throws Exception { + // given + CreateDailyGoalRequest request = + fixture.withPomodoro(new CreatePomodoroRequest(30, 0)).build(); + // when + ResultActions resultActions = getResultActions(token, trip.getId(), request); + + // then + resultActions + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.success").value(false)) + .andExpect( + jsonPath("$.status") + .value( + CommonErrorCode.METHOD_ARGUMENT_NOT_VALID + .getStatus() + .value())); + } + @Test @DisplayName("유효하지 않은 여행 ID 라면 404 NotFound를 반환한다") void shouldReturnNotFoundWhenInvalidTripId() throws Exception {