diff --git a/server-yml b/server-yml index 247c1e4e..a2dc8164 160000 --- a/server-yml +++ b/server-yml @@ -1 +1 @@ -Subproject commit 247c1e4e5c3b71a3ca12b7759a8e7f086e617746 +Subproject commit a2dc8164e7a0e08037521a2eef49a811a0d1857d diff --git a/src/main/java/org/hankki/hankkiserver/api/advice/GlobalExceptionHandler.java b/src/main/java/org/hankki/hankkiserver/api/advice/GlobalExceptionHandler.java index e012795d..44e6cad8 100644 --- a/src/main/java/org/hankki/hankkiserver/api/advice/GlobalExceptionHandler.java +++ b/src/main/java/org/hankki/hankkiserver/api/advice/GlobalExceptionHandler.java @@ -8,6 +8,7 @@ import org.hankki.hankkiserver.common.exception.NotFoundException; import org.hankki.hankkiserver.common.exception.UnauthorizedException; +import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -39,6 +40,12 @@ public HankkiResponse handleConflictException(ConflictException e) { return HankkiResponse.fail(e.getErrorCode()); } + @ExceptionHandler(MissingServletRequestParameterException.class) + public HankkiResponse handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { + log.error("handleMissingServletRequestParameterException() in GlobalExceptionHandler throw MissingServletRequestParameterException : {}", e.getMessage()); + return HankkiResponse.fail(BusinessErrorCode.BAD_REQUEST); + } + @ExceptionHandler(Exception.class) public HankkiResponse handleException(Exception e) { log.error("handleException() in GlobalExceptionHandler throw Exception : {}", e.getMessage()); diff --git a/src/main/java/org/hankki/hankkiserver/api/external/controller/OpenApiController.java b/src/main/java/org/hankki/hankkiserver/api/external/controller/OpenApiController.java new file mode 100644 index 00000000..74f4b697 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/external/controller/OpenApiController.java @@ -0,0 +1,24 @@ +package org.hankki.hankkiserver.api.external.controller; + +import lombok.RequiredArgsConstructor; +import org.hankki.hankkiserver.api.dto.HankkiResponse; +import org.hankki.hankkiserver.api.external.service.OpenApiService; +import org.hankki.hankkiserver.api.external.service.response.LocationsResponse; +import org.hankki.hankkiserver.common.code.CommonSuccessCode; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1") +public class OpenApiController { + + private final OpenApiService openApiService; + + @GetMapping("/locations") + public HankkiResponse getLocations(@RequestParam final String query) { + return HankkiResponse.success(CommonSuccessCode.OK, openApiService.getLocations(query)); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/external/service/OpenApiService.java b/src/main/java/org/hankki/hankkiserver/api/external/service/OpenApiService.java new file mode 100644 index 00000000..9680fc30 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/external/service/OpenApiService.java @@ -0,0 +1,29 @@ +package org.hankki.hankkiserver.api.external.service; + +import lombok.RequiredArgsConstructor; +import org.hankki.hankkiserver.api.external.service.response.LocationResponse; +import org.hankki.hankkiserver.api.external.service.response.LocationsResponse; +import org.hankki.hankkiserver.external.openfeign.naver.dto.NaverLocationsDto; +import org.hankki.hankkiserver.external.openfeign.naver.NaverFeignClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class OpenApiService { + + @Value("${naver.clientId}") + private String clientId; + @Value("${naver.clientSecret}") + private String clientSecret; + private static final int DEFAULT_SEARCH_SIZE = 5; + + private final NaverFeignClient naverFeignClient; + + public LocationsResponse getLocations(final String query) { + NaverLocationsDto locationsDto = naverFeignClient.getLocationInfo(clientId, clientSecret, query, DEFAULT_SEARCH_SIZE); + return LocationsResponse.of(locationsDto.items().stream() + .map(LocationResponse::of) + .toList()); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/external/service/response/LocationResponse.java b/src/main/java/org/hankki/hankkiserver/api/external/service/response/LocationResponse.java new file mode 100644 index 00000000..8294894e --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/external/service/response/LocationResponse.java @@ -0,0 +1,10 @@ +package org.hankki.hankkiserver.api.external.service.response; + +import org.hankki.hankkiserver.external.openfeign.naver.dto.NaverLocationInfo; + +public record LocationResponse(double latitude, double longitude, String name, String address) { + private static final int RATIO = 10000000; + public static LocationResponse of(NaverLocationInfo location) { + return new LocationResponse(location.mapy()/RATIO, location.mapx()/RATIO, location.title(), location.address()); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/external/service/response/LocationsResponse.java b/src/main/java/org/hankki/hankkiserver/api/external/service/response/LocationsResponse.java new file mode 100644 index 00000000..e8a9e329 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/external/service/response/LocationsResponse.java @@ -0,0 +1,11 @@ +package org.hankki.hankkiserver.api.external.service.response; + +import java.util.List; + +public record LocationsResponse( + List locations +) { + public static LocationsResponse of(List locations) { + return new LocationsResponse(locations); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/common/code/BusinessErrorCode.java b/src/main/java/org/hankki/hankkiserver/common/code/BusinessErrorCode.java index dfe2bb12..78e8ba19 100644 --- a/src/main/java/org/hankki/hankkiserver/common/code/BusinessErrorCode.java +++ b/src/main/java/org/hankki/hankkiserver/common/code/BusinessErrorCode.java @@ -8,6 +8,7 @@ @RequiredArgsConstructor public enum BusinessErrorCode implements ErrorCode { + BAD_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 내부 오류가 발생했습니다."); private final HttpStatus httpStatus; diff --git a/src/main/java/org/hankki/hankkiserver/external/openfeign/naver/NaverFeignClient.java b/src/main/java/org/hankki/hankkiserver/external/openfeign/naver/NaverFeignClient.java new file mode 100644 index 00000000..22ea2177 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/external/openfeign/naver/NaverFeignClient.java @@ -0,0 +1,18 @@ +package org.hankki.hankkiserver.external.openfeign.naver; + +import org.hankki.hankkiserver.external.openfeign.naver.dto.NaverLocationsDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(name = "naverClient", url = "https://openapi.naver.com") +public interface NaverFeignClient { + @GetMapping("/v1/search/local.json") + NaverLocationsDto getLocationInfo( + @RequestHeader("X-Naver-Client-Id") String clientId, + @RequestHeader("X-Naver-Client-Secret") String clientSecret, + @RequestParam("query") String query, + @RequestParam("display") int display + ); +} diff --git a/src/main/java/org/hankki/hankkiserver/external/openfeign/naver/dto/NaverLocationInfo.java b/src/main/java/org/hankki/hankkiserver/external/openfeign/naver/dto/NaverLocationInfo.java new file mode 100644 index 00000000..83b739df --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/external/openfeign/naver/dto/NaverLocationInfo.java @@ -0,0 +1,4 @@ +package org.hankki.hankkiserver.external.openfeign.naver.dto; + +public record NaverLocationInfo(double mapy, double mapx, String title, String address) { +} diff --git a/src/main/java/org/hankki/hankkiserver/external/openfeign/naver/dto/NaverLocationsDto.java b/src/main/java/org/hankki/hankkiserver/external/openfeign/naver/dto/NaverLocationsDto.java new file mode 100644 index 00000000..b9ca2187 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/external/openfeign/naver/dto/NaverLocationsDto.java @@ -0,0 +1,6 @@ +package org.hankki.hankkiserver.external.openfeign.naver.dto; + +import java.util.List; + +public record NaverLocationsDto(List items) { +}