diff --git a/src/main/java/org/alongtheblue/alongtheblue_server/global/data/accommodation/AccommodationRepository.java b/src/main/java/org/alongtheblue/alongtheblue_server/global/data/accommodation/AccommodationRepository.java index 5d5ed4c..0a9079e 100644 --- a/src/main/java/org/alongtheblue/alongtheblue_server/global/data/accommodation/AccommodationRepository.java +++ b/src/main/java/org/alongtheblue/alongtheblue_server/global/data/accommodation/AccommodationRepository.java @@ -1,6 +1,7 @@ package org.alongtheblue.alongtheblue_server.global.data.accommodation; import org.alongtheblue.alongtheblue_server.global.data.global.SimpleInformation; +import org.alongtheblue.alongtheblue_server.global.data.search.SearchInformation; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,8 +9,6 @@ import org.springframework.stereotype.Repository; import java.util.List; -import java.util.Map; -import java.util.Optional; @Repository public interface AccommodationRepository extends JpaRepository { @@ -44,6 +43,7 @@ public interface AccommodationRepository extends JpaRepository findAccommodationsWithTwoImages(); - List findByTitleContaining(String keyword); + @Query("SELECT a FROM Accommodation a JOIN a.images i WHERE a.title LIKE %:keyword% GROUP BY a HAVING COUNT(i) > 0") + Page findByTitleContaining(String keyword, Pageable pageable); } diff --git a/src/main/java/org/alongtheblue/alongtheblue_server/global/data/accommodation/AccommodationService.java b/src/main/java/org/alongtheblue/alongtheblue_server/global/data/accommodation/AccommodationService.java index 9676ad8..332ce99 100644 --- a/src/main/java/org/alongtheblue/alongtheblue_server/global/data/accommodation/AccommodationService.java +++ b/src/main/java/org/alongtheblue/alongtheblue_server/global/data/accommodation/AccommodationService.java @@ -9,6 +9,7 @@ import org.alongtheblue.alongtheblue_server.global.data.global.SimpleInformation; import org.alongtheblue.alongtheblue_server.global.data.global.dto.response.DetailResponseDto; import org.alongtheblue.alongtheblue_server.global.data.global.dto.response.HomeResponseDto; +import org.alongtheblue.alongtheblue_server.global.data.search.SearchInformation; import org.alongtheblue.alongtheblue_server.global.data.weather.WeatherRepository; import org.alongtheblue.alongtheblue_server.global.data.weather.WeatherResponseDto; import org.alongtheblue.alongtheblue_server.global.data.weather.WeatherService; @@ -466,23 +467,34 @@ private Mono fetchAndSaveAccommodationImage(Accommodation accommodation) { .then(); } - public ApiResponse> getAccommodationsByKeyword(String keyword) { - List accommodations = accommodationRepository.findByTitleContaining(keyword); - List accommodationResponseDtoList = new ArrayList<>(); - for(Accommodation accommodation : accommodations) { - String[] arr = accommodation.getAddress().substring(8).split(" "); - AccommodationResponseDto accommodationResponseDto = new AccommodationResponseDto( - arr[0] + " " + arr[1], - accommodation.getTitle(), - accommodation.getContentId(), - accommodation.getImages().isEmpty() ? null : accommodation.getImages().get(0).getOriginimgurl(), - accommodation.getXMap(), - accommodation.getYMap(), - "tourData" - ); - accommodationResponseDtoList.add(accommodationResponseDto); - } - return ApiResponse.ok("숙박 정보를 성공적으로 검색했습니다.", accommodationResponseDtoList); + public ApiResponse> getAccommodationsByKeyword(String keyword, int page, int size) { + Pageable pageable = PageRequest.of(page, size); + + // 1. Restaurant 기준으로 페이징 처리된 데이터를 조회 + Page accommodationPage = accommodationRepository.findByTitleContaining(keyword, pageable); + + // CustomPage 객체로 변환 (기존 페이지네이션 정보와 category를 함께 담음) + CustomPage customPage = new CustomPage<>( + accommodationPage.getContent(), pageable, accommodationPage.getTotalElements(), Category.ACCOMMODATION.getValue()); + + // ApiResponse로 반환 + return ApiResponse.ok("숙소 목록을 성공적으로 조회했습니다.", customPage); +// List accommodations = accommodationRepository.findByTitleContaining(keyword); +// List accommodationResponseDtoList = new ArrayList<>(); +// for(Accommodation accommodation : accommodations) { +// String[] arr = accommodation.getAddress().substring(8).split(" "); +// AccommodationResponseDto accommodationResponseDto = new AccommodationResponseDto( +// arr[0] + " " + arr[1], +// accommodation.getTitle(), +// accommodation.getContentId(), +// accommodation.getImages().isEmpty() ? null : accommodation.getImages().get(0).getOriginimgurl(), +// accommodation.getXMap(), +// accommodation.getYMap(), +// "tourData" +// ); +// accommodationResponseDtoList.add(accommodationResponseDto); +// } +// return ApiResponse.ok("숙박 정보를 성공적으로 검색했습니다.", accommodationResponseDtoList); } // API 응답을 매핑하기 위한 클래스 diff --git a/src/main/java/org/alongtheblue/alongtheblue_server/global/data/search/SearchController.java b/src/main/java/org/alongtheblue/alongtheblue_server/global/data/search/SearchController.java index 43308ef..0790d1f 100644 --- a/src/main/java/org/alongtheblue/alongtheblue_server/global/data/search/SearchController.java +++ b/src/main/java/org/alongtheblue/alongtheblue_server/global/data/search/SearchController.java @@ -83,8 +83,8 @@ public ApiResponse> getTourDataList() { @GetMapping("/tourData") public ApiResponse> getTourDataListByKeyword(@RequestParam String keyword, - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "10") int size) { + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size) { return tourDataService.getTourDataListByKeyword(keyword, page, size); } @@ -94,8 +94,10 @@ public ApiResponse> getAccommodationHome() { } @GetMapping("/accommodation") - public ApiResponse> getAccommodationsByKeyword(@RequestParam String keyword) { - return accommodationService.getAccommodationsByKeyword(keyword); + public ApiResponse> getAccommodationsByKeyword(@RequestParam String keyword, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size) { + return accommodationService.getAccommodationsByKeyword(keyword, page, size); } }