From 927ea3ae8bd4bbb9421e45000813b0d5a13adaac Mon Sep 17 00:00:00 2001 From: thguss Date: Thu, 27 Jun 2024 01:36:26 +0900 Subject: [PATCH 1/7] =?UTF-8?q?[FEAT]=20=ED=85=8C=EB=A7=88=EB=B3=84=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=BC=EB=A6=AC=20=EB=A3=A8=ED=8B=B4=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C(public)=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/common/config/SecurityConfig.java | 1 + .../server/routine/adapter/RoutineFinder.java | 8 ++- .../v2/DailyRoutineControllerV2.java | 38 ++++++++++++++ .../v2/docs/DailyRoutineControllerV2Docs.java | 17 +++++++ .../DailyRoutineListAcquireResponseV2.java | 51 +++++++++++++++++++ .../server/routine/service/vo/RoutineVO.java | 25 +++++++++ 6 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java create mode 100644 src/main/java/com/soptie/server/routine/controller/v2/docs/DailyRoutineControllerV2Docs.java create mode 100644 src/main/java/com/soptie/server/routine/controller/v2/dto/response/DailyRoutineListAcquireResponseV2.java create mode 100644 src/main/java/com/soptie/server/routine/service/vo/RoutineVO.java diff --git a/src/main/java/com/soptie/server/common/config/SecurityConfig.java b/src/main/java/com/soptie/server/common/config/SecurityConfig.java index 8d15e68a..20a83e74 100644 --- a/src/main/java/com/soptie/server/common/config/SecurityConfig.java +++ b/src/main/java/com/soptie/server/common/config/SecurityConfig.java @@ -67,6 +67,7 @@ private void authorizeHttpRequests(HttpSecurity http) throws Exception { .requestMatchers(new AntPathRequestMatcher("/api/v1/routines/daily")).permitAll() .requestMatchers(new AntPathRequestMatcher("/api/v1/dolls/image/{type}")).permitAll() .requestMatchers(new AntPathRequestMatcher("/api/v1/versions/client/app")).permitAll() + .requestMatchers(new AntPathRequestMatcher("/api/v2/routines/daily", "GET")).permitAll() .requestMatchers(new AntPathRequestMatcher("/error")).permitAll() .anyRequest().authenticated() ); diff --git a/src/main/java/com/soptie/server/routine/adapter/RoutineFinder.java b/src/main/java/com/soptie/server/routine/adapter/RoutineFinder.java index 11a8525e..24d7f106 100644 --- a/src/main/java/com/soptie/server/routine/adapter/RoutineFinder.java +++ b/src/main/java/com/soptie/server/routine/adapter/RoutineFinder.java @@ -8,8 +8,10 @@ import com.soptie.server.common.support.RepositoryAdapter; import com.soptie.server.member.entity.Member; import com.soptie.server.routine.entity.Routine; +import com.soptie.server.routine.entity.RoutineType; import com.soptie.server.routine.exception.RoutineException; import com.soptie.server.routine.repository.RoutineRepository; +import com.soptie.server.routine.service.vo.RoutineVO; import com.soptie.server.theme.entity.Theme; import lombok.RequiredArgsConstructor; @@ -30,10 +32,14 @@ public List findDailyRoutinesByThemeAndNotMember(Theme theme, Member me public Routine findById(long id) { return routineRepository.findById(id) - .orElseThrow(() -> new RoutineException(INVALID_ROUTINE)); + .orElseThrow(() -> new RoutineException(INVALID_ROUTINE)); } public List findChallengeRoutinesByTheme(Long themeId) { return routineRepository.findByTypeAndThemeId(CHALLENGE, themeId); } + + public List findAllByTypeAndThemeId(RoutineType type, long themeId) { + return routineRepository.findByTypeAndThemeId(type, themeId).stream().map(RoutineVO::from).toList(); + } } diff --git a/src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java b/src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java new file mode 100644 index 00000000..f1a1afb9 --- /dev/null +++ b/src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java @@ -0,0 +1,38 @@ +package com.soptie.server.routine.controller.v2; + +import static com.soptie.server.common.dto.SuccessResponse.*; +import static com.soptie.server.routine.message.RoutineSuccessMessage.*; + +import java.util.Set; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.soptie.server.common.dto.SuccessResponse; +import com.soptie.server.routine.controller.v2.docs.DailyRoutineControllerV2Docs; +import com.soptie.server.routine.controller.v2.dto.response.DailyRoutineListAcquireResponseV2; +import com.soptie.server.routine.service.RoutineService; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v2/routines/daily") +public class DailyRoutineControllerV2 implements DailyRoutineControllerV2Docs { + + private final RoutineService routineService; + + @GetMapping + public ResponseEntity> acquireAllByThemes( + @RequestParam Set themeIds + ) { + val response = routineService.acquireAllInDailyWithThemeId(themeIds); + return ResponseEntity.ok(success( + SUCCESS_GET_ROUTINE.getMessage(), + DailyRoutineListAcquireResponseV2.from(response))); + } +} diff --git a/src/main/java/com/soptie/server/routine/controller/v2/docs/DailyRoutineControllerV2Docs.java b/src/main/java/com/soptie/server/routine/controller/v2/docs/DailyRoutineControllerV2Docs.java new file mode 100644 index 00000000..5e9d3337 --- /dev/null +++ b/src/main/java/com/soptie/server/routine/controller/v2/docs/DailyRoutineControllerV2Docs.java @@ -0,0 +1,17 @@ +package com.soptie.server.routine.controller.v2.docs; + +import java.util.Set; + +import org.springframework.http.ResponseEntity; + +import com.soptie.server.common.dto.SuccessResponse; +import com.soptie.server.routine.controller.v2.dto.response.DailyRoutineListAcquireResponseV2; + +import io.swagger.v3.oas.annotations.Parameter; + +public interface DailyRoutineControllerV2Docs { + + ResponseEntity> acquireAllByThemes( + @Parameter(name = "list of themes id", description = "조회할 테마 id 목록") Set themeIds + ); +} diff --git a/src/main/java/com/soptie/server/routine/controller/v2/dto/response/DailyRoutineListAcquireResponseV2.java b/src/main/java/com/soptie/server/routine/controller/v2/dto/response/DailyRoutineListAcquireResponseV2.java new file mode 100644 index 00000000..8269ab70 --- /dev/null +++ b/src/main/java/com/soptie/server/routine/controller/v2/dto/response/DailyRoutineListAcquireResponseV2.java @@ -0,0 +1,51 @@ +package com.soptie.server.routine.controller.v2.dto.response; + +import static lombok.AccessLevel.*; + +import java.util.List; +import java.util.Map; + +import com.soptie.server.routine.service.vo.RoutineVO; + +import jakarta.validation.constraints.NotNull; +import lombok.Builder; + +@Builder(access = PRIVATE) +public record DailyRoutineListAcquireResponseV2( + List themes +) { + + public static DailyRoutineListAcquireResponseV2 from(Map> routinesMap) { + return DailyRoutineListAcquireResponseV2.builder() + .themes(routinesMap.keySet().stream().map(key -> ThemeResponse.from(key, routinesMap.get(key))).toList()) + .build(); + } + + @Builder(access = PRIVATE) + private record ThemeResponse( + long themeId, + List routines + ) { + + private static ThemeResponse from(long themeId, List routines) { + return ThemeResponse.builder() + .themeId(themeId) + .routines(routines.stream().map(RoutineResponse::from).toList()) + .build(); + } + } + + @Builder(access = PRIVATE) + private record RoutineResponse( + long routineId, + @NotNull String content + ) { + + private static RoutineResponse from(RoutineVO routine) { + return RoutineResponse.builder() + .routineId(routine.routineId()) + .content(routine.content()) + .build(); + } + } +} diff --git a/src/main/java/com/soptie/server/routine/service/vo/RoutineVO.java b/src/main/java/com/soptie/server/routine/service/vo/RoutineVO.java new file mode 100644 index 00000000..ff191d61 --- /dev/null +++ b/src/main/java/com/soptie/server/routine/service/vo/RoutineVO.java @@ -0,0 +1,25 @@ +package com.soptie.server.routine.service.vo; + +import static lombok.AccessLevel.*; + +import com.soptie.server.routine.entity.Routine; +import com.soptie.server.routine.entity.RoutineType; + +import jakarta.validation.constraints.NotNull; +import lombok.Builder; + +@Builder(access = PRIVATE) +public record RoutineVO( + long routineId, + @NotNull String content, + @NotNull RoutineType routineType +) { + + public static RoutineVO from(Routine routine) { + return RoutineVO.builder() + .routineId(routine.getId()) + .content(routine.getContent()) + .routineType(routine.getType()) + .build(); + } +} From f81426fbdbebc34f208015961ef10d4d8907ad90 Mon Sep 17 00:00:00 2001 From: thguss Date: Thu, 27 Jun 2024 01:36:30 +0900 Subject: [PATCH 2/7] =?UTF-8?q?[FEAT]=20=ED=85=8C=EB=A7=88=EB=B3=84=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=BC=EB=A6=AC=20=EB=A3=A8=ED=8B=B4=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C(public)=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/routine/service/RoutineService.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/com/soptie/server/routine/service/RoutineService.java b/src/main/java/com/soptie/server/routine/service/RoutineService.java index c92c9903..f2a12125 100644 --- a/src/main/java/com/soptie/server/routine/service/RoutineService.java +++ b/src/main/java/com/soptie/server/routine/service/RoutineService.java @@ -1,5 +1,12 @@ package com.soptie.server.routine.service; +import static com.soptie.server.routine.entity.RoutineType.*; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -13,6 +20,7 @@ import com.soptie.server.routine.service.dto.response.DailyRoutineListGetServiceResponse; import com.soptie.server.routine.service.dto.response.HappinessRoutineListGetServiceResponse; import com.soptie.server.routine.service.dto.response.HappinessSubRoutineListGetServiceResponse; +import com.soptie.server.routine.service.vo.RoutineVO; import com.soptie.server.theme.adapter.ThemeFinder; import lombok.RequiredArgsConstructor; @@ -54,4 +62,14 @@ public HappinessSubRoutineListGetServiceResponse getHappinessSubRoutines( val subRoutines = challengeFinder.findByRoutine(routine); return HappinessSubRoutineListGetServiceResponse.of(routine, subRoutines); } + + public Map> acquireAllInDailyWithThemeId(Set themeIds) { + System.out.println(themeIds); + val themeToRoutine = new LinkedHashMap>(); + for (val themeId : themeIds) { + val routines = routineFinder.findAllByTypeAndThemeId(DAILY, themeId); + themeToRoutine.put(themeId, routines); + } + return themeToRoutine; + } } From f980cf162f5487c1c43c4afb40df51959625c85b Mon Sep 17 00:00:00 2001 From: thguss Date: Thu, 27 Jun 2024 02:00:01 +0900 Subject: [PATCH 3/7] =?UTF-8?q?[FIX]=20=EC=88=9C=EC=84=9C=20=EB=B3=B4?= =?UTF-8?q?=EC=9E=A5=EC=9D=B4=20=EA=B0=80=EB=8A=A5=ED=95=9C=20Set=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EC=B2=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../routine/controller/v2/DailyRoutineControllerV2.java | 4 ++-- .../controller/v2/docs/DailyRoutineControllerV2Docs.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java b/src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java index f1a1afb9..bed4bf0e 100644 --- a/src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java +++ b/src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java @@ -3,7 +3,7 @@ import static com.soptie.server.common.dto.SuccessResponse.*; import static com.soptie.server.routine.message.RoutineSuccessMessage.*; -import java.util.Set; +import java.util.LinkedHashSet; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -28,7 +28,7 @@ public class DailyRoutineControllerV2 implements DailyRoutineControllerV2Docs { @GetMapping public ResponseEntity> acquireAllByThemes( - @RequestParam Set themeIds + @RequestParam LinkedHashSet themeIds ) { val response = routineService.acquireAllInDailyWithThemeId(themeIds); return ResponseEntity.ok(success( diff --git a/src/main/java/com/soptie/server/routine/controller/v2/docs/DailyRoutineControllerV2Docs.java b/src/main/java/com/soptie/server/routine/controller/v2/docs/DailyRoutineControllerV2Docs.java index 5e9d3337..43c3505f 100644 --- a/src/main/java/com/soptie/server/routine/controller/v2/docs/DailyRoutineControllerV2Docs.java +++ b/src/main/java/com/soptie/server/routine/controller/v2/docs/DailyRoutineControllerV2Docs.java @@ -1,6 +1,6 @@ package com.soptie.server.routine.controller.v2.docs; -import java.util.Set; +import java.util.LinkedHashSet; import org.springframework.http.ResponseEntity; @@ -12,6 +12,6 @@ public interface DailyRoutineControllerV2Docs { ResponseEntity> acquireAllByThemes( - @Parameter(name = "list of themes id", description = "조회할 테마 id 목록") Set themeIds + @Parameter(name = "list of themes id", description = "조회할 테마 id 목록") LinkedHashSet themeIds ); } From bf280d3c1544dd4354ea961db7169cc5a2391f6a Mon Sep 17 00:00:00 2001 From: thguss Date: Thu, 27 Jun 2024 02:00:17 +0900 Subject: [PATCH 4/7] =?UTF-8?q?[TEST]=20=ED=85=8C=EB=A7=88=EB=B3=84=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=BC=EB=A6=AC=20=EB=A3=A8=ED=8B=B4=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RoutineServiceIntegrationTest.java | 104 ++++++++++++------ 1 file changed, 68 insertions(+), 36 deletions(-) diff --git a/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java b/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java index 51819b16..487ad0ed 100644 --- a/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java +++ b/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java @@ -3,7 +3,10 @@ import static com.soptie.server.routine.entity.RoutineType.*; import static org.assertj.core.api.Assertions.*; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -30,6 +33,7 @@ import com.soptie.server.routine.service.dto.response.HappinessRoutineListGetServiceResponse.HappinessRoutineServiceResponse; import com.soptie.server.routine.service.dto.response.HappinessSubRoutineListGetServiceResponse; import com.soptie.server.routine.service.dto.response.HappinessSubRoutineListGetServiceResponse.HappinessSubRoutineServiceResponse; +import com.soptie.server.routine.service.vo.RoutineVO; import com.soptie.server.support.IntegrationTest; import com.soptie.server.support.fixture.ChallengeFixture; import com.soptie.server.support.fixture.MemberFixture; @@ -62,44 +66,72 @@ public class RoutineServiceIntegrationTest { ChallengeRepository challengeRepository; @Nested - class AcquireDailyRoutineByTheme { - - Routine routine1; - Routine routine2; - Routine routine3; - Theme theme1; - Theme theme2; - Theme theme3; - - @BeforeEach - void setUp() { - theme1 = themeRepository.save(ThemeFixture.theme().name("관계 쌓기").build()); - theme2 = themeRepository.save(ThemeFixture.theme().name("한 걸음 성장").build()); - theme3 = themeRepository.save(ThemeFixture.theme().name("새로운 나").build()); - - routine1 = routineRepository.save( - RoutineFixture.routine().type(DAILY).content("관계를 쌓아보자").theme(theme1).build()); - routine2 = routineRepository.save( - RoutineFixture.routine().type(DAILY).content("성장하자").theme(theme2).build()); - routine3 = routineRepository.save( - RoutineFixture.routine().type(DAILY).content("보여줄게 완전히 달라진 나").theme(theme3).build()); + class DailyRoutine { + + @Nested + class Acquire { + + Theme theme1; + Theme theme2; + Theme theme3; + + Routine routineOfTheme1; + Routine routineOfTheme2; + Routine routineOfTheme3; + + @BeforeEach + void setUp() { + theme1 = themeRepository.save(ThemeFixture.theme().name("관계 쌓기").build()); + theme2 = themeRepository.save(ThemeFixture.theme().name("한 걸음 성장").build()); + theme3 = themeRepository.save(ThemeFixture.theme().name("새로운 나").build()); + + routineOfTheme1 = routineRepository.save( + RoutineFixture.routine().type(DAILY).content("관계를 쌓아보자").theme(theme1).build()); + routineOfTheme2 = routineRepository.save( + RoutineFixture.routine().type(DAILY).content("성장하자").theme(theme2).build()); + routineOfTheme3 = routineRepository.save( + RoutineFixture.routine().type(DAILY).content("보여줄게 완전히 달라진 나").theme(theme3).build()); + } + + @Test + @DisplayName("[성공] 테마 id 목록에 포함된 테마를 갖는 데일리 루틴 목록을 조회한다.") + void acquireAllByThemeIds() { + // given + List themeIds = List.of(theme1.getId(), theme2.getId()); + DailyRoutineListByThemesGetServiceRequest request = DailyRoutineListByThemesGetServiceRequest.of( + themeIds); + + // when + final DailyRoutineListGetServiceResponse actual = routineService.getRoutinesByThemes(request); + + // then + assertThat(actual.routines()).hasSize(2); + List routineIds = actual.routines().stream().map(DailyRoutineServiceResponse::routineId).toList(); + assertThat(routineIds).containsExactlyInAnyOrder(routineOfTheme1.getId(), routineOfTheme2.getId()); + } + + @Test + @DisplayName("[성공] 각 테마(id)별로 데일리 루틴 목록을 조회한다.") + void acquireAllWithThemeIds() { + // given + Set themeIds = new LinkedHashSet<>(); + themeIds.add(theme2.getId()); + themeIds.add(theme1.getId()); + + // when + final Map> actual = routineService.acquireAllInDailyWithThemeId(themeIds); + + // then + assertThat(actual.keySet()).containsExactly(theme2.getId(), theme1.getId()); + + List routineIdsForTheme1 = actual.get(theme1.getId()).stream().map(RoutineVO::routineId).toList(); + assertThat(routineIdsForTheme1).containsExactlyInAnyOrder(routineOfTheme1.getId()); + + List routineIdsForTheme2 = actual.get(theme2.getId()).stream().map(RoutineVO::routineId).toList(); + assertThat(routineIdsForTheme2).containsExactlyInAnyOrder(routineOfTheme2.getId()); + } } - @Test - @DisplayName("[성공] 테마 id 목록에 포함된 테마를 갖는 데일리 루틴 목록을 조회한다.") - void getDailyRoutinesByThemeIds() { - // given - List themeIds = List.of(theme1.getId(), theme2.getId()); - DailyRoutineListByThemesGetServiceRequest request = DailyRoutineListByThemesGetServiceRequest.of(themeIds); - - // when - final DailyRoutineListGetServiceResponse actual = routineService.getRoutinesByThemes(request); - - // then - assertThat(actual.routines()).hasSize(2); - List routineIds = actual.routines().stream().map(DailyRoutineServiceResponse::routineId).toList(); - assertThat(routineIds).containsExactlyInAnyOrder(routine1.getId(), routine2.getId()); - } } @Nested From 73ed6bdc30020755ad7805fd9e61905d3a9c102c Mon Sep 17 00:00:00 2001 From: thguss Date: Thu, 27 Jun 2024 02:02:03 +0900 Subject: [PATCH 5/7] =?UTF-8?q?[DELETE]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/soptie/server/routine/service/RoutineService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/soptie/server/routine/service/RoutineService.java b/src/main/java/com/soptie/server/routine/service/RoutineService.java index f2a12125..82406346 100644 --- a/src/main/java/com/soptie/server/routine/service/RoutineService.java +++ b/src/main/java/com/soptie/server/routine/service/RoutineService.java @@ -64,7 +64,6 @@ public HappinessSubRoutineListGetServiceResponse getHappinessSubRoutines( } public Map> acquireAllInDailyWithThemeId(Set themeIds) { - System.out.println(themeIds); val themeToRoutine = new LinkedHashMap>(); for (val themeId : themeIds) { val routines = routineFinder.findAllByTypeAndThemeId(DAILY, themeId); From 29ef824c67d04c435ab9693a532744653d153670 Mon Sep 17 00:00:00 2001 From: thguss Date: Thu, 27 Jun 2024 10:22:01 +0900 Subject: [PATCH 6/7] =?UTF-8?q?[ADD]=20import=20=EA=B5=AC=EC=B2=B4?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../routine/service/RoutineService.java | 5 +- .../server/routine/service/vo/RoutineVO.java | 5 +- .../RoutineServiceIntegrationTest.java | 57 ++++++++++--------- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/soptie/server/routine/service/RoutineService.java b/src/main/java/com/soptie/server/routine/service/RoutineService.java index 82406346..7659b323 100644 --- a/src/main/java/com/soptie/server/routine/service/RoutineService.java +++ b/src/main/java/com/soptie/server/routine/service/RoutineService.java @@ -1,7 +1,5 @@ package com.soptie.server.routine.service; -import static com.soptie.server.routine.entity.RoutineType.*; - import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -13,6 +11,7 @@ import com.soptie.server.member.adapter.MemberFinder; import com.soptie.server.routine.adapter.ChallengeFinder; import com.soptie.server.routine.adapter.RoutineFinder; +import com.soptie.server.routine.entity.RoutineType; import com.soptie.server.routine.service.dto.request.DailyRoutineListByThemeGetServiceRequest; import com.soptie.server.routine.service.dto.request.DailyRoutineListByThemesGetServiceRequest; import com.soptie.server.routine.service.dto.request.HappinessRoutineListGetServiceRequest; @@ -66,7 +65,7 @@ public HappinessSubRoutineListGetServiceResponse getHappinessSubRoutines( public Map> acquireAllInDailyWithThemeId(Set themeIds) { val themeToRoutine = new LinkedHashMap>(); for (val themeId : themeIds) { - val routines = routineFinder.findAllByTypeAndThemeId(DAILY, themeId); + val routines = routineFinder.findAllByTypeAndThemeId(RoutineType.DAILY, themeId); themeToRoutine.put(themeId, routines); } return themeToRoutine; diff --git a/src/main/java/com/soptie/server/routine/service/vo/RoutineVO.java b/src/main/java/com/soptie/server/routine/service/vo/RoutineVO.java index ff191d61..46ed452b 100644 --- a/src/main/java/com/soptie/server/routine/service/vo/RoutineVO.java +++ b/src/main/java/com/soptie/server/routine/service/vo/RoutineVO.java @@ -1,14 +1,13 @@ package com.soptie.server.routine.service.vo; -import static lombok.AccessLevel.*; - import com.soptie.server.routine.entity.Routine; import com.soptie.server.routine.entity.RoutineType; import jakarta.validation.constraints.NotNull; +import lombok.AccessLevel; import lombok.Builder; -@Builder(access = PRIVATE) +@Builder(access = AccessLevel.PRIVATE) public record RoutineVO( long routineId, @NotNull String content, diff --git a/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java b/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java index 487ad0ed..7aa114c5 100644 --- a/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java +++ b/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java @@ -1,13 +1,11 @@ package com.soptie.server.routine.service.integration; -import static com.soptie.server.routine.entity.RoutineType.*; -import static org.assertj.core.api.Assertions.*; - import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -20,6 +18,7 @@ import com.soptie.server.memberroutine.repository.MemberRoutineRepository; import com.soptie.server.routine.entity.Challenge; import com.soptie.server.routine.entity.Routine; +import com.soptie.server.routine.entity.RoutineType; import com.soptie.server.routine.repository.ChallengeRepository; import com.soptie.server.routine.repository.RoutineRepository; import com.soptie.server.routine.service.RoutineService; @@ -86,11 +85,11 @@ void setUp() { theme3 = themeRepository.save(ThemeFixture.theme().name("새로운 나").build()); routineOfTheme1 = routineRepository.save( - RoutineFixture.routine().type(DAILY).content("관계를 쌓아보자").theme(theme1).build()); + RoutineFixture.routine().type(RoutineType.DAILY).content("관계를 쌓아보자").theme(theme1).build()); routineOfTheme2 = routineRepository.save( - RoutineFixture.routine().type(DAILY).content("성장하자").theme(theme2).build()); + RoutineFixture.routine().type(RoutineType.DAILY).content("성장하자").theme(theme2).build()); routineOfTheme3 = routineRepository.save( - RoutineFixture.routine().type(DAILY).content("보여줄게 완전히 달라진 나").theme(theme3).build()); + RoutineFixture.routine().type(RoutineType.DAILY).content("완전히 달라진 나").theme(theme3).build()); } @Test @@ -105,13 +104,14 @@ void acquireAllByThemeIds() { final DailyRoutineListGetServiceResponse actual = routineService.getRoutinesByThemes(request); // then - assertThat(actual.routines()).hasSize(2); + Assertions.assertThat(actual.routines()).hasSize(2); List routineIds = actual.routines().stream().map(DailyRoutineServiceResponse::routineId).toList(); - assertThat(routineIds).containsExactlyInAnyOrder(routineOfTheme1.getId(), routineOfTheme2.getId()); + Assertions.assertThat(routineIds) + .containsExactlyInAnyOrder(routineOfTheme1.getId(), routineOfTheme2.getId()); } @Test - @DisplayName("[성공] 각 테마(id)별로 데일리 루틴 목록을 조회한다.") + @DisplayName("[성공] 각 테마 id 별로 데일리 루틴 목록을 조회한다.") void acquireAllWithThemeIds() { // given Set themeIds = new LinkedHashSet<>(); @@ -122,13 +122,13 @@ void acquireAllWithThemeIds() { final Map> actual = routineService.acquireAllInDailyWithThemeId(themeIds); // then - assertThat(actual.keySet()).containsExactly(theme2.getId(), theme1.getId()); + Assertions.assertThat(actual.keySet()).containsExactly(theme2.getId(), theme1.getId()); List routineIdsForTheme1 = actual.get(theme1.getId()).stream().map(RoutineVO::routineId).toList(); - assertThat(routineIdsForTheme1).containsExactlyInAnyOrder(routineOfTheme1.getId()); + Assertions.assertThat(routineIdsForTheme1).containsExactlyInAnyOrder(routineOfTheme1.getId()); List routineIdsForTheme2 = actual.get(theme2.getId()).stream().map(RoutineVO::routineId).toList(); - assertThat(routineIdsForTheme2).containsExactlyInAnyOrder(routineOfTheme2.getId()); + Assertions.assertThat(routineIdsForTheme2).containsExactlyInAnyOrder(routineOfTheme2.getId()); } } @@ -151,18 +151,19 @@ void setUp() { theme = themeRepository.save(ThemeFixture.theme().name("관계 쌓기").build()); routine1 = routineRepository.save( - RoutineFixture.routine().type(DAILY).content("관계 쌓자").theme(theme).build()); + RoutineFixture.routine().type(RoutineType.DAILY).content("관계 쌓자").theme(theme).build()); routine2 = routineRepository.save( - RoutineFixture.routine().type(DAILY).content("쌓자 관계").theme(theme).build()); - routineNoTheme = routineRepository.save(RoutineFixture.routine().type(DAILY).content("테마 없음").build()); + RoutineFixture.routine().type(RoutineType.DAILY).content("쌓자 관계").theme(theme).build()); + routineNoTheme = routineRepository.save( + RoutineFixture.routine().type(RoutineType.DAILY).content("테마 없음").build()); routineMemberHas = routineRepository.save( - RoutineFixture.routine().type(DAILY).content("쌓자 관계").theme(theme).build()); + RoutineFixture.routine().type(RoutineType.DAILY).content("쌓자 관계").theme(theme).build()); challengeRoutine = routineRepository.save( - RoutineFixture.routine().type(CHALLENGE).content("관계 도전").theme(theme).build()); + RoutineFixture.routine().type(RoutineType.CHALLENGE).content("관계 도전").theme(theme).build()); memberRoutineRepository.save( MemberRoutineFixture.memberRoutine() - .type(DAILY) + .type(RoutineType.DAILY) .routineId(routineMemberHas.getId()) .member(member) .build()); @@ -180,7 +181,7 @@ void getDailyRoutinesByThemeMemberNotHas() { // then List routineIds = actual.routines().stream().map(DailyRoutineServiceResponse::routineId).toList(); - assertThat(routineIds).containsExactlyInAnyOrder(routine1.getId(), routine2.getId()); + Assertions.assertThat(routineIds).containsExactlyInAnyOrder(routine1.getId(), routine2.getId()); } } @@ -199,11 +200,11 @@ void setUp() { theme2 = themeRepository.save(ThemeFixture.theme().name("한 걸음 성장").color("민트").build()); routine1 = routineRepository.save( - RoutineFixture.routine().type(CHALLENGE).content("관계쌓는").theme(theme1).build()); + RoutineFixture.routine().type(RoutineType.CHALLENGE).content("관계쌓는").theme(theme1).build()); routine2 = routineRepository.save( - RoutineFixture.routine().type(CHALLENGE).content("성장하는").theme(theme1).build()); + RoutineFixture.routine().type(RoutineType.CHALLENGE).content("성장하는").theme(theme1).build()); routine3 = routineRepository.save( - RoutineFixture.routine().type(CHALLENGE).content("보여주는").theme(theme2).build()); + RoutineFixture.routine().type(RoutineType.CHALLENGE).content("보여주는").theme(theme2).build()); } @Test @@ -216,9 +217,9 @@ void getHappinessRoutinesByTheme() { final HappinessRoutineListGetServiceResponse actual = routineService.getHappinessRoutinesByTheme(request); // then - assertThat(actual.routines()).hasSize(2); + Assertions.assertThat(actual.routines()).hasSize(2); List routineIds = actual.routines().stream().map(HappinessRoutineServiceResponse::routineId).toList(); - assertThat(routineIds).containsExactlyInAnyOrder(routine1.getId(), routine2.getId()); + Assertions.assertThat(routineIds).containsExactlyInAnyOrder(routine1.getId(), routine2.getId()); } } @@ -237,9 +238,9 @@ void setUp() { theme = themeRepository.save(ThemeFixture.theme().name("관계 쌓기").color("라일락").build()); routine1 = routineRepository.save( - RoutineFixture.routine().type(CHALLENGE).content("관계쌓는").theme(theme).build()); + RoutineFixture.routine().type(RoutineType.CHALLENGE).content("관계쌓는").theme(theme).build()); routine2 = routineRepository.save( - RoutineFixture.routine().type(CHALLENGE).content("성장하는").theme(theme).build()); + RoutineFixture.routine().type(RoutineType.CHALLENGE).content("성장하는").theme(theme).build()); challenge1 = challengeRepository.save(ChallengeFixture.challenge().routine(routine1).build()); challenge2 = challengeRepository.save(ChallengeFixture.challenge().routine(routine1).build()); @@ -257,11 +258,11 @@ void getHappinessSubRoutinesByRoutine() { final HappinessSubRoutineListGetServiceResponse actual = routineService.getHappinessSubRoutines(request); // then - assertThat(actual.challenges()).hasSize(2); + Assertions.assertThat(actual.challenges()).hasSize(2); List challengeIds = actual.challenges().stream() .map(HappinessSubRoutineServiceResponse::challengeId).toList(); - assertThat(challengeIds).containsExactlyInAnyOrder(challenge1.getId(), challenge2.getId()); + Assertions.assertThat(challengeIds).containsExactlyInAnyOrder(challenge1.getId(), challenge2.getId()); } } } From 48929e5cb732f205d221a5bf3659de1a794f7d3d Mon Sep 17 00:00:00 2001 From: thguss Date: Thu, 27 Jun 2024 10:26:32 +0900 Subject: [PATCH 7/7] =?UTF-8?q?[ADD]=20import=20=EA=B5=AC=EC=B2=B4?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../routine/controller/v2/DailyRoutineControllerV2.java | 8 +++----- .../dto/response/DailyRoutineListAcquireResponseV2.java | 9 ++++----- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java b/src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java index bed4bf0e..b9a6f75b 100644 --- a/src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java +++ b/src/main/java/com/soptie/server/routine/controller/v2/DailyRoutineControllerV2.java @@ -1,8 +1,5 @@ package com.soptie.server.routine.controller.v2; -import static com.soptie.server.common.dto.SuccessResponse.*; -import static com.soptie.server.routine.message.RoutineSuccessMessage.*; - import java.util.LinkedHashSet; import org.springframework.http.ResponseEntity; @@ -14,6 +11,7 @@ import com.soptie.server.common.dto.SuccessResponse; import com.soptie.server.routine.controller.v2.docs.DailyRoutineControllerV2Docs; import com.soptie.server.routine.controller.v2.dto.response.DailyRoutineListAcquireResponseV2; +import com.soptie.server.routine.message.RoutineSuccessMessage; import com.soptie.server.routine.service.RoutineService; import lombok.RequiredArgsConstructor; @@ -31,8 +29,8 @@ public ResponseEntity> acquir @RequestParam LinkedHashSet themeIds ) { val response = routineService.acquireAllInDailyWithThemeId(themeIds); - return ResponseEntity.ok(success( - SUCCESS_GET_ROUTINE.getMessage(), + return ResponseEntity.ok(SuccessResponse.success( + RoutineSuccessMessage.SUCCESS_GET_ROUTINE.getMessage(), DailyRoutineListAcquireResponseV2.from(response))); } } diff --git a/src/main/java/com/soptie/server/routine/controller/v2/dto/response/DailyRoutineListAcquireResponseV2.java b/src/main/java/com/soptie/server/routine/controller/v2/dto/response/DailyRoutineListAcquireResponseV2.java index 8269ab70..b870fb56 100644 --- a/src/main/java/com/soptie/server/routine/controller/v2/dto/response/DailyRoutineListAcquireResponseV2.java +++ b/src/main/java/com/soptie/server/routine/controller/v2/dto/response/DailyRoutineListAcquireResponseV2.java @@ -1,16 +1,15 @@ package com.soptie.server.routine.controller.v2.dto.response; -import static lombok.AccessLevel.*; - import java.util.List; import java.util.Map; import com.soptie.server.routine.service.vo.RoutineVO; import jakarta.validation.constraints.NotNull; +import lombok.AccessLevel; import lombok.Builder; -@Builder(access = PRIVATE) +@Builder(access = AccessLevel.PRIVATE) public record DailyRoutineListAcquireResponseV2( List themes ) { @@ -21,7 +20,7 @@ public static DailyRoutineListAcquireResponseV2 from(Map> .build(); } - @Builder(access = PRIVATE) + @Builder(access = AccessLevel.PRIVATE) private record ThemeResponse( long themeId, List routines @@ -35,7 +34,7 @@ private static ThemeResponse from(long themeId, List routines) { } } - @Builder(access = PRIVATE) + @Builder(access = AccessLevel.PRIVATE) private record RoutineResponse( long routineId, @NotNull String content