Skip to content

Commit cad20c4

Browse files
committed
feat: kakaomap을 tmap과 비슷í하게 응답하게 준비중
1 parent d27cf5f commit cad20c4

7 files changed

Lines changed: 142 additions & 32 deletions

File tree

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

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

33
import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoLocalResponse;
4+
import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoMobilityResponse;
45
import com.back.web7_9_codecrete_be.domain.location.service.KakaoLocalService;
56
import com.back.web7_9_codecrete_be.global.rsData.RsData;
67
import io.swagger.v3.oas.annotations.Operation;
@@ -32,7 +33,7 @@ public class KakaoApiController {
3233
public List<KakaoLocalResponse.Document> KakaoRestaurants(
3334
@RequestParam double lat,
3435
@RequestParam double lon
35-
){
36+
) {
3637
return kakaoLocalService.searchNearbyRestaurants(lat, lon);
3738
}
3839

@@ -46,7 +47,7 @@ public List<KakaoLocalResponse.Document> KakaoRestaurants(
4647
public List<KakaoLocalResponse.Document> KakaoCafes(
4748
@RequestParam double lat,
4849
@RequestParam double lon
49-
){
50+
) {
5051
return kakaoLocalService.searchNearbyCafes(lat, lon);
5152
}
5253

@@ -68,4 +69,30 @@ public RsData<String> coord2Address(
6869
String addressName = kakaoLocalService.coordinateToAddressName(lat, lon);
6970
return RsData.success("좌표를 주소로 변환했습니다.", addressName);
7071
}
72+
73+
74+
@GetMapping("/navigate/guides")
75+
public List<KakaoMobilityResponse.Guide> navigateGuides(
76+
@RequestParam double startX,
77+
@RequestParam double startY,
78+
@RequestParam double endX,
79+
@RequestParam double endY
80+
) {
81+
KakaoMobilityResponse res = kakaoLocalService.NaviSearch(startX, startY, endX, endY);
82+
83+
if (res == null || res.getRoutes() == null || res.getRoutes().isEmpty()) {
84+
return List.of();
85+
}
86+
87+
KakaoMobilityResponse.Route route0 = res.getRoutes().get(0);
88+
if (route0.getSections() == null || route0.getSections().isEmpty()) {
89+
return List.of();
90+
}
91+
92+
return route0.getSections().stream()
93+
.filter(section -> section.getGuides() != null && !section.getGuides().isEmpty())
94+
.flatMap(section -> section.getGuides().stream())
95+
.toList();
96+
}
7197
}
98+
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.back.web7_9_codecrete_be.domain.location.dto.response;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
import java.util.List;
7+
@Getter
8+
@AllArgsConstructor
9+
public class KakaoMobilityResponse {
10+
11+
12+
private List<Route> routes;
13+
14+
@Getter
15+
public static class Route {
16+
private Summary summary;
17+
private List<Section> sections;
18+
}
19+
20+
@Getter
21+
public static class Summary {
22+
private int distance; // meters
23+
private int duration; // seconds
24+
}
25+
26+
@Getter
27+
public static class Section{
28+
private List<Road> roads;
29+
private List<Guide> guides;
30+
public List<Guide> getGuides() {
31+
return guides;
32+
}
33+
}
34+
35+
@Getter
36+
public static class Road{
37+
private List<Double> vertexes;
38+
}
39+
40+
41+
@Getter
42+
public static class Guide { // ✅ 추가
43+
private String name;
44+
private double x;
45+
private double y;
46+
private int distance;
47+
private int duration;
48+
private int type;
49+
private String guidance;
50+
private int road_index;
51+
}
52+
}

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

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

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;
5+
import com.back.web7_9_codecrete_be.domain.location.dto.response.KakaoMobilityResponse;
56
import com.back.web7_9_codecrete_be.global.error.code.LocationErrorCode;
67
import com.back.web7_9_codecrete_be.global.error.exception.BusinessException;
78
import lombok.RequiredArgsConstructor;
89
import org.springframework.stereotype.Service;
10+
import org.springframework.web.client.RestClient;
911
import org.springframework.web.reactive.function.client.WebClient;
1012

1113
import java.util.List;
@@ -14,28 +16,29 @@
1416
@RequiredArgsConstructor
1517
public class KakaoLocalService {
1618

17-
private final WebClient kakaoWebClient;
19+
private final RestClient kakaoRestClient;
20+
private final RestClient kakaoMobilityClient;
1821

1922
public List<KakaoLocalResponse.Document> searchNearbyRestaurants(double lat, double lng) {
2023

21-
return kakaoWebClient.get()
24+
return kakaoRestClient.get()
2225
.uri(uriBuilder -> uriBuilder
2326
.path("/v2/local/search/keyword.json")
2427
.queryParam("query", "음식점")
28+
.queryParam("category_group_code", "FD6")
2529
.queryParam("y", lat)
2630
.queryParam("x", lng)
2731
.queryParam("radius", 1000) // 반경 1km
2832
.queryParam("sort", "distance")
2933
.build()
3034
)
3135
.retrieve()
32-
.bodyToMono(KakaoLocalResponse.class)
33-
.block() // 동기 호출 (필요하면 비동기로 변경 가능)
36+
.body(KakaoLocalResponse.class)
3437
.getDocuments();
3538
}
3639
public List<KakaoLocalResponse.Document> searchNearbyCafes(double lat, double lng) {
3740

38-
return kakaoWebClient.get()
41+
return kakaoRestClient.get()
3942
.uri(uriBuilder -> uriBuilder
4043
.path("/v2/local/search/keyword.json")
4144
.queryParam("query", "카페")
@@ -47,23 +50,21 @@ public List<KakaoLocalResponse.Document> searchNearbyCafes(double lat, double ln
4750
.build()
4851
)
4952
.retrieve()
50-
.bodyToMono(KakaoLocalResponse.class)
51-
.block() // 동기 호출 (필요하면 비동기로 변경 가능)
53+
.body(KakaoLocalResponse.class)
5254
.getDocuments();
5355
}
5456

5557
public String coordinateToAddressName(double lat, double lng) {
5658

57-
KakaoCoordinateResponse response = kakaoWebClient.get()
59+
KakaoCoordinateResponse response = kakaoRestClient.get()
5860
.uri(uriBuilder -> uriBuilder
5961
.path("/v2/local/geo/coord2address.json")
6062
.queryParam("x", lng)
6163
.queryParam("y", lat)
6264
.build()
6365
)
6466
.retrieve()
65-
.bodyToMono(KakaoCoordinateResponse.class)
66-
.block();
67+
.body(KakaoCoordinateResponse.class);
6768

6869
if (response == null || response.getDocuments() == null || response.getDocuments().isEmpty()) {
6970
throw new BusinessException(LocationErrorCode.ADDRESS_NOT_FOUND);
@@ -85,4 +86,25 @@ public String coordinateToAddressName(double lat, double lng) {
8586
return addressName;
8687
}
8788

89+
public KakaoMobilityResponse NaviSearch(double startX, double startY, double endX, double endY) {
90+
91+
KakaoMobilityResponse response = kakaoMobilityClient.get()
92+
.uri(uriBuilder -> uriBuilder
93+
.path("/v1/directions")
94+
.queryParam("origin", startX + "," + startY)
95+
.queryParam("destination", endX + "," + endY)
96+
.queryParam("priority", "TIME")
97+
.queryParam("summary", "false")
98+
.build()
99+
)
100+
.retrieve()
101+
.body(KakaoMobilityResponse.class);
102+
103+
104+
if (response == null || response.getRoutes().isEmpty()) {
105+
throw new BusinessException(LocationErrorCode.ROUTE_NOT_FOUND);
106+
}
107+
108+
return response;
109+
}
88110
}

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

Lines changed: 0 additions & 7 deletions
This file was deleted.

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

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,33 @@
22

33
import com.back.web7_9_codecrete_be.domain.location.dto.response.TmapResponse;
44
import lombok.RequiredArgsConstructor;
5+
import org.springframework.beans.factory.annotation.Qualifier;
6+
import org.springframework.http.MediaType;
57
import org.springframework.stereotype.Service;
8+
import org.springframework.web.client.RestClient;
69
import org.springframework.web.reactive.function.client.WebClient;
710

811
@Service
912
@RequiredArgsConstructor
1013
public class TmapService {
1114

12-
private final WebClient TmapClient;
15+
private final RestClient TmapRestClient;
1316

1417
public String getRoute(double startX, double startY, double endX, double endY) {
1518

16-
TmapResponse request = new TmapResponse();
17-
request.setStartX(String.valueOf(startX));
18-
request.setStartY(String.valueOf(startY));
19-
request.setEndX(String.valueOf(endX));
20-
request.setEndY(String.valueOf(endY));
21-
request.setFormat("json");
22-
request.setCount(5);
19+
TmapResponse req = new TmapResponse();
20+
req.setStartX(String.valueOf(startX));
21+
req.setStartY(String.valueOf(startY));
22+
req.setEndX(String.valueOf(endX));
23+
req.setEndY(String.valueOf(endY));
24+
req.setCount(5);
25+
req.setFormat("json");
2326

24-
return TmapClient.post()
27+
return TmapRestClient.post()
2528
.uri("/transit/routes")
26-
.bodyValue(request)
29+
.contentType(MediaType.APPLICATION_JSON)
30+
.body(req)
2731
.retrieve()
28-
.bodyToMono(String.class)
29-
.block();
32+
.body(String.class);
3033
}
3134
}

src/main/java/com/back/web7_9_codecrete_be/global/config/WebClientConfig.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public class WebClientConfig {
3636

3737
@Value("${tmap.base-url}")
3838
private String tmapBaseUrl;
39+
40+
@Value("https://apis-navi.kakaomobility.com")
41+
private String kakaoMobilityUrl;
42+
3943
@Bean
4044
public WebClient mailgunClient() {
4145
String auth = "api:" + mailgunApiKey;
@@ -73,6 +77,14 @@ public RestClient kakaoRestClient(){
7377

7478
}
7579

80+
@Bean
81+
public RestClient kakaoMobilityClient(){
82+
return RestClient.builder()
83+
.baseUrl(kakaoMobilityUrl)
84+
.defaultHeader("Authorization", kakaomapApiKey)
85+
.build();
86+
87+
}
7688

7789
@Bean
7890
public RestClient TmapRestClient(){

src/main/java/com/back/web7_9_codecrete_be/global/error/code/LocationErrorCode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ public enum LocationErrorCode implements ErrorCode{
1313
LOCATION_ALREADY_EXISTS(HttpStatus.NOT_FOUND, "L-102", "이미 저장되어있는 위치입니다."),
1414
INVALID_KOREA_COORDINATE(HttpStatus.NOT_FOUND, "L-103" , "한국 좌표가 아닙니다"),
1515
LOCATION_NOT_EXIST_IN_KAKAO(HttpStatus.NOT_FOUND, "L-104", "해당 좌표는 카카오에 등록되어있지 않습니다."),
16-
LOCATION_NOT_HAVE(HttpStatus.NOT_FOUND, "L-105", "저장되어있는 좌표가 없어서 삭제가 불가능합니다.");
16+
LOCATION_NOT_HAVE(HttpStatus.NOT_FOUND, "L-105", "저장되어있는 좌표가 없어서 삭제가 불가능합니다."),
17+
ROUTE_NOT_FOUND(HttpStatus.NOT_FOUND, "L-106", "추천 경로가 존재하지 않습니다");
1718

1819
private final HttpStatus status;
1920
private final String code;

0 commit comments

Comments
 (0)