diff --git a/modules/study/src/main/java/kr/spot/study/application/query/GetMyStudyInfoService.java b/modules/study/src/main/java/kr/spot/study/application/query/GetMyStudyInfoService.java index 1be4610..e0cb93b 100644 --- a/modules/study/src/main/java/kr/spot/study/application/query/GetMyStudyInfoService.java +++ b/modules/study/src/main/java/kr/spot/study/application/query/GetMyStudyInfoService.java @@ -34,21 +34,21 @@ public class GetMyStudyInfoService { public GetStudyOverviewResponse getMyStudyOverview( long viewerId, - StudyMemberStatus status, + List statuses, Long cursor, int size ) { final int pageSize = Math.min(size, MAX_PAGE_SIZE); List rows = studyQueryRepository.findMyStudies( viewerId, - status, + statuses, cursor, pageSize + 1 ); long totalElements = studyQueryRepository.countMyStudies( viewerId, - status + statuses ); return toCursorPage(rows, viewerId, pageSize, totalElements); } @@ -66,7 +66,8 @@ public GetStudyOverviewResponse getMyPreferredRegionStudies( ) { final int pageSize = Math.min(size, MAX_PAGE_SIZE); List preferredRegionCodes = getPreferredRegionPort.get(viewerId); - List filteredRegionCodes = filterPreferredRegionCodes(regionCodes, preferredRegionCodes); + List filteredRegionCodes = filterPreferredRegionCodes(regionCodes, + preferredRegionCodes); List rows = studyQueryRepository.findMyPreferredRegionStudies( recruitingStatus, diff --git a/modules/study/src/main/java/kr/spot/study/infrastructure/jpa/querydsl/StudyQueryRepository.java b/modules/study/src/main/java/kr/spot/study/infrastructure/jpa/querydsl/StudyQueryRepository.java index 85c4c7d..085624a 100644 --- a/modules/study/src/main/java/kr/spot/study/infrastructure/jpa/querydsl/StudyQueryRepository.java +++ b/modules/study/src/main/java/kr/spot/study/infrastructure/jpa/querydsl/StudyQueryRepository.java @@ -27,7 +27,7 @@ public class StudyQueryRepository { public List findMyStudies( Long viewerId, - StudyMemberStatus status, + List statuses, Long cursor, int limit) { QStudy study = QStudy.study; @@ -39,7 +39,7 @@ public List findMyStudies( .join(study).on(study.id.eq(studyMember.studyId)) .where( studyMember.memberId.eq(viewerId), - studyMember.studyMemberStatus.eq(status), + studyMember.studyMemberStatus.in(statuses), ltCursor(cursor, study) ) .orderBy(study.id.desc()) @@ -49,7 +49,7 @@ public List findMyStudies( public long countMyStudies( Long viewerId, - StudyMemberStatus status + List statuses ) { QStudy study = QStudy.study; QStudyMember studyMember = QStudyMember.studyMember; @@ -60,7 +60,7 @@ public long countMyStudies( .join(study).on(study.id.eq(studyMember.studyId)) .where( studyMember.memberId.eq(viewerId), - studyMember.studyMemberStatus.eq(status) + studyMember.studyMemberStatus.in(statuses) ) .fetchOne(); } diff --git a/modules/study/src/main/java/kr/spot/study/presentation/query/StudySearchController.java b/modules/study/src/main/java/kr/spot/study/presentation/query/StudySearchController.java index bff17fc..53afef5 100644 --- a/modules/study/src/main/java/kr/spot/study/presentation/query/StudySearchController.java +++ b/modules/study/src/main/java/kr/spot/study/presentation/query/StudySearchController.java @@ -34,17 +34,17 @@ public class StudySearchController { @Operation(summary = "마이페이지 스터디 조회", description = "마이페이지에 필요한 스터디를 조회합니다.\n " + "\n 모집 중인 스터디 : status = OWNER (기본값) \n" - + "\n 참여 중인 스터디 : status = APPROVED \n " + + "\n 참여 중인 스터디 : statuses = {OWNER, APPROVED} \n " + "\n 대기 중인 스터디 : status = APPLIED") @GetMapping("/me") public ResponseEntity> getMyStudies( @CurrentMember @Parameter(hidden = true) Long viewerId, - @RequestParam(required = false, defaultValue = "OWNER") StudyMemberStatus status, + @RequestParam(required = false, defaultValue = "OWNER") List statuses, @RequestParam(required = false) Long cursor, @RequestParam(defaultValue = "10") @Min(1) @Max(50) Integer size ) { return ResponseEntity.ok(ApiResponse.onSuccess(SuccessStatus._OK, - getMyStudyInfoService.getMyStudyOverview(viewerId, status, cursor, size))); + getMyStudyInfoService.getMyStudyOverview(viewerId, statuses, cursor, size))); } @Operation(summary = "전공/진로학습 이건 어때요? 스터디 조회", diff --git a/modules/study/src/test/java/kr/spot/study/application/query/GetMyStudyInfoServiceTest.java b/modules/study/src/test/java/kr/spot/study/application/query/GetMyStudyInfoServiceTest.java index 7293ba5..33c437b 100644 --- a/modules/study/src/test/java/kr/spot/study/application/query/GetMyStudyInfoServiceTest.java +++ b/modules/study/src/test/java/kr/spot/study/application/query/GetMyStudyInfoServiceTest.java @@ -15,12 +15,12 @@ import kr.spot.ports.GetPreferredCategoryPort; import kr.spot.ports.GetPreferredRegionPort; import kr.spot.study.domain.Study; -import kr.spot.study.infrastructure.jpa.associations.StudyLikeRepository; import kr.spot.study.domain.enums.Category; import kr.spot.study.domain.enums.FeeCategory; import kr.spot.study.domain.enums.RecruitingStatus; import kr.spot.study.domain.enums.SortBy; import kr.spot.study.domain.enums.StudyMemberStatus; +import kr.spot.study.infrastructure.jpa.associations.StudyLikeRepository; import kr.spot.study.infrastructure.jpa.querydsl.StudyQueryRepository; import kr.spot.study.presentation.query.dto.response.GetStudyOverviewResponse; import org.junit.jupiter.api.DisplayName; @@ -61,18 +61,20 @@ void should_return_first_page_with_next_page() { List studies = createStudies(pageSize + 1); // 11개 생성 Long expectedNextCursor = studies.get(pageSize - 1).getId(); // 10번째 스터디의 ID - given(studyQueryRepository.findMyStudies(viewerId, status, null, pageSize + 1)) + given(studyQueryRepository.findMyStudies(viewerId, List.of(status), null, pageSize + 1)) .willReturn(studies); - given(studyQueryRepository.countMyStudies(viewerId, status)).willReturn((long) studies.size()); + given(studyQueryRepository.countMyStudies(viewerId, List.of(status))).willReturn( + (long) studies.size()); given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of()); // when - GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, status, + GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, + List.of(status), null, pageSize); // then - verify(studyQueryRepository).findMyStudies(viewerId, status, null, pageSize + 1); + verify(studyQueryRepository).findMyStudies(viewerId, List.of(status), null, pageSize + 1); assertThat(response.content()).hasSize(pageSize); assertThat(response.hasNext()).isTrue(); assertThat(response.nextCursor()).isEqualTo(expectedNextCursor); @@ -85,18 +87,20 @@ void should_return_last_page() { int pageSize = 10; List studies = createStudies(5); // 5개 생성 (pageSize보다 적음) - given(studyQueryRepository.findMyStudies(viewerId, status, null, pageSize + 1)) + given(studyQueryRepository.findMyStudies(viewerId, List.of(status), null, pageSize + 1)) .willReturn(studies); - given(studyQueryRepository.countMyStudies(viewerId, status)).willReturn((long) studies.size()); + given(studyQueryRepository.countMyStudies(viewerId, List.of(status))).willReturn( + (long) studies.size()); given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of()); // when - GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, status, + GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, + List.of(status), null, pageSize); // then - verify(studyQueryRepository).findMyStudies(viewerId, status, null, pageSize + 1); + verify(studyQueryRepository).findMyStudies(viewerId, List.of(status), null, pageSize + 1); assertThat(response.content()).hasSize(5); assertThat(response.hasNext()).isFalse(); assertThat(response.nextCursor()).isNull(); @@ -111,18 +115,20 @@ void should_return_next_page_with_cursor() { List studies = createStudies(pageSize + 1); Long expectedNextCursor = studies.get(pageSize - 1).getId(); - given(studyQueryRepository.findMyStudies(viewerId, status, cursor, pageSize + 1)) + given(studyQueryRepository.findMyStudies(viewerId, List.of(status), cursor, pageSize + 1)) .willReturn(studies); - given(studyQueryRepository.countMyStudies(viewerId, status)).willReturn((long) studies.size()); + given(studyQueryRepository.countMyStudies(viewerId, List.of(status))).willReturn( + (long) studies.size()); given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of()); // when - GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, status, + GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, + List.of(status), cursor, pageSize); // then - verify(studyQueryRepository).findMyStudies(viewerId, status, cursor, pageSize + 1); + verify(studyQueryRepository).findMyStudies(viewerId, List.of(status), cursor, pageSize + 1); assertThat(response.content()).hasSize(pageSize); assertThat(response.hasNext()).isTrue(); assertThat(response.nextCursor()).isEqualTo(expectedNextCursor); @@ -136,18 +142,20 @@ void should_cap_page_size_at_max_page_size() { int maxPageSize = GetMyStudyInfoService.MAX_PAGE_SIZE; // 50 List studies = createStudies(maxPageSize + 1); // 51개 생성 - given(studyQueryRepository.findMyStudies(viewerId, status, null, maxPageSize + 1)) + given(studyQueryRepository.findMyStudies(viewerId, List.of(status), null, maxPageSize + 1)) .willReturn(studies); - given(studyQueryRepository.countMyStudies(viewerId, status)).willReturn((long) studies.size()); + given(studyQueryRepository.countMyStudies(viewerId, List.of(status))).willReturn( + (long) studies.size()); given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of()); // when - GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, status, + GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, + List.of(status), null, requestedSize); // then - verify(studyQueryRepository).findMyStudies(viewerId, status, null, maxPageSize + 1); + verify(studyQueryRepository).findMyStudies(viewerId, List.of(status), null, maxPageSize + 1); assertThat(response.content()).hasSize(maxPageSize); assertThat(response.hasNext()).isTrue(); } @@ -172,7 +180,8 @@ void should_find_studies_in_all_preferred_regions_when_no_filter() { given(studyQueryRepository.findMyPreferredRegionStudies(any(), any(), any(), any(), any(), any(), anyInt(), eq(preferredRegions))) .willReturn(studies); - given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(), eq(preferredRegions))) + given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(), + eq(preferredRegions))) .willReturn((long) studies.size()); given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of()); @@ -206,7 +215,8 @@ void should_find_studies_in_filtered_preferred_regions() { given(studyQueryRepository.findMyPreferredRegionStudies(any(), any(), any(), any(), any(), any(), anyInt(), eq(expectedRegions))) .willReturn(studies); - given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(), eq(expectedRegions))) + given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(), + eq(expectedRegions))) .willReturn((long) studies.size()); given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of()); @@ -233,7 +243,8 @@ void should_return_empty_when_no_preferred_regions() { given(studyQueryRepository.findMyPreferredRegionStudies(any(), any(), any(), any(), any(), any(), anyInt(), eq(Collections.emptyList()))) .willReturn(Collections.emptyList()); - given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(), eq(Collections.emptyList()))) + given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(), + eq(Collections.emptyList()))) .willReturn(0L); given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of()); @@ -274,7 +285,8 @@ void should_find_studies_in_all_preferred_regions_when_no_filter() { given(studyQueryRepository.findMyPreferredCategoryStudies(any(), any(), any(), any(), any(), anyInt(), eq(preferredCategory))) .willReturn(studies); - given(studyQueryRepository.countMyPreferredCategoryStudies(any(), any(), any(), eq(preferredCategory))) + given(studyQueryRepository.countMyPreferredCategoryStudies(any(), any(), any(), + eq(preferredCategory))) .willReturn((long) studies.size()); given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of()); @@ -304,7 +316,8 @@ void should_return_empty_when_no_preferred_regions() { given(studyQueryRepository.findMyPreferredCategoryStudies(any(), any(), any(), any(), any(), anyInt(), eq(Collections.emptyList()))) .willReturn(Collections.emptyList()); - given(studyQueryRepository.countMyPreferredCategoryStudies(any(), any(), any(), eq(Collections.emptyList()))) + given(studyQueryRepository.countMyPreferredCategoryStudies(any(), any(), any(), + eq(Collections.emptyList()))) .willReturn(0L); given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of()); @@ -557,7 +570,8 @@ void should_find_studies_by_category() { @DisplayName("조건에 맞는 스터디가 없으면 빈 결과를 반환한다") void should_return_empty_when_no_studies() { // given - given(studyQueryRepository.findStudiesByCategory(any(), any(), any(), any(), any(), any(), anyInt())) + given(studyQueryRepository.findStudiesByCategory(any(), any(), any(), any(), any(), any(), + anyInt())) .willReturn(Collections.emptyList()); given(studyQueryRepository.countStudiesByCategory(any(), any(), any(), any())) .willReturn(0L); @@ -590,7 +604,8 @@ void should_find_liked_studies() { // given List studies = createStudies(pageSize + 1); Long expectedNextCursor = studies.get(pageSize - 1).getId(); - Set likedStudyIds = studies.stream().map(Study::getId).collect(java.util.stream.Collectors.toSet()); + Set likedStudyIds = studies.stream().map(Study::getId) + .collect(java.util.stream.Collectors.toSet()); given(studyQueryRepository.findLikedStudies(viewerId, null, pageSize + 1)) .willReturn(studies); @@ -599,7 +614,8 @@ void should_find_liked_studies() { given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(likedStudyIds); // when - GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, null, pageSize); + GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, null, + pageSize); // then verify(studyQueryRepository).findLikedStudies(viewerId, null, pageSize + 1); @@ -620,7 +636,8 @@ void should_return_empty_when_no_liked_studies() { given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of()); // when - GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, null, pageSize); + GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, null, + pageSize); // then assertThat(response.content()).isEmpty(); @@ -643,7 +660,8 @@ void should_find_next_page_with_cursor() { given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of()); // when - GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, cursor, pageSize); + GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, cursor, + pageSize); // then verify(studyQueryRepository).findLikedStudies(viewerId, cursor, pageSize + 1);