diff --git a/src/main/java/com/mey/backend/domain/place/repository/PlaceRepository.java b/src/main/java/com/mey/backend/domain/place/repository/PlaceRepository.java index eb0a75b..12945dd 100644 --- a/src/main/java/com/mey/backend/domain/place/repository/PlaceRepository.java +++ b/src/main/java/com/mey/backend/domain/place/repository/PlaceRepository.java @@ -13,10 +13,8 @@ public interface PlaceRepository extends JpaRepository { List findByNameKoContainingIgnoreCaseOrNameEnContainingIgnoreCase(String nameKo, String nameEn); - @Query(value = "SELECT * FROM places WHERE JSON_CONTAINS(themes, :themeJson) LIMIT :limit", nativeQuery = true) - List findByThemeKeywordWithLimit(@Param("themeJson") String themeJson, @Param("limit") int limit); - - Optional findByNameKo(String nameKo); + @Query(value = "SELECT * FROM places WHERE JSON_CONTAINS(themes, JSON_QUOTE(:keyword), '$') LIMIT :limit", nativeQuery = true) + List findByThemeKeywordWithLimit(@Param("keyword") String keyword, @Param("limit") int limit); // JPQL의 MOD 함수로 홀수 placeId만 필터링 @Query("SELECT p FROM Place p WHERE MOD(p.placeId, 2) = 1") diff --git a/src/main/java/com/mey/backend/domain/place/service/PlaceService.java b/src/main/java/com/mey/backend/domain/place/service/PlaceService.java index fce4a33..c83f3c6 100644 --- a/src/main/java/com/mey/backend/domain/place/service/PlaceService.java +++ b/src/main/java/com/mey/backend/domain/place/service/PlaceService.java @@ -56,15 +56,12 @@ public List getPopularPlaces(Integer limit) { } public List getPlacesByTheme(String keyword, int limit) { - String jsonKeyword = "[\"" + keyword.toLowerCase() + "\"]"; - List places = placeRepository.findByThemeKeywordWithLimit(jsonKeyword, limit); + // DB 저장 형식에 맞추어 정규화 (예: 전부 대문자 + 언더스코어) + String norm = keyword.toUpperCase(); // "K_POP", "K_DRAMA" 등 - if (places.isEmpty()) { - throw new PlaceException(ErrorStatus.PLACE_NOT_FOUND); - } + List places = placeRepository.findByThemeKeywordWithLimit(norm, limit); + if (places.isEmpty()) throw new PlaceException(ErrorStatus.PLACE_NOT_FOUND); - return places.stream() - .map(PlaceThemeResponseDto::new) - .collect(Collectors.toList()); + return places.stream().map(PlaceThemeResponseDto::new).collect(Collectors.toList()); } } \ No newline at end of file