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(); + } +}