From 4558d5c9c66d5ecff10f69c03298b8ef7eb9d3cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=ED=9B=88=EA=B8=B0?= Date: Wed, 11 Mar 2026 18:30:02 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Feat:=20=EB=8F=99=ED=98=B8=ED=9A=8C?= =?UTF-8?q?=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EA=B4=80=EC=8B=AC=20=EC=A2=85=EB=AA=A9=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=20=EC=9A=B0=EC=84=A0=20=EC=A0=95=EB=A0=AC=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/club/controller/ClubController.java | 7 ++++--- .../sportizebe/domain/club/service/ClubService.java | 2 +- .../domain/club/service/ClubServiceImpl.java | 13 ++++++++++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/be/sportizebe/domain/club/controller/ClubController.java b/src/main/java/com/be/sportizebe/domain/club/controller/ClubController.java index 9c82b15..4692c62 100644 --- a/src/main/java/com/be/sportizebe/domain/club/controller/ClubController.java +++ b/src/main/java/com/be/sportizebe/domain/club/controller/ClubController.java @@ -63,12 +63,13 @@ public ResponseEntity> updateClubImage( @GetMapping @Operation(summary = "모든 동호회 조회 (무한스크롤)", - description = "커서 기반 무한스크롤 방식으로 동호회 목록을 조회합니다.") + description = "커서 기반 무한스크롤 방식으로 동호회 목록을 조회합니다. 유저의 관심 종목과 일치하는 동호회가 우선 노출됩니다.") public ResponseEntity> getClubs( @RequestParam(required = false) Long cursor, - @RequestParam(defaultValue = "20") int size + @RequestParam(defaultValue = "20") int size, + @AuthenticationPrincipal UserAuthInfo userAuthInfo ) { - ClubScrollResponse response = clubService.getClubsByScroll(cursor, size); + ClubScrollResponse response = clubService.getClubsByScroll(cursor, size, userAuthInfo.getId()); return ResponseEntity.ok( BaseResponse.success("동호회 목록 조회 성공", response) ); diff --git a/src/main/java/com/be/sportizebe/domain/club/service/ClubService.java b/src/main/java/com/be/sportizebe/domain/club/service/ClubService.java index a8f51bb..0f46d93 100644 --- a/src/main/java/com/be/sportizebe/domain/club/service/ClubService.java +++ b/src/main/java/com/be/sportizebe/domain/club/service/ClubService.java @@ -16,7 +16,7 @@ public interface ClubService { ClubDetailResponse getClub(Long clubId); // 동호회 개별 조회 - ClubScrollResponse getClubsByScroll(Long cursor, int size); // 동호회 전체 조회 (무한 스크롤) + ClubScrollResponse getClubsByScroll(Long cursor, int size, Long userId); // 동호회 전체 조회 (무한 스크롤) ClubScrollResponse getMyClubsByScroll(Long cursor, int size, User user); // 내가 가입한 동호회 조회 (무한 스크롤) diff --git a/src/main/java/com/be/sportizebe/domain/club/service/ClubServiceImpl.java b/src/main/java/com/be/sportizebe/domain/club/service/ClubServiceImpl.java index d12c1e7..4481ec1 100644 --- a/src/main/java/com/be/sportizebe/domain/club/service/ClubServiceImpl.java +++ b/src/main/java/com/be/sportizebe/domain/club/service/ClubServiceImpl.java @@ -129,12 +129,11 @@ public ClubDetailResponse getClub(Long clubId) { } @Override @Transactional(readOnly = true) - public ClubScrollResponse getClubsByScroll(Long cursor, int size) { + public ClubScrollResponse getClubsByScroll(Long cursor, int size, Long userId) { - // +1 조회해서 다음 페이지 존재 여부 판단 Pageable pageable = PageRequest.of(0, size + 1); - List clubs = clubRepository.findClubsByCursor(cursor, pageable); + List clubs = new java.util.ArrayList<>(clubRepository.findClubsByCursor(cursor, pageable)); boolean hasNext = clubs.size() > size; @@ -142,6 +141,14 @@ public ClubScrollResponse getClubsByScroll(Long cursor, int size) { clubs = clubs.subList(0, size); } + // 유저 관심 종목 조회 후 일치하는 동호회 상단 정렬 + List interestTypes = userRepository.findById(userId) + .map(user -> user.getInterestType()) + .orElse(java.util.Collections.emptyList()); + + clubs.sort(java.util.Comparator.comparingInt(club -> + interestTypes.contains(club.getClubType()) ? 0 : 1)); + List items = clubs.stream() .map(club -> { int memberCount = clubMemberRepository.countByClubId(club.getId());