From 1c264222de236599b65158cb0b31c6216ec150d4 Mon Sep 17 00:00:00 2001 From: code5753 Date: Sat, 25 Feb 2023 20:20:48 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=A3=BC=EC=86=8C=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=EA=B2=BD=EB=8F=84=EB=A1=9C=20=EB=B3=80=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=20Geocode=20API=20=EC=97=B0=EB=8F=99=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes: #41 --- .../place/controller/dto/CompanyDto.java | 11 ++- .../place/service/CompanyService.java | 8 ++- .../place/util/NaverMapGeocodeAPI.java | 67 +++++++++++++++++++ 3 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/ftw/hometerview/place/util/NaverMapGeocodeAPI.java diff --git a/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java b/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java index eb4e7b5..85e618e 100644 --- a/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java +++ b/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java @@ -1,6 +1,7 @@ package com.ftw.hometerview.place.controller.dto; import com.ftw.hometerview.place.domain.Company; +import com.ftw.hometerview.place.util.NaverMapGeocodeAPI.GeoPoint; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import lombok.Builder; @@ -15,18 +16,14 @@ public static class RegisterCompany { private String name; @NotBlank private String roadAddress; - @NotNull - private Double lat; - @NotNull - private Double lon; - public Company toCompany() { + public Company toCompany(GeoPoint geoPoint) { return Company.builder() .name(this.name) .roadAddress(this.roadAddress) // oo시 oo구 oo동 ~~ .province(this.roadAddress.split(" ")[1]) - .lat(this.lat) - .lon(this.lon) + .lat(geoPoint.getLat()) + .lon(geoPoint.getLon()) .build(); } } diff --git a/src/main/java/com/ftw/hometerview/place/service/CompanyService.java b/src/main/java/com/ftw/hometerview/place/service/CompanyService.java index c15dfc8..15636f9 100644 --- a/src/main/java/com/ftw/hometerview/place/service/CompanyService.java +++ b/src/main/java/com/ftw/hometerview/place/service/CompanyService.java @@ -5,6 +5,8 @@ import com.ftw.hometerview.place.controller.dto.CompanyDto; import com.ftw.hometerview.place.domain.Company; import com.ftw.hometerview.place.repository.company.CompanyRepository; +import com.ftw.hometerview.place.util.NaverMapGeocodeAPI; +import com.ftw.hometerview.place.util.NaverMapGeocodeAPI.GeoPoint; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; @@ -15,12 +17,16 @@ public class CompanyService { private final CompanyRepository companyRepository; + private final NaverMapGeocodeAPI naverMapGeocodeAPI; public void register(CompanyDto.RegisterCompany req) { if (isDuplicated(req.getName(), req.getRoadAddress())) { throw new BadRequestException(ResponseType.DATA_DUPLICATED); } - Company company = req.toCompany(); + + GeoPoint geoPoint = naverMapGeocodeAPI.convert(req.getRoadAddress()); + + Company company = req.toCompany(geoPoint); // TODO: get nearliest station from naver API // TODO: get station id from db company.setNearliestStation(""); diff --git a/src/main/java/com/ftw/hometerview/place/util/NaverMapGeocodeAPI.java b/src/main/java/com/ftw/hometerview/place/util/NaverMapGeocodeAPI.java new file mode 100644 index 0000000..b9ef3d3 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/util/NaverMapGeocodeAPI.java @@ -0,0 +1,67 @@ +package com.ftw.hometerview.place.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.List; +import java.util.Map; +import lombok.Builder; +import lombok.Getter; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; + +@Log4j2 +@Component +public class NaverMapGeocodeAPI { + + @Builder + @Getter + public static class GeoPoint { + + Double lat; + Double lon; + } + + private static final String BASE_URL = "https://naveropenapi.apigw.ntruss.com"; + private static final String PATH = "/map-geocode/v2/geocode"; + @Value("${naver.api-key-id}") + private String API_KEY_ID; + @Value("${naver.api-key}") + private String API_KEY; + + public GeoPoint convert(String address) { + WebClient client = WebClient.builder() + .baseUrl(BASE_URL) + .build(); + + ObjectMapper objectMapper = new ObjectMapper(); + + String responseJson = client.get() + .uri(uriBuilder -> uriBuilder + .path(PATH) + .queryParam("query", address) + .build()) + .header("X-NCP-APIGW-API-KEY-ID", API_KEY_ID) + .header("X-NCP-APIGW-API-KEY", API_KEY) + .retrieve() + .bodyToMono(String.class) + .block(); + + Map responseMap = null; + try { + responseMap = objectMapper.readValue(responseJson, Map.class); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + List> addressesMap = (List>) responseMap.get( + "addresses"); + Map addressMap = addressesMap.get(0); + String lon = addressMap.get("x"); + String lat = addressMap.get("y"); + return GeoPoint.builder() + .lat(Double.parseDouble(lat)) + .lon(Double.parseDouble(lon)) + .build(); + } +}