Skip to content

Commit 29ee3c9

Browse files
committed
[FIX/#344] Pageable구조로 변경
1 parent 50937b6 commit 29ee3c9

4 files changed

Lines changed: 66 additions & 63 deletions

File tree

src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,33 +29,31 @@ List<Admin> findMatchingAdmins(@Param("university") University university,
2929
@Param("department") Department department,
3030
@Param("major") Major major);
3131

32-
// 후보 수 카운트
33-
@Query(value = """
34-
SELECT COUNT(*)
35-
FROM admin a
32+
// 후보 수 카운트
33+
@Query("""
34+
SELECT COUNT(a)
35+
FROM Admin a
3636
WHERE NOT EXISTS (
37-
SELECT 1 FROM paper pa
38-
WHERE pa.admin_id = a.id
39-
AND pa.partner_id = :partnerId
40-
AND CAST(pa.is_activated AS VARCHAR) = 'ACTIVE'
37+
SELECT 1 FROM Paper pa
38+
WHERE pa.admin = a
39+
AND pa.partner.id = :partnerId
40+
AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE
4141
)
42-
""", nativeQuery = true)
43-
long countPartner(@Param("partnerId") Long partnerId);
42+
""")
43+
long countPartner(@Param("partnerId") Long partnerId);
4444

45-
@Query(value = """
46-
SELECT a.*
47-
FROM admin a
45+
// 랜덤 오프셋 조회 (네이티브 빼고 Pageable 적용)
46+
@Query("""
47+
SELECT a
48+
FROM Admin a
4849
WHERE NOT EXISTS (
49-
SELECT 1 FROM paper pa
50-
WHERE pa.admin_id = a.id
51-
AND pa.partner_id = :partnerId
52-
AND CAST(pa.is_activated AS VARCHAR) = 'ACTIVE'
50+
SELECT 1 FROM Paper pa
51+
WHERE pa.admin = a
52+
AND pa.partner.id = :partnerId
53+
AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE
5354
)
54-
LIMIT :offset, :limit
55-
""", nativeQuery = true)
56-
List<Admin> findPartnerWithOffset(@Param("partnerId") Long partnerId,
57-
@Param("offset") int offset,
58-
@Param("limit") int limit);
55+
""")
56+
List<Admin> findPartnerWithOffset(@Param("partnerId") Long partnerId, Pageable pageable);
5957

6058
@Query("""
6159
SELECT DISTINCT a

src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.assu.server.global.apiPayload.code.status.ErrorStatus;
1212
import com.assu.server.global.exception.DatabaseException;
1313
import lombok.RequiredArgsConstructor;
14+
import org.springframework.data.domain.PageRequest;
15+
import org.springframework.data.domain.Pageable;
1416
import org.springframework.stereotype.Service;
1517
import org.springframework.transaction.annotation.Transactional;
1618

@@ -24,14 +26,11 @@ public class AdminServiceImpl implements AdminService {
2426
private final AdminRepository adminRepository;
2527
private final PartnerRepository partnerRepository;
2628

27-
@Override
28-
@Transactional
29-
public List<Admin> findMatchingAdmins(University university, Department department, Major major){
30-
31-
List<Admin> adminList = adminRepository.findMatchingAdmins(university, department, major);
32-
33-
return adminList;
34-
}
29+
@Override
30+
@Transactional
31+
public List<Admin> findMatchingAdmins(University university, Department department, Major major){
32+
return adminRepository.findMatchingAdmins(university, department, major);
33+
}
3534

3635
@Override
3736
@Transactional(readOnly = true)
@@ -47,12 +46,15 @@ public AdminResponseDTO suggestRandomPartner(Long adminId) {
4746

4847
int offset = ThreadLocalRandom.current().nextInt((int)total);
4948

50-
Partner picked = partnerRepository.findUnpartneredActiveByAdminWithOffset(admin.getId(), offset);
51-
if(picked == null) {
49+
Pageable pageable = PageRequest.of(offset, 1);
50+
List<Partner> pickedList = partnerRepository.findUnpartneredActiveByAdminWithOffset(admin.getId(), pageable);
51+
52+
if (pickedList.isEmpty()) {
5253
throw new DatabaseException(ErrorStatus.NO_AVAILABLE_PARTNER);
5354
}
5455

56+
Partner picked = pickedList.get(0);
57+
5558
return AdminResponseDTO.from(picked);
5659
}
57-
58-
}
60+
}
Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.assu.server.domain.partner.repository;
22

33
import com.assu.server.domain.partner.entity.Partner;
4+
import org.springframework.data.domain.Pageable;
45
import org.springframework.data.jpa.repository.JpaRepository;
56
import org.springframework.data.jpa.repository.Query;
67
import org.springframework.data.repository.query.Param;
@@ -11,41 +12,43 @@ public interface PartnerRepository extends JpaRepository<Partner, Long> {
1112

1213
boolean existsByPhoneNum(String phoneNum);
1314

14-
// 현재 admin과 'ACTIVE' 상태로 제휴 중인 partner를 제외한 후보 수
15-
@Query(value = """
16-
SELECT COUNT(*)
17-
FROM partner p
18-
LEFT JOIN paper pa
19-
ON pa.partner_id = p.id
20-
AND pa.admin_id = :adminId
21-
AND pa.is_activated = 'ACTIVE'
22-
WHERE pa.id IS NULL
23-
""", nativeQuery = true)
15+
// 미제휴 제휴업체 수 조회
16+
@Query("""
17+
SELECT COUNT(p)
18+
FROM Partner p
19+
WHERE NOT EXISTS (
20+
SELECT 1 FROM Paper pa
21+
WHERE pa.partner = p
22+
AND pa.admin.id = :adminId
23+
AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE
24+
)
25+
""")
2426
long countUnpartneredActiveByAdmin(@Param("adminId") Long adminId);
2527

26-
// 위 후보들 중에서 offset 하나만 가져오기 (랜덤 오프셋으로 1건)
27-
@Query(value = """
28-
SELECT p.*
29-
FROM partner p
30-
LEFT JOIN paper pa
31-
ON pa.partner_id = p.id
32-
AND pa.admin_id = :adminId
33-
AND pa.is_activated = 'ACTIVE'
34-
WHERE pa.id IS NULL
35-
LIMIT :offset, 1
36-
""", nativeQuery = true)
37-
Partner findUnpartneredActiveByAdminWithOffset(@Param("adminId") Long adminId,
38-
@Param("offset") int offset);
28+
// 미제휴 제휴업체 랜덤 오프셋 조회
29+
@Query("""
30+
SELECT p
31+
FROM Partner p
32+
WHERE NOT EXISTS (
33+
SELECT 1 FROM Paper pa
34+
WHERE pa.partner = p
35+
AND pa.admin.id = :adminId
36+
AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE
37+
)
38+
""")
39+
List<Partner> findUnpartneredActiveByAdminWithOffset(@Param("adminId") Long adminId, Pageable pageable);
3940

41+
// 반경 내 제휴업체 조회
4042
@Query("""
4143
SELECT DISTINCT p
4244
FROM Partner p
4345
LEFT JOIN FETCH p.member
4446
WHERE p.point IS NOT NULL
45-
AND function('ST_Contains', function('ST_GeomFromText', :wkt, 4326), p.point) = true
47+
AND ST_Contains(ST_GeomFromText(:wkt, 4326), p.point) = true
4648
""")
4749
List<Partner> findAllWithinViewportWithMember(@Param("wkt") String wkt);
4850

51+
// 키워드 검색
4952
@Query("""
5053
SELECT DISTINCT p
5154
FROM Partner p
@@ -55,6 +58,4 @@ WHERE LOWER(p.name) LIKE LOWER(CONCAT('%', :keyword, '%'))
5558
List<Partner> searchPartnerByKeywordWithMember(
5659
@Param("keyword") String keyword
5760
);
58-
59-
60-
}
61+
}

src/main/java/com/assu/server/domain/partner/service/PartnerServiceImpl.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import lombok.RequiredArgsConstructor;
1212
import org.springframework.stereotype.Service;
1313
import org.springframework.transaction.annotation.Transactional;
14+
import org.springframework.data.domain.PageRequest;
15+
import org.springframework.data.domain.Pageable;
1416

1517
import java.util.List;
1618
import java.util.concurrent.ThreadLocalRandom;
@@ -41,8 +43,8 @@ public PartnerResponseDTO getRandomAdmin(Long partnerId) {
4143
offset = ThreadLocalRandom.current().nextInt(0, (int)(total - limit + 1));
4244
}
4345

44-
List<Admin> picked = adminRepository.findPartnerWithOffset(partner.getId(), offset, limit);
45-
46+
Pageable pageable = PageRequest.of(offset, limit);
47+
List<Admin> picked = adminRepository.findPartnerWithOffset(partner.getId(), pageable);
4648
List<PartnerResponseDTO.AdminLiteDTO> admins = picked.stream()
4749
.map(PartnerResponseDTO.AdminLiteDTO::from)
4850
.collect(Collectors.toList());

0 commit comments

Comments
 (0)