From 50937b6b3fcc5175522f0ee55bf1d5204174bcda Mon Sep 17 00:00:00 2001 From: kimyw1018 Date: Mon, 25 May 2026 23:16:25 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[FIX/#344]=20=EC=BF=BC=EB=A6=AC=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/admin/repository/AdminRepository.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java b/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java index f0e5d69..cfed560 100644 --- a/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java +++ b/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java @@ -29,7 +29,7 @@ List findMatchingAdmins(@Param("university") University university, @Param("department") Department department, @Param("major") Major major); - // 후보 수 카운트: 해당 partner와 ACTIVE 제휴가 없는 admin 수 + // 후보 수 카운트 @Query(value = """ SELECT COUNT(*) FROM admin a @@ -37,12 +37,11 @@ WHERE NOT EXISTS ( SELECT 1 FROM paper pa WHERE pa.admin_id = a.id AND pa.partner_id = :partnerId - AND pa.is_activated = 'ACTIVE' + AND CAST(pa.is_activated AS VARCHAR) = 'ACTIVE' ) """, nativeQuery = true) long countPartner(@Param("partnerId") Long partnerId); - // 랜덤 오프셋으로 1~N건 가져오기 (LIMIT :offset, :limit) @Query(value = """ SELECT a.* FROM admin a @@ -50,21 +49,21 @@ WHERE NOT EXISTS ( SELECT 1 FROM paper pa WHERE pa.admin_id = a.id AND pa.partner_id = :partnerId - AND pa.is_activated = 'ACTIVE' + AND CAST(pa.is_activated AS VARCHAR) = 'ACTIVE' ) LIMIT :offset, :limit """, nativeQuery = true) List findPartnerWithOffset(@Param("partnerId") Long partnerId, - @Param("offset") int offset, - @Param("limit") int limit); + @Param("offset") int offset, + @Param("limit") int limit); @Query(""" SELECT DISTINCT a FROM Admin a LEFT JOIN FETCH a.member WHERE a.point IS NOT NULL - AND function('ST_Contains', function('ST_GeomFromText', :wkt, 4326), a.point) = true - """) + AND ST_Contains(ST_GeomFromText(:wkt, 4326), a.point) = true + """) List findAllWithinViewportWithMember(@Param("wkt") String wkt, Pageable pageable); @Query(""" From 29ee3c908e2273d7473adf618f41a2a14ec5d021 Mon Sep 17 00:00:00 2001 From: kimyw1018 Date: Mon, 25 May 2026 23:28:29 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[FIX/#344]=20Pageable=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/repository/AdminRepository.java | 42 +++++++------- .../admin/service/AdminServiceImpl.java | 26 +++++---- .../partner/repository/PartnerRepository.java | 55 ++++++++++--------- .../partner/service/PartnerServiceImpl.java | 6 +- 4 files changed, 66 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java b/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java index cfed560..f74fe87 100644 --- a/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java +++ b/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java @@ -29,33 +29,31 @@ List findMatchingAdmins(@Param("university") University university, @Param("department") Department department, @Param("major") Major major); - // 후보 수 카운트 - @Query(value = """ - SELECT COUNT(*) - FROM admin a + // 후보 수 카운트 + @Query(""" + SELECT COUNT(a) + FROM Admin a WHERE NOT EXISTS ( - SELECT 1 FROM paper pa - WHERE pa.admin_id = a.id - AND pa.partner_id = :partnerId - AND CAST(pa.is_activated AS VARCHAR) = 'ACTIVE' + SELECT 1 FROM Paper pa + WHERE pa.admin = a + AND pa.partner.id = :partnerId + AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE ) - """, nativeQuery = true) - long countPartner(@Param("partnerId") Long partnerId); + """) + long countPartner(@Param("partnerId") Long partnerId); - @Query(value = """ - SELECT a.* - FROM admin a + // 랜덤 오프셋 조회 (네이티브 빼고 Pageable 적용) + @Query(""" + SELECT a + FROM Admin a WHERE NOT EXISTS ( - SELECT 1 FROM paper pa - WHERE pa.admin_id = a.id - AND pa.partner_id = :partnerId - AND CAST(pa.is_activated AS VARCHAR) = 'ACTIVE' + SELECT 1 FROM Paper pa + WHERE pa.admin = a + AND pa.partner.id = :partnerId + AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE ) - LIMIT :offset, :limit - """, nativeQuery = true) - List findPartnerWithOffset(@Param("partnerId") Long partnerId, - @Param("offset") int offset, - @Param("limit") int limit); + """) + List findPartnerWithOffset(@Param("partnerId") Long partnerId, Pageable pageable); @Query(""" SELECT DISTINCT a diff --git a/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java b/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java index 055742b..bc81213 100644 --- a/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java +++ b/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java @@ -11,6 +11,8 @@ import com.assu.server.global.apiPayload.code.status.ErrorStatus; import com.assu.server.global.exception.DatabaseException; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,14 +26,11 @@ public class AdminServiceImpl implements AdminService { private final AdminRepository adminRepository; private final PartnerRepository partnerRepository; - @Override - @Transactional - public List findMatchingAdmins(University university, Department department, Major major){ - - List adminList = adminRepository.findMatchingAdmins(university, department, major); - - return adminList; - } + @Override + @Transactional + public List findMatchingAdmins(University university, Department department, Major major){ + return adminRepository.findMatchingAdmins(university, department, major); + } @Override @Transactional(readOnly = true) @@ -47,12 +46,15 @@ public AdminResponseDTO suggestRandomPartner(Long adminId) { int offset = ThreadLocalRandom.current().nextInt((int)total); - Partner picked = partnerRepository.findUnpartneredActiveByAdminWithOffset(admin.getId(), offset); - if(picked == null) { + Pageable pageable = PageRequest.of(offset, 1); + List pickedList = partnerRepository.findUnpartneredActiveByAdminWithOffset(admin.getId(), pageable); + + if (pickedList.isEmpty()) { throw new DatabaseException(ErrorStatus.NO_AVAILABLE_PARTNER); } + Partner picked = pickedList.get(0); + return AdminResponseDTO.from(picked); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java b/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java index 7ac8ac3..0d1a7f4 100644 --- a/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java +++ b/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java @@ -1,6 +1,7 @@ package com.assu.server.domain.partner.repository; import com.assu.server.domain.partner.entity.Partner; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -11,41 +12,43 @@ public interface PartnerRepository extends JpaRepository { boolean existsByPhoneNum(String phoneNum); - // 현재 admin과 'ACTIVE' 상태로 제휴 중인 partner를 제외한 후보 수 - @Query(value = """ - SELECT COUNT(*) - FROM partner p - LEFT JOIN paper pa - ON pa.partner_id = p.id - AND pa.admin_id = :adminId - AND pa.is_activated = 'ACTIVE' - WHERE pa.id IS NULL - """, nativeQuery = true) + // 미제휴 제휴업체 수 조회 + @Query(""" + SELECT COUNT(p) + FROM Partner p + WHERE NOT EXISTS ( + SELECT 1 FROM Paper pa + WHERE pa.partner = p + AND pa.admin.id = :adminId + AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE + ) + """) long countUnpartneredActiveByAdmin(@Param("adminId") Long adminId); - // 위 후보들 중에서 offset 하나만 가져오기 (랜덤 오프셋으로 1건) - @Query(value = """ - SELECT p.* - FROM partner p - LEFT JOIN paper pa - ON pa.partner_id = p.id - AND pa.admin_id = :adminId - AND pa.is_activated = 'ACTIVE' - WHERE pa.id IS NULL - LIMIT :offset, 1 - """, nativeQuery = true) - Partner findUnpartneredActiveByAdminWithOffset(@Param("adminId") Long adminId, - @Param("offset") int offset); + // 미제휴 제휴업체 랜덤 오프셋 조회 + @Query(""" + SELECT p + FROM Partner p + WHERE NOT EXISTS ( + SELECT 1 FROM Paper pa + WHERE pa.partner = p + AND pa.admin.id = :adminId + AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE + ) + """) + List findUnpartneredActiveByAdminWithOffset(@Param("adminId") Long adminId, Pageable pageable); + // 반경 내 제휴업체 조회 @Query(""" SELECT DISTINCT p FROM Partner p LEFT JOIN FETCH p.member WHERE p.point IS NOT NULL - AND function('ST_Contains', function('ST_GeomFromText', :wkt, 4326), p.point) = true + AND ST_Contains(ST_GeomFromText(:wkt, 4326), p.point) = true """) List findAllWithinViewportWithMember(@Param("wkt") String wkt); + // 키워드 검색 @Query(""" SELECT DISTINCT p FROM Partner p @@ -55,6 +58,4 @@ WHERE LOWER(p.name) LIKE LOWER(CONCAT('%', :keyword, '%')) List searchPartnerByKeywordWithMember( @Param("keyword") String keyword ); - - -} +} \ No newline at end of file diff --git a/src/main/java/com/assu/server/domain/partner/service/PartnerServiceImpl.java b/src/main/java/com/assu/server/domain/partner/service/PartnerServiceImpl.java index 6340f94..9892a91 100644 --- a/src/main/java/com/assu/server/domain/partner/service/PartnerServiceImpl.java +++ b/src/main/java/com/assu/server/domain/partner/service/PartnerServiceImpl.java @@ -11,6 +11,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import java.util.List; import java.util.concurrent.ThreadLocalRandom; @@ -41,8 +43,8 @@ public PartnerResponseDTO getRandomAdmin(Long partnerId) { offset = ThreadLocalRandom.current().nextInt(0, (int)(total - limit + 1)); } - List picked = adminRepository.findPartnerWithOffset(partner.getId(), offset, limit); - + Pageable pageable = PageRequest.of(offset, limit); + List picked = adminRepository.findPartnerWithOffset(partner.getId(), pageable); List admins = picked.stream() .map(PartnerResponseDTO.AdminLiteDTO::from) .collect(Collectors.toList()); From a385e2045a46d1849470e2c6aea7e6a40544ad7f Mon Sep 17 00:00:00 2001 From: kimyw1018 Date: Mon, 25 May 2026 23:34:35 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[FIX/#344]=20ENUM=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20=ED=8C=8C=EC=8B=B1=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/admin/repository/AdminRepository.java | 2 +- .../server/domain/admin/service/AdminServiceImpl.java | 4 ++-- .../domain/partner/repository/PartnerRepository.java | 10 ++++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java b/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java index f74fe87..16d878a 100644 --- a/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java +++ b/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java @@ -42,7 +42,7 @@ WHERE NOT EXISTS ( """) long countPartner(@Param("partnerId") Long partnerId); - // 랜덤 오프셋 조회 (네이티브 빼고 Pageable 적용) + // 랜덤 오프셋 조회 @Query(""" SELECT a FROM Admin a diff --git a/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java b/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java index bc81213..50b937c 100644 --- a/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java +++ b/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java @@ -39,7 +39,7 @@ public AdminResponseDTO suggestRandomPartner(Long adminId) { Admin admin = adminRepository.findById(adminId) .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_ADMIN)); - long total = partnerRepository.countUnpartneredActiveByAdmin(admin.getId()); + long total = partnerRepository.countUnpartneredActiveByAdmin(admin.getId(), com.assu.server.domain.common.enums.ActivationStatus.ACTIVE); if (total <= 0) { throw new DatabaseException(ErrorStatus.NO_AVAILABLE_PARTNER); } @@ -47,7 +47,7 @@ public AdminResponseDTO suggestRandomPartner(Long adminId) { int offset = ThreadLocalRandom.current().nextInt((int)total); Pageable pageable = PageRequest.of(offset, 1); - List pickedList = partnerRepository.findUnpartneredActiveByAdminWithOffset(admin.getId(), pageable); + List pickedList = partnerRepository.findUnpartneredActiveByAdminWithOffset(admin.getId(), com.assu.server.domain.common.enums.ActivationStatus.ACTIVE, pageable); if (pickedList.isEmpty()) { throw new DatabaseException(ErrorStatus.NO_AVAILABLE_PARTNER); diff --git a/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java b/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java index 0d1a7f4..ecc86fa 100644 --- a/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java +++ b/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java @@ -12,7 +12,6 @@ public interface PartnerRepository extends JpaRepository { boolean existsByPhoneNum(String phoneNum); - // 미제휴 제휴업체 수 조회 @Query(""" SELECT COUNT(p) FROM Partner p @@ -20,12 +19,11 @@ WHERE NOT EXISTS ( SELECT 1 FROM Paper pa WHERE pa.partner = p AND pa.admin.id = :adminId - AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE + AND pa.isActivated = :status ) """) - long countUnpartneredActiveByAdmin(@Param("adminId") Long adminId); + long countUnpartneredActiveByAdmin(@Param("adminId") Long adminId, @Param("status") com.assu.server.domain.common.enums.ActivationStatus status); - // 미제휴 제휴업체 랜덤 오프셋 조회 @Query(""" SELECT p FROM Partner p @@ -33,10 +31,10 @@ WHERE NOT EXISTS ( SELECT 1 FROM Paper pa WHERE pa.partner = p AND pa.admin.id = :adminId - AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE + AND pa.isActivated = :status ) """) - List findUnpartneredActiveByAdminWithOffset(@Param("adminId") Long adminId, Pageable pageable); + List findUnpartneredActiveByAdminWithOffset(@Param("adminId") Long adminId, @Param("status") com.assu.server.domain.common.enums.ActivationStatus status, Pageable pageable); // 반경 내 제휴업체 조회 @Query(""" From a61e25d4b8eb8155265cf04fefe24c0327757879 Mon Sep 17 00:00:00 2001 From: kimyw1018 Date: Mon, 25 May 2026 23:50:13 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[FIX/#344]=20=EA=B2=BD=EB=A1=9C=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/admin/repository/StudentAdminRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/assu/server/domain/admin/repository/StudentAdminRepository.java b/src/main/java/com/assu/server/domain/admin/repository/StudentAdminRepository.java index 024e390..1082a9e 100644 --- a/src/main/java/com/assu/server/domain/admin/repository/StudentAdminRepository.java +++ b/src/main/java/com/assu/server/domain/admin/repository/StudentAdminRepository.java @@ -33,7 +33,7 @@ Long countTodayUsersByAdmin( ); @Query(""" - SELECT new com.assu.server.domain.mapping.dto.StoreUsageWithPaper( + SELECT new com.assu.server.domain.admin.dto.StoreUsageWithPaper( p.id, p.store.id, p.store.name, COUNT(pu.id) ) FROM PartnershipUsage pu