diff --git a/common/src/main/resources/application-common.yml b/common/src/main/resources/application-common.yml index f7ecdf3..0ce9faa 100644 --- a/common/src/main/resources/application-common.yml +++ b/common/src/main/resources/application-common.yml @@ -20,7 +20,7 @@ spring: # Redis 설정 data: redis: - host: ${REDIS_HOST:localhost} + host: ${REDIS_HOST:localhost} //로컬 port: ${REDIS_PORT:6379} password: ${REDIS_PASSWORD:} timeout: 2000ms diff --git a/store/src/main/java/com/ktds/hi/store/biz/usecase/out/StoreRepositoryPort.java b/store/src/main/java/com/ktds/hi/store/biz/usecase/out/StoreRepositoryPort.java index 318a12d..274d838 100644 --- a/store/src/main/java/com/ktds/hi/store/biz/usecase/out/StoreRepositoryPort.java +++ b/store/src/main/java/com/ktds/hi/store/biz/usecase/out/StoreRepositoryPort.java @@ -14,6 +14,16 @@ import java.util.Optional; */ public interface StoreRepositoryPort { + /** + * 태그로 매장 검색 (OR 조건) + */ + List findStoresByTagNames(List tagNames); + + /** + * 모든 태그를 포함하는 매장 검색 (AND 조건) + */ + List findStoresByAllTagNames(List tagNames); + /** * 점주 ID로 매장 목록 조회 * diff --git a/store/src/main/java/com/ktds/hi/store/infra/gateway/StoreRepositoryAdapter.java b/store/src/main/java/com/ktds/hi/store/infra/gateway/StoreRepositoryAdapter.java index 07939b0..b3cb313 100644 --- a/store/src/main/java/com/ktds/hi/store/infra/gateway/StoreRepositoryAdapter.java +++ b/store/src/main/java/com/ktds/hi/store/infra/gateway/StoreRepositoryAdapter.java @@ -38,6 +38,22 @@ public class StoreRepositoryAdapter implements StoreRepositoryPort { .collect(Collectors.toList()); } + @Override + public List findStoresByTagNames(List tagNames) { + return storeJpaRepository.findByTagNamesIn(tagNames) + .stream() + .map(this::toDomain) + .collect(Collectors.toList()); + } + + @Override + public List findStoresByAllTagNames(List tagNames) { + return storeJpaRepository.findByAllTagNames(tagNames, tagNames.size()) + .stream() + .map(this::toDomain) + .collect(Collectors.toList()); + } + @Override public Optional findStoreById(Long storeId) { return storeJpaRepository.findById(storeId) diff --git a/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/StoreJpaRepository.java b/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/StoreJpaRepository.java index 54834d9..8f14021 100644 --- a/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/StoreJpaRepository.java +++ b/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/StoreJpaRepository.java @@ -21,6 +21,9 @@ import java.util.Optional; @Repository public interface StoreJpaRepository extends JpaRepository { + @Query("SELECT s FROM StoreEntity s WHERE s.status = 'ACTIVE' ORDER BY s.rating DESC") + Page findAllByOrderByRatingDesc(Pageable pageable); + /** * 점주 ID로 매장 목록 조회 */ @@ -49,9 +52,18 @@ public interface StoreJpaRepository extends JpaRepository { /** * 평점 기준 내림차순으로 매장 조회 */ - @Query("SELECT s FROM StoreEntity s ORDER BY s.rating DESC") - Page findAllByOrderByRatingDesc(Pageable pageable); + @Query(value = "SELECT DISTINCT s.* FROM stores s " + + "WHERE EXISTS (SELECT 1 FROM store_tags st " + + "WHERE st.store_id = s.id AND st.tag_name IN :tagNames) " + + "AND s.status = 'ACTIVE'", nativeQuery = true) + List findByTagNamesIn(@Param("tagNames") List tagNames); + @Query(value = "SELECT s.* FROM stores s " + + "WHERE (SELECT COUNT(DISTINCT st.tag_name) FROM store_tags st " + + "WHERE st.store_id = s.id AND st.tag_name IN :tagNames) = :tagCount " + + "AND s.status = 'ACTIVE'", nativeQuery = true) + List findByAllTagNames(@Param("tagNames") List tagNames, + @Param("tagCount") Integer tagCount); /** * 점주별 매장 수 조회 */