Skip to content

Commit 19a09fb

Browse files
committed
feat: kakao mobility api 를 프론트 응답값으로 조정
1 parent fb56c71 commit 19a09fb

6 files changed

Lines changed: 185 additions & 49 deletions

File tree

src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/KakaoApiController.java

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.back.web7_9_codecrete_be.domain.location.controller;
22

3+
import com.back.web7_9_codecrete_be.domain.location.dto.KakaoRouteFeResponse;
4+
import com.back.web7_9_codecrete_be.domain.location.dto.KakaoRouteSectionFeResponse;
35
import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoLocalResponse;
46
import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoMobilityResponse;
7+
import com.back.web7_9_codecrete_be.domain.location.dto.request.KakaoRouteTransitRequest;
58
import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoRouteTransitResponse;
69
import com.back.web7_9_codecrete_be.domain.location.service.KakaoLocalService;
710
import com.back.web7_9_codecrete_be.global.error.code.LocationErrorCode;
@@ -16,6 +19,7 @@
1619
import lombok.RequiredArgsConstructor;
1720
import org.springframework.web.bind.annotation.*;
1821

22+
import java.util.ArrayList;
1923
import java.util.List;
2024

2125
@Tag(name = "Location - Kakao", description = "카카오 로컬 API 연동(주변 음식점 조회, 좌표→주소 변환) 관련 엔드포인트")
@@ -97,6 +101,8 @@ public List<KakaoMobilityResponse.Guide> navigateGuides(
97101
.flatMap(section -> section.getGuides().stream())
98102
.toList();
99103
}
104+
105+
100106
@GetMapping("/navigate/summary")
101107
public KakaoMobilityResponse.Summary navigateSummary(
102108
@RequestParam double startX,
@@ -119,27 +125,53 @@ public KakaoMobilityResponse.Summary navigateSummary(
119125

120126
}
121127

128+
//카카오 자동차 api인데, 경유지가 존재하는 경우에 사용
122129
@PostMapping("/navigate/onlyguide")
123-
public List<KakaoRouteTransitResponse.Guide> navigateOnlyGuides(
124-
@RequestParam double startX,
125-
@RequestParam double startY,
126-
@RequestParam double endX,
127-
@RequestParam double endY,
128-
@RequestParam double wayX,
129-
@RequestParam double wayY
130+
public KakaoRouteSectionFeResponse navigateOnlyGuides(@RequestBody KakaoRouteTransitRequest req
130131
) {
131-
KakaoRouteTransitResponse res = kakaoLocalService.NaviSearchTransit(startX, startY, endX, endY, wayX, wayY);
132132

133-
if (res == null || res.getRoutes() == null || res.getRoutes().isEmpty()) {
134-
return List.of();
135-
}
133+
KakaoRouteTransitResponse res = kakaoLocalService.NaviSearchTransit(req);
134+
KakaoRouteTransitResponse.Route route = res.getRoutes().get(0);
136135

137-
KakaoRouteTransitResponse.Route route0 = res.getRoutes().get(0);
136+
KakaoRouteTransitResponse.Summary summary = route.getSummary();
138137

139-
return route0.getSections().stream()
140-
.filter(section -> section.getGuides() != null && !section.getGuides().isEmpty())
141-
.flatMap(section -> section.getGuides().stream())
142-
.toList();
138+
List<Object> points = new ArrayList<>(); // 출발지, 경유지, 목적지 좌표를 저장
139+
140+
points.add(summary.getOrigin());
141+
points.addAll(summary.getWaypoints()); // Waypoints는 배열이니까 addAll 사용
142+
points.add(summary.getDestination());
143+
144+
145+
// 구간별 좌표, Distance, Duration 표현
146+
List<KakaoRouteFeResponse> sections = new ArrayList<>();
147+
148+
for (int i = 0; i < route.getSections().size(); i++) {
149+
KakaoRouteTransitResponse.Section section = route.getSections().get(i);
150+
151+
sections.add(new KakaoRouteFeResponse( //sections 리스트에 각각의 section 정보들을 추가
152+
i,
153+
section.getDistance(),
154+
section.getDuration(),
155+
points.get(i), // 출발지
156+
points.get(i + 1) // 목적지
157+
));
158+
}
159+
160+
// distance전체 합계
161+
int totalDistance = route.getSections().stream()
162+
.mapToInt(KakaoRouteTransitResponse.Section::getDistance)
163+
.sum();
164+
165+
// duration 전체 합계
166+
int totalDuration = route.getSections().stream()
167+
.mapToInt(KakaoRouteTransitResponse.Section::getDuration)
168+
.sum();
169+
170+
return new KakaoRouteSectionFeResponse(
171+
totalDistance,
172+
totalDuration,
173+
sections
174+
);
143175
}
144176
}
145177

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.back.web7_9_codecrete_be.domain.location.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
6+
@Data
7+
@AllArgsConstructor
8+
public class KakaoRouteFeResponse { //경유지까지의 인덱스, 거리, 시간, 좌표를 나타냄
9+
private int routeIndex;
10+
private int distance;
11+
private int duration;
12+
private Object from;
13+
private Object to;
14+
15+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.back.web7_9_codecrete_be.domain.location.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
6+
import java.util.List;
7+
@Data
8+
@AllArgsConstructor
9+
public class KakaoRouteSectionFeResponse { //프론트에서 원하는 전체 거리, 시간, 좌표로, section에서는 경유지를 거치는 값들을 저장
10+
private int totalDistance;
11+
private int totalDuration;
12+
private List<KakaoRouteFeResponse> sections;
13+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.back.web7_9_codecrete_be.domain.location.dto.request;
2+
3+
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
4+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
5+
import lombok.Data;
6+
7+
import java.util.List;
8+
9+
@Data
10+
public class KakaoRouteTransitRequest { //Kakao mobility api에서 경유지 추가 response
11+
12+
private Origin origin;
13+
private Destination destination;
14+
private List<Waypoint> waypoints;
15+
16+
private String priority;
17+
private String car_fuel;
18+
private boolean car_hipass;
19+
private boolean alternatives;
20+
private boolean road_details;
21+
private boolean summary;
22+
23+
@Data
24+
public static class Origin {
25+
private double x;
26+
private double y;
27+
private int angle;
28+
}
29+
30+
@Data
31+
public static class Destination {
32+
private double x;
33+
private double y;
34+
}
35+
36+
@Data
37+
public static class Waypoint {
38+
private String name;
39+
private double x;
40+
private double y;
41+
}
42+
43+
}
Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,98 @@
11
package com.back.web7_9_codecrete_be.domain.location.dto.response;
22

3-
import lombok.Getter;
3+
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
4+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
5+
import lombok.Data;
6+
47
import java.util.List;
58

6-
@Getter
7-
public class KakaoRouteTransitResponse { //Kakao mobility api에서 경유지 추가 response
9+
@Data
10+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
11+
public class KakaoRouteTransitResponse {
812

13+
private String transId;
914
private List<Route> routes;
1015

11-
@Getter
16+
@Data
17+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
1218
public static class Route {
19+
private int resultCode;
20+
private String resultMsg;
1321
private Summary summary;
1422
private List<Section> sections;
1523
}
1624

17-
@Getter
25+
@Data
26+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
1827
public static class Summary {
1928
private Origin origin;
2029
private Destination destination;
21-
private List<Waypoint> waypoints; // 경유지(요청값)
22-
30+
private List<Waypoint> waypoints;
2331
private String priority;
32+
private Bound bound; // optional일 수 있음
2433
private Fare fare;
25-
26-
private int distance; // meters
27-
private int duration; // seconds
34+
private int distance;
35+
private int duration;
2836
}
2937

30-
@Getter
38+
@Data
3139
public static class Origin {
3240
private String name;
3341
private double x;
3442
private double y;
3543
}
3644

37-
@Getter
45+
@Data
3846
public static class Destination {
3947
private String name;
4048
private double x;
4149
private double y;
4250
}
4351

44-
@Getter
52+
@Data
4553
public static class Waypoint {
4654
private String name;
4755
private double x;
4856
private double y;
4957
}
5058

51-
@Getter
59+
@Data
60+
public static class Bound {
61+
private double minX;
62+
private double minY;
63+
private double maxX;
64+
private double maxY;
65+
}
66+
67+
@Data
5268
public static class Fare {
5369
private int taxi;
5470
private int toll;
5571
}
5672

57-
@Getter
73+
@Data
74+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
5875
public static class Section {
59-
private List<Road> roads;
60-
private List<Guide> guides;
76+
private int distance;
77+
private int duration;
78+
private Bound bound; // summary=false일 때만 올 수 있음
79+
private List<Road> roads; // summary=false일 때만 올 수 있음
80+
private List<Guide> guides; // summary=false일 때만 올 수 있음
6181
}
6282

63-
@Getter
83+
@Data
84+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
6485
public static class Road {
86+
private String name;
87+
private int distance;
88+
private int duration;
89+
private double trafficSpeed;
90+
private int trafficState;
6591
private List<Double> vertexes;
6692
}
6793

68-
@Getter
94+
@Data
95+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
6996
public static class Guide {
7097
private String name;
7198
private double x;
@@ -74,6 +101,6 @@ public static class Guide {
74101
private int duration;
75102
private int type;
76103
private String guidance;
77-
private int road_index;
104+
private int roadIndex;
78105
}
79106
}

src/main/java/com/back/web7_9_codecrete_be/domain/location/service/KakaoLocalService.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
import com.back.web7_9_codecrete_be.domain.location.dto.KakaoCoordinateResponse;
44
import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoLocalResponse;
55
import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoMobilityResponse;
6+
import com.back.web7_9_codecrete_be.domain.location.dto.request.KakaoRouteTransitRequest;
7+
//import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoRouteTransitFeResponse;
68
import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoRouteTransitResponse;
79
import com.back.web7_9_codecrete_be.global.error.code.LocationErrorCode;
810
import com.back.web7_9_codecrete_be.global.error.exception.BusinessException;
911
import lombok.RequiredArgsConstructor;
1012
import org.springframework.stereotype.Service;
1113
import org.springframework.web.client.RestClient;
12-
import org.springframework.web.reactive.function.client.WebClient;
1314

1415
import java.util.List;
1516

@@ -139,20 +140,25 @@ public KakaoMobilityResponse NaviSearchSummary(double startX, double startY, dou
139140

140141

141142
//Kakao mobility api에서 경유지가 있을때
142-
public KakaoRouteTransitResponse NaviSearchTransit(double startX, double startY
143-
, double endX, double endY, double wayX, double wayY){
143+
public KakaoRouteTransitResponse NaviSearchTransit(KakaoRouteTransitRequest transitRequest){
144+
145+
146+
//카카오가 원하는 요청값을 만들어주고 보내야함 (필수값들)
147+
KakaoRouteTransitRequest transit = new KakaoRouteTransitRequest();
148+
transit.setOrigin(transitRequest.getOrigin());
149+
transit.setDestination(transitRequest.getDestination());
150+
transit.setWaypoints(transitRequest.getWaypoints());
151+
152+
transit.setPriority("TIME");
153+
transit.setSummary(false);
154+
transit.setCar_fuel("GASOLINE");
155+
transit.setCar_hipass(false);
156+
144157
KakaoRouteTransitResponse response = kakaoMobilityClient.post()
145-
.uri(uriBuilder -> uriBuilder
146-
.path("/v1/waypoints/directions")
147-
.queryParam("origin", startX + "," + startY)
148-
.queryParam("destination", endX + "," + endY)
149-
.queryParam("waypoints", wayX + "," + wayY)
150-
.queryParam("priority", "TIME")
151-
.queryParam("summary", "false")
152-
.build()
153-
)
158+
.uri("/v1/waypoints/directions")
159+
.body(transit)
154160
.retrieve()
155-
.body(KakaoRouteTransitResponse.class);
161+
.body(KakaoRouteTransitResponse.class); //KakaoRouteTransitResponse로 카카오 자동차 api에서 주는 응답값
156162
return response;
157163
}
158164
}

0 commit comments

Comments
 (0)