diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/KakaoApiController.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/KakaoApiController.java index 594d4639..32acd9c6 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/KakaoApiController.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/KakaoApiController.java @@ -1,7 +1,11 @@ package com.back.web7_9_codecrete_be.domain.location.controller; -import com.back.web7_9_codecrete_be.domain.location.dto.KakaoLocalResponse; +import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoLocalResponse; +import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoMobilityResponse; +import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoRouteTransitResponse; import com.back.web7_9_codecrete_be.domain.location.service.KakaoLocalService; +import com.back.web7_9_codecrete_be.global.error.code.LocationErrorCode; +import com.back.web7_9_codecrete_be.global.error.exception.BusinessException; import com.back.web7_9_codecrete_be.global.rsData.RsData; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -32,7 +36,7 @@ public class KakaoApiController { public List KakaoRestaurants( @RequestParam double lat, @RequestParam double lon - ){ + ) { return kakaoLocalService.searchNearbyRestaurants(lat, lon); } @@ -46,7 +50,7 @@ public List KakaoRestaurants( public List KakaoCafes( @RequestParam double lat, @RequestParam double lon - ){ + ) { return kakaoLocalService.searchNearbyCafes(lat, lon); } @@ -68,4 +72,74 @@ public RsData coord2Address( String addressName = kakaoLocalService.coordinateToAddressName(lat, lon); return RsData.success("좌표를 주소로 변환했습니다.", addressName); } + + + @GetMapping("/navigate/guides") + public List navigateGuides( + @RequestParam double startX, + @RequestParam double startY, + @RequestParam double endX, + @RequestParam double endY + ) { + KakaoMobilityResponse res = kakaoLocalService.NaviSearch(startX, startY, endX, endY); + + if (res == null || res.getRoutes() == null || res.getRoutes().isEmpty()) { + return List.of(); + } + + KakaoMobilityResponse.Route route0 = res.getRoutes().get(0); + if (route0.getSections() == null || route0.getSections().isEmpty()) { + return List.of(); + } + + return route0.getSections().stream() + .filter(section -> section.getGuides() != null && !section.getGuides().isEmpty()) + .flatMap(section -> section.getGuides().stream()) + .toList(); + } + @GetMapping("/navigate/summary") + public KakaoMobilityResponse.Summary navigateSummary( + @RequestParam double startX, + @RequestParam double startY, + @RequestParam double endX, + @RequestParam double endY + ) { + KakaoMobilityResponse res = kakaoLocalService.NaviSearchSummary(startX, startY, endX, endY); + + if (res == null || res.getRoutes() == null || res.getRoutes().isEmpty()) { + throw new BusinessException(LocationErrorCode.ROUTE_NOT_FOUND); + } + + KakaoMobilityResponse.Route route0 = res.getRoutes().get(0); + if (route0.getSummary() == null) { + throw new BusinessException(LocationErrorCode.ROUTE_NOT_FOUND); + } + + return route0.getSummary(); + + } + + @PostMapping("/navigate/onlyguide") + public List navigateOnlyGuides( + @RequestParam double startX, + @RequestParam double startY, + @RequestParam double endX, + @RequestParam double endY, + @RequestParam double wayX, + @RequestParam double wayY + ) { + KakaoRouteTransitResponse res = kakaoLocalService.NaviSearchTransit(startX, startY, endX, endY, wayX, wayY); + + if (res == null || res.getRoutes() == null || res.getRoutes().isEmpty()) { + return List.of(); + } + + KakaoRouteTransitResponse.Route route0 = res.getRoutes().get(0); + + return route0.getSections().stream() + .filter(section -> section.getGuides() != null && !section.getGuides().isEmpty()) + .flatMap(section -> section.getGuides().stream()) + .toList(); + } } + diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/TmapApiController.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/TmapApiController.java index fb45f64a..e406a724 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/TmapApiController.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/TmapApiController.java @@ -1,5 +1,8 @@ package com.back.web7_9_codecrete_be.domain.location.controller; +import com.back.web7_9_codecrete_be.domain.location.dto.request.TmapSummaryRequest; +import com.back.web7_9_codecrete_be.domain.location.dto.response.TmapSummaryAllResponse; +import com.back.web7_9_codecrete_be.domain.location.dto.response.TmapSummaryResponse; import com.back.web7_9_codecrete_be.domain.location.service.TmapService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -71,4 +74,9 @@ public String getTransit( ) { return tmapService.getRoute(startX, startY, endX, endY); } + + @GetMapping("/tmap/summary") + public TmapSummaryAllResponse getSummaryTransit(double startX, double startY, double endX, double endY){ + return tmapService.getSummaryRoute(startX, startY, endX, endY); + } } diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/TmapResponse.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/request/TmapRequest.java similarity index 90% rename from src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/TmapResponse.java rename to src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/request/TmapRequest.java index 87121037..d63b11fe 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/TmapResponse.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/request/TmapRequest.java @@ -1,11 +1,12 @@ -package com.back.web7_9_codecrete_be.domain.location.dto; +package com.back.web7_9_codecrete_be.domain.location.dto.request; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data + @Schema(description = "Tmap 대중교통 경로 조회 요청 DTO") -public class TmapResponse { +public class TmapRequest { @Schema(description = "출발지 경도 (longitude)", example = "126.9780") private String startX; diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/request/TmapSummaryRequest.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/request/TmapSummaryRequest.java new file mode 100644 index 00000000..2da83ee0 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/request/TmapSummaryRequest.java @@ -0,0 +1,32 @@ +package com.back.web7_9_codecrete_be.domain.location.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class TmapSummaryRequest { + + @Schema(description = "출발지 경도 (longitude)", example = "126.9780") + private double startX; + + @Schema(description = "출발지 위도 (latitude)", example = "37.5665") + private double startY; + + @Schema(description = "도착지 경도 (longitude)", example = "127.0276") + private double endX; + + @Schema(description = "도착지 위도 (latitude)", example = "37.4979") + private double endY; + + @Schema(description = "최대 응답 결과 개수", example = "5") + private int count; + + @Schema( + description = "응답 포맷 (json / xml)", + example = "json", + allowableValues = {"json", "xml"} + ) + private String format; +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/KakaoLocalResponse.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/KakaoLocalResponse.java similarity index 94% rename from src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/KakaoLocalResponse.java rename to src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/KakaoLocalResponse.java index 46dcaf31..8b1ecda3 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/KakaoLocalResponse.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/KakaoLocalResponse.java @@ -1,4 +1,4 @@ -package com.back.web7_9_codecrete_be.domain.location.dto; +package com.back.web7_9_codecrete_be.domain.location.dto.response; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/KakaoMobilityResponse.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/KakaoMobilityResponse.java new file mode 100644 index 00000000..c2c191c6 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/KakaoMobilityResponse.java @@ -0,0 +1,52 @@ +package com.back.web7_9_codecrete_be.domain.location.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; +@Getter +@AllArgsConstructor +public class KakaoMobilityResponse { + + + private List routes; + + @Getter + public static class Route { + private Summary summary; + private List
sections; + } + + @Getter + public static class Summary { + private int distance; // meters + private int duration; // seconds + } + + @Getter + public static class Section{ + private List roads; + private List guides; + public List getGuides() { + return guides; + } + } + + @Getter + public static class Road{ + private List vertexes; + } + + + @Getter + public static class Guide { + private String name; + private double x; + private double y; + private int distance; + private int duration; + private int type; + private String guidance; + private int road_index; + } +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/KakaoRouteTransitResponse.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/KakaoRouteTransitResponse.java new file mode 100644 index 00000000..848a0199 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/KakaoRouteTransitResponse.java @@ -0,0 +1,79 @@ +package com.back.web7_9_codecrete_be.domain.location.dto.response; + +import lombok.Getter; +import java.util.List; + +@Getter +public class KakaoRouteTransitResponse { + + private List routes; + + @Getter + public static class Route { + private Summary summary; + private List
sections; + } + + @Getter + public static class Summary { + private Origin origin; + private Destination destination; + private List waypoints; // ✅ 경유지(요청값) + + private String priority; + private Fare fare; + + private int distance; // meters + private int duration; // seconds + } + + @Getter + public static class Origin { + private String name; + private double x; + private double y; + } + + @Getter + public static class Destination { + private String name; + private double x; + private double y; + } + + @Getter + public static class Waypoint { + private String name; + private double x; + private double y; + } + + @Getter + public static class Fare { + private int taxi; + private int toll; + } + + @Getter + public static class Section { + private List roads; + private List guides; + } + + @Getter + public static class Road { + private List vertexes; + } + + @Getter + public static class Guide { + private String name; + private double x; + private double y; + private int distance; + private int duration; + private int type; + private String guidance; + private int road_index; + } +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/TmapSummaryAllResponse.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/TmapSummaryAllResponse.java new file mode 100644 index 00000000..055662e2 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/TmapSummaryAllResponse.java @@ -0,0 +1,71 @@ +package com.back.web7_9_codecrete_be.domain.location.dto.response; + +import lombok.Getter; + +import java.util.List; +@Getter +public class TmapSummaryAllResponse { + + private MetaData metaData; + + // ===================== metaData ===================== + @Getter + public static class MetaData { + private Plan plan; + private RequestParameters requestParameters; + } + + // ===================== plan ===================== + @Getter + public static class Plan { + private List itineraries; + } + + // ===================== itineraries ===================== + @Getter + public static class Itinerary { + + private int pathType; // 경로 탐색 결과 종류 + private int totalTime; // 총 소요시간 (sec) + private int transferCount; // 환승 횟수 + private int totalWalkDistance; // 총 보행 거리 (m) + private int totalDistance; // 총 이동 거리 (m) + private int totalWalkTime; // 총 보행 시간 (sec) + + private Fare fare; // 요금 정보 + } + + // ===================== fare ===================== + @Getter + public static class Fare { + private Regular regular; + } + + // ===================== regular ===================== + @Getter + public static class Regular { + private Currency currency; + private int totalFare; // 대중교통 요금 + } + + // ===================== currency ===================== + @Getter + public static class Currency { + private String symbol; // ₩ + private String currency; // 원 + private String currencyCode; // KRW + } + + // ===================== requestParameters ===================== + @Getter + public static class RequestParameters { + + private String reqDttm; // 요청 시각 (yyyymmddhhmiss) + + private String startX; // 출발지 경도 + private String startY; // 출발지 위도 + private String endX; // 도착지 경도 + private String endY; // 도착지 위도 + } + +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/TmapSummaryResponse.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/TmapSummaryResponse.java new file mode 100644 index 00000000..eb08b9e8 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/response/TmapSummaryResponse.java @@ -0,0 +1,40 @@ +package com.back.web7_9_codecrete_be.domain.location.dto.response; + +import lombok.Getter; + +import java.util.List; + +@Getter +public class TmapSummaryResponse { + + private MetaData metaData; + + @Getter + public static class MetaData { + private Plan plan; + } + + @Getter + public static class Plan { + private List itineraries; + } + + @Getter + public static class Itinerary { + private int totalTime; + private int totalDistance; + private int transferCount; + private Fare fare; + } + + @Getter + public static class Fare { + private Regular regular; + } + + @Getter + public static class Regular { + private int totalFare; + } + +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/KakaoLocalService.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/KakaoLocalService.java index b8299297..f8d18b48 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/KakaoLocalService.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/KakaoLocalService.java @@ -1,11 +1,14 @@ package com.back.web7_9_codecrete_be.domain.location.service; import com.back.web7_9_codecrete_be.domain.location.dto.KakaoCoordinateResponse; -import com.back.web7_9_codecrete_be.domain.location.dto.KakaoLocalResponse; +import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoLocalResponse; +import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoMobilityResponse; +import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoRouteTransitResponse; import com.back.web7_9_codecrete_be.global.error.code.LocationErrorCode; import com.back.web7_9_codecrete_be.global.error.exception.BusinessException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClient; import org.springframework.web.reactive.function.client.WebClient; import java.util.List; @@ -14,14 +17,16 @@ @RequiredArgsConstructor public class KakaoLocalService { - private final WebClient kakaoWebClient; + private final RestClient kakaoRestClient; + private final RestClient kakaoMobilityClient; public List searchNearbyRestaurants(double lat, double lng) { - return kakaoWebClient.get() + return kakaoRestClient.get() .uri(uriBuilder -> uriBuilder .path("/v2/local/search/keyword.json") .queryParam("query", "음식점") + .queryParam("category_group_code", "FD6") .queryParam("y", lat) .queryParam("x", lng) .queryParam("radius", 1000) // 반경 1km @@ -29,13 +34,12 @@ public List searchNearbyRestaurants(double lat, dou .build() ) .retrieve() - .bodyToMono(KakaoLocalResponse.class) - .block() // 동기 호출 (필요하면 비동기로 변경 가능) + .body(KakaoLocalResponse.class) .getDocuments(); } public List searchNearbyCafes(double lat, double lng) { - return kakaoWebClient.get() + return kakaoRestClient.get() .uri(uriBuilder -> uriBuilder .path("/v2/local/search/keyword.json") .queryParam("query", "카페") @@ -47,14 +51,13 @@ public List searchNearbyCafes(double lat, double ln .build() ) .retrieve() - .bodyToMono(KakaoLocalResponse.class) - .block() // 동기 호출 (필요하면 비동기로 변경 가능) + .body(KakaoLocalResponse.class) .getDocuments(); } public String coordinateToAddressName(double lat, double lng) { - KakaoCoordinateResponse response = kakaoWebClient.get() + KakaoCoordinateResponse response = kakaoRestClient.get() .uri(uriBuilder -> uriBuilder .path("/v2/local/geo/coord2address.json") .queryParam("x", lng) @@ -62,8 +65,7 @@ public String coordinateToAddressName(double lat, double lng) { .build() ) .retrieve() - .bodyToMono(KakaoCoordinateResponse.class) - .block(); + .body(KakaoCoordinateResponse.class); if (response == null || response.getDocuments() == null || response.getDocuments().isEmpty()) { throw new BusinessException(LocationErrorCode.ADDRESS_NOT_FOUND); @@ -85,4 +87,64 @@ public String coordinateToAddressName(double lat, double lng) { return addressName; } + public KakaoMobilityResponse NaviSearch(double startX, double startY, double endX, double endY) { + + KakaoMobilityResponse response = kakaoMobilityClient.get() + .uri(uriBuilder -> uriBuilder + .path("/v1/directions") + .queryParam("origin", startX + "," + startY) + .queryParam("destination", endX + "," + endY) + .queryParam("priority", "TIME") + .queryParam("summary", "false") + .build() + ) + .retrieve() + .body(KakaoMobilityResponse.class); + + + if (response == null || response.getRoutes().isEmpty()) { + throw new BusinessException(LocationErrorCode.ROUTE_NOT_FOUND); + } + + return response; + } + + public KakaoMobilityResponse NaviSearchSummary(double startX, double startY, double endX, double endY) { + + KakaoMobilityResponse response = kakaoMobilityClient.get() + .uri(uriBuilder -> uriBuilder + .path("/v1/directions") + .queryParam("origin", startX + "," + startY) + .queryParam("destination", endX + "," + endY) + .queryParam("priority", "TIME") + .queryParam("summary", "true") + .build() + ) + .retrieve() + .body(KakaoMobilityResponse.class); + + + if (response == null || response.getRoutes().isEmpty()) { + throw new BusinessException(LocationErrorCode.ROUTE_NOT_FOUND); + } + + return response; + } + + public KakaoRouteTransitResponse NaviSearchTransit(double startX, double startY + , double endX, double endY, double wayX, double wayY){ + KakaoRouteTransitResponse response = kakaoMobilityClient.post() + .uri(uriBuilder -> uriBuilder + .path("/v1/waypoints/directions") + .queryParam("origin", startX + "," + startY) + .queryParam("destination", endX + "," + endY) + .queryParam("waypoints", wayX + "," + wayY) + .queryParam("priority", "TIME") + .queryParam("summary", "false") + .build() + ) + .retrieve() + .body(KakaoRouteTransitResponse.class); + return response; + } } \ No newline at end of file diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/LocationService.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/LocationService.java index 262dcaa2..468ee645 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/LocationService.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/LocationService.java @@ -1,13 +1,10 @@ package com.back.web7_9_codecrete_be.domain.location.service; -import com.back.web7_9_codecrete_be.domain.location.dto.KakaoLocalResponse; import com.back.web7_9_codecrete_be.domain.location.dto.request.LocationRequestDto; import com.back.web7_9_codecrete_be.domain.location.dto.response.LocationResponseDto; import com.back.web7_9_codecrete_be.domain.location.entity.Location; import com.back.web7_9_codecrete_be.domain.location.repository.LocationRepository; import com.back.web7_9_codecrete_be.domain.users.entity.User; -import com.back.web7_9_codecrete_be.domain.users.repository.UserRepository; -import com.back.web7_9_codecrete_be.global.error.code.AuthErrorCode; import com.back.web7_9_codecrete_be.global.error.code.LocationErrorCode; import com.back.web7_9_codecrete_be.global.error.exception.BusinessException; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/TmapService.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/TmapService.java index 055166d3..abf37484 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/TmapService.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/TmapService.java @@ -1,32 +1,50 @@ package com.back.web7_9_codecrete_be.domain.location.service; -import com.back.web7_9_codecrete_be.domain.location.dto.KakaoLocalResponse; -import com.back.web7_9_codecrete_be.domain.location.dto.TmapResponse; -import lombok.RequiredArgsConstructor; +import com.back.web7_9_codecrete_be.domain.location.dto.request.TmapRequest; +import com.back.web7_9_codecrete_be.domain.location.dto.request.TmapSummaryRequest; +import com.back.web7_9_codecrete_be.domain.location.dto.response.TmapSummaryAllResponse; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.MediaType; import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.client.RestClient; @Service -@RequiredArgsConstructor public class TmapService { - private final WebClient TmapClient; + private final RestClient tmapRestClient; + public TmapService(@Qualifier("tmapRestClient") RestClient tmapRestClient) { + this.tmapRestClient = tmapRestClient; + } public String getRoute(double startX, double startY, double endX, double endY) { - TmapResponse request = new TmapResponse(); - request.setStartX(String.valueOf(startX)); - request.setStartY(String.valueOf(startY)); - request.setEndX(String.valueOf(endX)); - request.setEndY(String.valueOf(endY)); - request.setFormat("json"); - request.setCount(5); + TmapRequest req = new TmapRequest(); + req.setStartX(String.valueOf(startX)); + req.setStartY(String.valueOf(startY)); + req.setEndX(String.valueOf(endX)); + req.setEndY(String.valueOf(endY)); + req.setCount(5); + req.setFormat("json"); - return TmapClient.post() + return tmapRestClient.post() .uri("/transit/routes") - .bodyValue(request) + .contentType(MediaType.APPLICATION_JSON) + .body(req) + .retrieve() + .body(String.class); + } + + public TmapSummaryAllResponse getSummaryRoute(double startX, double startY, double endX, double endY){ + return tmapRestClient.post() + .uri("/transit/routes/sub") + .contentType(MediaType.APPLICATION_JSON) + .body(new TmapSummaryRequest( + startX, startY, + endX, endY, + 1, + "json" + )) .retrieve() - .bodyToMono(String.class) - .block(); + .body(TmapSummaryAllResponse.class); } } diff --git a/src/main/java/com/back/web7_9_codecrete_be/global/config/WebClientConfig.java b/src/main/java/com/back/web7_9_codecrete_be/global/config/WebClientConfig.java index 01ad8736..c23c502d 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/global/config/WebClientConfig.java +++ b/src/main/java/com/back/web7_9_codecrete_be/global/config/WebClientConfig.java @@ -7,6 +7,7 @@ import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.client.RestClient; import org.springframework.web.client.RestTemplate; import org.springframework.web.reactive.function.client.WebClient; @@ -35,6 +36,10 @@ public class WebClientConfig { @Value("${tmap.base-url}") private String tmapBaseUrl; + + @Value("${kakao.mobility.base-url}") + private String kakaoMobilityUrl; + @Bean public WebClient mailgunClient() { String auth = "api:" + mailgunApiKey; @@ -61,19 +66,29 @@ public RestTemplate restTemplate() { return restTemplate; } + @Bean - public WebClient kakaoWebClient() { + public RestClient kakaoRestClient(){ - return WebClient.builder() + return RestClient.builder() .baseUrl(kakaoBaseUrl) .defaultHeader("Authorization", kakaomapApiKey) .build(); + } + @Bean + public RestClient kakaoMobilityClient(){ + return RestClient.builder() + .baseUrl(kakaoMobilityUrl) + .defaultHeader("Authorization", kakaomapApiKey) + .build(); + + } @Bean - public WebClient TmapClient(){ - return WebClient.builder() + public RestClient tmapRestClient(){ + return RestClient.builder() .baseUrl(tmapBaseUrl) .defaultHeader("appKey", tmapApiKey) .build(); diff --git a/src/main/java/com/back/web7_9_codecrete_be/global/error/code/LocationErrorCode.java b/src/main/java/com/back/web7_9_codecrete_be/global/error/code/LocationErrorCode.java index c18a2bcd..e16c8029 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/global/error/code/LocationErrorCode.java +++ b/src/main/java/com/back/web7_9_codecrete_be/global/error/code/LocationErrorCode.java @@ -13,7 +13,8 @@ public enum LocationErrorCode implements ErrorCode{ LOCATION_ALREADY_EXISTS(HttpStatus.NOT_FOUND, "L-102", "이미 저장되어있는 위치입니다."), INVALID_KOREA_COORDINATE(HttpStatus.NOT_FOUND, "L-103" , "한국 좌표가 아닙니다"), LOCATION_NOT_EXIST_IN_KAKAO(HttpStatus.NOT_FOUND, "L-104", "해당 좌표는 카카오에 등록되어있지 않습니다."), - LOCATION_NOT_HAVE(HttpStatus.NOT_FOUND, "L-105", "저장되어있는 좌표가 없어서 삭제가 불가능합니다."); + LOCATION_NOT_HAVE(HttpStatus.NOT_FOUND, "L-105", "저장되어있는 좌표가 없어서 삭제가 불가능합니다."), + ROUTE_NOT_FOUND(HttpStatus.NOT_FOUND, "L-106", "추천 경로가 존재하지 않습니다"); private final HttpStatus status; private final String code; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3bf45408..9764f0f8 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -51,6 +51,8 @@ tmap: #Tmap 대중교통 추천 api 키 kakao: #Kakao map REST API 키 base-url: https://dapi.kakao.com restapi-key: ${KAKAOMAP_API_KEY} + mobility: + base-url: https://apis-navi.kakaomobility.com kopis: api-key: ${KOPIST_API_KEY} diff --git a/src/test/java/com/back/web7_9_codecrete_be/domain/location/service/KakaoLocalServiceTest.java b/src/test/java/com/back/web7_9_codecrete_be/domain/location/service/KakaoLocalServiceTest.java index a44046f1..2ffb4073 100644 --- a/src/test/java/com/back/web7_9_codecrete_be/domain/location/service/KakaoLocalServiceTest.java +++ b/src/test/java/com/back/web7_9_codecrete_be/domain/location/service/KakaoLocalServiceTest.java @@ -1,6 +1,6 @@ package com.back.web7_9_codecrete_be.domain.location.service; -import com.back.web7_9_codecrete_be.domain.location.dto.KakaoLocalResponse; +import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoLocalResponse; import com.back.web7_9_codecrete_be.global.config.WebClientConfig; import com.back.web7_9_codecrete_be.global.error.exception.BusinessException; import okhttp3.mockwebserver.MockResponse; diff --git a/src/test/java/com/back/web7_9_codecrete_be/domain/location/service/TmapServiceTest.java b/src/test/java/com/back/web7_9_codecrete_be/domain/location/service/TmapServiceTest.java index d00223f4..de782c10 100644 --- a/src/test/java/com/back/web7_9_codecrete_be/domain/location/service/TmapServiceTest.java +++ b/src/test/java/com/back/web7_9_codecrete_be/domain/location/service/TmapServiceTest.java @@ -1,6 +1,5 @@ package com.back.web7_9_codecrete_be.domain.location.service; -import com.back.web7_9_codecrete_be.domain.location.dto.KakaoLocalResponse; import com.back.web7_9_codecrete_be.global.config.WebClientConfig; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; @@ -9,17 +8,12 @@ import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.io.IOException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.List; import static org.assertj.core.api.Assertions.assertThat;