Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
@Configuration
public class KakaoFeignConfig {

@Value("${kakao.rest-api-key}")
@Value("${kakao.client-id}")
private String kakaoApiKey;

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
@AllArgsConstructor
public enum StoreSuccessCode implements SuccessCode {

OK("STORE_SEARCH_SUCCESS", HttpStatus.OK, "가게 상세 조회 성공");
OK("STORE_SEARCH_SUCCESS", HttpStatus.OK, "가게 조회 성공"),
;



private final String code;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

import com.example.matzipbookserver.global.response.SuccessResponse;
import com.example.matzipbookserver.global.response.success.StoreSuccessCode;
import com.example.matzipbookserver.store.controller.dto.StoreRankingResponseDto;
import com.example.matzipbookserver.store.controller.dto.StoreResponseDto;
import com.example.matzipbookserver.store.service.StoreService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

Expand All @@ -14,14 +17,27 @@
public class StoreController {

private final StoreService storeService;
private static final int MAX_RADIUS = 10000; // 10km

@GetMapping("/{kakaoPlaceId}")
public ResponseEntity<SuccessResponse<StoreResponseDto>> getStoreDetail(
@PathVariable String kakaoPlaceId,
@RequestParam String storeName,
@RequestParam double x,
@RequestParam double y) {
return ResponseEntity.ok(SuccessResponse.of(StoreSuccessCode.OK, storeService.getPlaceDetail(kakaoPlaceId, storeName, x, y)));
return ResponseEntity.ok(SuccessResponse.of(StoreSuccessCode.OK, storeService.getPlaceDetail(kakaoPlaceId, storeName, x, y))) ;
}

@GetMapping("/ranking")
public ResponseEntity<SuccessResponse<Page<StoreRankingResponseDto>>> getStoreRanking(
@RequestParam double x, //latitude 경도
@RequestParam double y, //longitude 위도
@RequestParam(required = false, defaultValue = "2000")int radius, //미터로 받기
Pageable pageable
) {
int minimumRadius = Math.min(radius, MAX_RADIUS);

Page<StoreRankingResponseDto> ranking = storeService.getNearStoreRanking(x, y, minimumRadius, pageable);
return ResponseEntity.ok(SuccessResponse.of(StoreSuccessCode.OK, ranking));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.example.matzipbookserver.store.controller.dto;

import com.example.matzipbookserver.store.domain.Store;

public record StoreRankingResponseDto(
Long id,
String kakaoPlaceId,
String name,
String address,
double x,
double y,
int voteCount
) {

public static StoreRankingResponseDto from(Store store) {
return new StoreRankingResponseDto(
store.getId(),
store.getKakaoPlaceId(),
store.getName(),
store.getAddress(),
store.getX(),
store.getY(),
store.getVoteCount()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,39 @@
package com.example.matzipbookserver.store.domain.repository;

import com.example.matzipbookserver.store.domain.Store;
import feign.Param;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.Optional;

public interface StoreRepository extends JpaRepository<Store, Long> {

Optional<Store> findByKakaoPlaceId(String kakaoPlaceId);


@Query(value = """
SELECT *,
(6371 * acos(cos(radians(:latitude)) * cos(radians(s.y)) *
cos(radians(s.x) - radians(:longitude)) +
sin(radians(:latitude)) * sin(radians(s.y)))) AS distance
FROM store s
WHERE (6371 * acos(cos(radians(:latitude)) * cos(radians(s.y)) *
cos(radians(s.x) - radians(:longitude)) +
sin(radians(:latitude)) * sin(radians(s.y)))) <= :radius
ORDER BY s.vote_count DESC
""", countQuery = """
SELECT COUNT(*)
FROM store s
WHERE (6371 * acos(cos(radians(:latitude)) * cos(radians(s.y)) *
cos(radians(s.x) - radians(:longitude)) +
sin(radians(:latitude)) * sin(radians(s.y)))) <= :radius
""", nativeQuery = true)
Page<Store> findNearByVoteCount(@Param("longitude") double longitude,
@Param("latitude") double latitude,
@Param("radius") double radius,
Pageable pageable);

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@

import com.example.matzipbookserver.global.exception.RestApiException;
import com.example.matzipbookserver.global.response.error.StoreErrorCode;
import com.example.matzipbookserver.store.controller.dto.StoreRankingResponseDto;
import com.example.matzipbookserver.store.controller.dto.StoreResponseDto;
import com.example.matzipbookserver.store.domain.Store;
import com.example.matzipbookserver.store.domain.repository.StoreRepository;
import com.example.matzipbookserver.store.external.KakaoLocalClient;
import com.example.matzipbookserver.store.external.dto.KakaoDocument;
import com.example.matzipbookserver.store.external.dto.KakaoSearchResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.Optional;
Expand Down Expand Up @@ -46,4 +49,16 @@ public StoreResponseDto getPlaceDetail(String kakaoPlaceId, String placeName, do
storeRepository.save(newStore);
return StoreResponseDto.from(newStore);
}


public Page<StoreRankingResponseDto> getNearStoreRanking(double longitude, double latitude, int radius, Pageable pageable) {

double radiusKm = radius / 1000.0; //km로 변환

Page<Store> storePage = storeRepository.findNearByVoteCount(longitude, latitude, radiusKm, pageable);

return storePage.map(StoreRankingResponseDto::from);
}


}
Loading