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());