From 876af65851b1983830770eacb4b2ed5214c1d7aa Mon Sep 17 00:00:00 2001 From: Anna-Jin Date: Sun, 31 Jul 2022 19:30:12 +0900 Subject: [PATCH] =?UTF-8?q?#39=20[Update]=20=EC=97=85=EC=9E=A5=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=EC=97=90=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC,=20?= =?UTF-8?q?=EC=8B=9C=EC=84=A4=20=EB=B6=84=EB=A5=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mpnp/baechelin/common/QueryDslSearch.java | 24 +++++++++++++++++-- .../store/controller/StoreController.java | 4 +++- .../repository/StoreQueryRepository.java | 15 ++++-------- .../baechelin/store/service/StoreService.java | 8 +++---- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/mpnp/baechelin/common/QueryDslSearch.java b/src/main/java/com/mpnp/baechelin/common/QueryDslSearch.java index 8942601..18fb7f1 100644 --- a/src/main/java/com/mpnp/baechelin/common/QueryDslSearch.java +++ b/src/main/java/com/mpnp/baechelin/common/QueryDslSearch.java @@ -1,9 +1,14 @@ package com.mpnp.baechelin.common; +import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.StringPath; import org.apache.commons.lang3.StringUtils; +import java.util.List; + +import static com.mpnp.baechelin.common.QuerydslLocation.getBooleanBuilder; import static com.mpnp.baechelin.store.domain.QStore.store; public class QueryDslSearch { @@ -17,7 +22,7 @@ public static BooleanExpression matchAddressWithSido(String sido) { Integer.class, "function('match', {0}, {1}, {2})", store.address, store.address, sido).gt(0); } - public static BooleanExpression matchAddressWithSidoAndSigungu(String sido, String sigungu) { + private static BooleanExpression matchAddressWithSidoAndSigungu(String sido, String sigungu) { // sido가 null이면 sigungu는 무조건 null if (StringUtils.isEmpty(sido)) { @@ -40,7 +45,7 @@ public static BooleanExpression matchAddressWithSidoAndSigungu(String sido, Stri } } - public static BooleanExpression matchKeyword(String keyword) { + private static BooleanExpression matchKeyword(String keyword) { if (StringUtils.isEmpty(keyword)) { return null; } @@ -48,4 +53,19 @@ public static BooleanExpression matchKeyword(String keyword) { Integer.class, "function('match', {0}, {1}, {2})", store.name, store.category, keyword).gt(0); } + + public static BooleanBuilder getSearchBooleanBuilder(String sido, String sigungu, String keyword, String category, List facility) { + BooleanBuilder builder = new BooleanBuilder(); + + // 지역 fulltext search + builder.and(matchAddressWithSidoAndSigungu(sido, sigungu)); + + // 검색어 fulltext search + builder.and(matchKeyword(keyword)); + + // 카테고리, 시설 + builder.and(getBooleanBuilder(category, facility, builder)); + + return builder; + } } diff --git a/src/main/java/com/mpnp/baechelin/store/controller/StoreController.java b/src/main/java/com/mpnp/baechelin/store/controller/StoreController.java index 7603b9e..5c9bfbd 100644 --- a/src/main/java/com/mpnp/baechelin/store/controller/StoreController.java +++ b/src/main/java/com/mpnp/baechelin/store/controller/StoreController.java @@ -104,9 +104,11 @@ public StorePagedResponseDto searchStoresByKeyword( @RequestParam(required = false) String sido, @RequestParam(required = false) String sigungu, @RequestParam(required = false) String keyword, + @RequestParam(required = false) String category, + @RequestParam(required = false) List facility, @PageableDefault Pageable pageable, @AuthenticationPrincipal User user) { - return storeService.searchStores(sido, sigungu, keyword, user == null ? null : user.getUsername(), pageable); + return storeService.searchStores(sido, sigungu, keyword, category, facility, user == null ? null : user.getUsername(), pageable); } } \ No newline at end of file diff --git a/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java b/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java index bf4dcfe..8bcb476 100644 --- a/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java +++ b/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java @@ -2,15 +2,11 @@ import com.mpnp.baechelin.common.QueryDslSearch; import com.mpnp.baechelin.common.QuerydslLocation; -import com.mpnp.baechelin.review.domain.Review; import com.mpnp.baechelin.store.domain.QStore; import com.mpnp.baechelin.store.domain.Store; import com.querydsl.core.BooleanBuilder; -import com.querydsl.core.Tuple; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.dsl.BooleanExpression; -import com.querydsl.core.types.dsl.Expressions; -import com.querydsl.core.types.dsl.NumberPath; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -23,8 +19,8 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; -import java.util.stream.Collectors; +import static com.mpnp.baechelin.common.QueryDslSearch.getSearchBooleanBuilder; import static com.mpnp.baechelin.common.QuerydslLocation.locTwoPointAndConditions; import static com.mpnp.baechelin.store.domain.QStore.store; @@ -156,18 +152,17 @@ public List getSigungu(String sido) { // 주소로 검색, 검색어로 검색 - public Page searchStores(String sido, String sigungu, String keyword, Pageable pageable) { - BooleanExpression matchAddress = QueryDslSearch.matchAddressWithSidoAndSigungu(sido, sigungu); - BooleanExpression matchKeyword = QueryDslSearch.matchKeyword(keyword); + public Page searchStores(String sido, String sigungu, String keyword, String category, List facility, Pageable pageable) { + BooleanBuilder builder = getSearchBooleanBuilder(sido, sigungu, keyword, category, facility); List storeList = queryFactory .selectFrom(store) - .where(matchAddress, matchKeyword) + .where(builder) .limit(pageable.getPageSize()) .offset(pageable.getOffset()) .fetch(); int fetchSize = queryFactory.selectFrom(store) - .where(matchAddress, matchKeyword) + .where(builder) .fetch().size(); return new PageImpl<>(storeList, pageable, fetchSize); } diff --git a/src/main/java/com/mpnp/baechelin/store/service/StoreService.java b/src/main/java/com/mpnp/baechelin/store/service/StoreService.java index 3022594..b04d441 100644 --- a/src/main/java/com/mpnp/baechelin/store/service/StoreService.java +++ b/src/main/java/com/mpnp/baechelin/store/service/StoreService.java @@ -13,6 +13,7 @@ import com.mpnp.baechelin.user.repository.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.scheduling.annotation.EnableScheduling; @@ -155,7 +156,6 @@ private List getStoreCardResponseDtos(User targetUser, Lis /** * 업장 상세 조회 - * * @param storeId 업장 아이디 * @param socialId 유저 social 아이디 * @return 업장 상세 정보 @@ -216,7 +216,7 @@ public Map> getSigungu(String sido) { } /** - * 엄장 검색 + * 업장 검색 * @param sido 시/도명 * @param sigungu 시/군/구명 * @param keyword 검색어 @@ -224,8 +224,8 @@ public Map> getSigungu(String sido) { * @param pageable 페이징 * @return 페이징이 적용된 검색 결과 리턴 */ - public StorePagedResponseDto searchStores(String sido, String sigungu, String keyword, String socialId, Pageable pageable) { - Page searchStores = storeQueryRepository.searchStores(sido, sigungu, keyword, pageable); + public StorePagedResponseDto searchStores(String sido, String sigungu, String keyword, String category, List facility, String socialId, Pageable pageable) { + Page searchStores = storeQueryRepository.searchStores(sido, sigungu, keyword, category, facility, pageable); User targetUser = socialId == null ? null : userRepository.findBySocialId(socialId);