Skip to content

Commit cac7012

Browse files
Merge pull request #50 from prgrms-web-devcourse-final-project/feat/#34
[Location] kakaomap api, tmap api 연동 및 구현 및 환경변수 추가
2 parents 7b6af6c + e31d5b8 commit cac7012

11 files changed

Lines changed: 184 additions & 6 deletions

File tree

build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import org.gradle.kotlin.dsl.implementation
2+
13
plugins {
24
java
35
id("org.springframework.boot") version "3.5.8"
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.back.web7_9_codecrete_be.domain.location.controller;
2+
3+
import com.back.web7_9_codecrete_be.domain.location.dto.KakaoLocalResponse;
4+
import com.back.web7_9_codecrete_be.domain.location.service.KakaoLocalService;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.web.bind.annotation.GetMapping;
7+
import org.springframework.web.bind.annotation.RequestMapping;
8+
import org.springframework.web.bind.annotation.RestController;
9+
10+
import java.util.List;
11+
12+
@RestController
13+
@RequestMapping("/api/test")
14+
@RequiredArgsConstructor
15+
public class KakaoTestController {
16+
17+
private final KakaoLocalService kakaoLocalService;
18+
19+
@GetMapping("/kakao-restaurants")
20+
public List<KakaoLocalResponse.Document> testKakaoRestaurants() {
21+
22+
// ✅ 테스트용 하드코딩 좌표 (서울 시청 근처)
23+
double lat = 37.5665;
24+
double lng = 126.9780;
25+
26+
return kakaoLocalService.searchNearbyRestaurants(lat, lng);
27+
}
28+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.back.web7_9_codecrete_be.domain.location.controller;
2+
3+
import com.back.web7_9_codecrete_be.domain.location.service.TmapService;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.web.bind.annotation.GetMapping;
6+
import org.springframework.web.bind.annotation.RequestMapping;
7+
import org.springframework.web.bind.annotation.RequestParam;
8+
import org.springframework.web.bind.annotation.RestController;
9+
10+
@RestController
11+
@RequiredArgsConstructor
12+
@RequestMapping("/api/tmap")
13+
public class TmapController {
14+
15+
private final TmapService tmapService;
16+
17+
@GetMapping("/transit")
18+
public String getTransit(
19+
@RequestParam double startX,
20+
@RequestParam double startY,
21+
@RequestParam double endX,
22+
@RequestParam double endY
23+
) {
24+
return tmapService.getRoute(startX, startY, endX, endY);
25+
}
26+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.back.web7_9_codecrete_be.domain.location.dto;
2+
3+
import lombok.Data;
4+
5+
import java.util.List;
6+
7+
@Data
8+
public class KakaoLocalResponse {
9+
private List<Document> documents;
10+
11+
@Data
12+
public static class Document {
13+
private String place_name;
14+
private String x; // longitude
15+
private String y; // latitude
16+
private String road_address_name;
17+
private String address_name;
18+
private String place_url;
19+
}
20+
}
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.Data;
4+
5+
@Data
6+
public class TmapResponse {
7+
8+
private String startX;
9+
private String startY;
10+
private String endX;
11+
private String endY;
12+
private int count; //최대 응답 결과 개수
13+
private String format; //출력포멧 : jsom, xml
14+
15+
}

src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/dummy.txt

Whitespace-only changes.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.back.web7_9_codecrete_be.domain.location.service;
2+
3+
import com.back.web7_9_codecrete_be.domain.location.dto.KakaoLocalResponse;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.stereotype.Service;
6+
import org.springframework.web.reactive.function.client.WebClient;
7+
8+
import java.util.List;
9+
10+
@Service
11+
@RequiredArgsConstructor
12+
public class KakaoLocalService {
13+
14+
private final WebClient kakaoWebClient;
15+
16+
public List<KakaoLocalResponse.Document> searchNearbyRestaurants(double lat, double lng) {
17+
18+
return kakaoWebClient.get()
19+
.uri(uriBuilder -> uriBuilder
20+
.path("/v2/local/search/keyword.json")
21+
.queryParam("query", "음식점")
22+
.queryParam("y", lat)
23+
.queryParam("x", lng)
24+
.queryParam("radius", 1000) // 반경 1km
25+
.build()
26+
)
27+
.retrieve()
28+
.bodyToMono(KakaoLocalResponse.class)
29+
.block() // 동기 호출 (필요하면 비동기로 변경 가능)
30+
.getDocuments();
31+
}
32+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.back.web7_9_codecrete_be.domain.location.service;
2+
3+
import com.back.web7_9_codecrete_be.domain.location.dto.KakaoLocalResponse;
4+
import com.back.web7_9_codecrete_be.domain.location.dto.TmapResponse;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Service;
7+
import org.springframework.web.reactive.function.client.WebClient;
8+
9+
@Service
10+
@RequiredArgsConstructor
11+
public class TmapService {
12+
13+
private final WebClient TmapClient;
14+
15+
public String getRoute(double startX, double startY, double endX, double endY) {
16+
17+
TmapResponse request = new TmapResponse();
18+
request.setStartX(String.valueOf(startX));
19+
request.setStartY(String.valueOf(startY));
20+
request.setEndX(String.valueOf(endX));
21+
request.setEndY(String.valueOf(endY));
22+
request.setFormat("json");
23+
request.setCount(5);
24+
25+
return TmapClient.post()
26+
.uri("/transit/routes")
27+
.bodyValue(request)
28+
.retrieve()
29+
.bodyToMono(String.class)
30+
.block();
31+
}
32+
}

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ public class WebClientConfig {
2121
@Value("${mailgun.domain}")
2222
private String mailgunDomain;
2323

24+
@Value("${tmap.api-key}")
25+
private String tmapApiKey;
26+
27+
@Value("${kakao.restapi-key}")
28+
private String kakaomapApiKey;
29+
2430
@Bean
2531
public WebClient mailgunClient() {
2632
String auth = "api:" + mailgunApiKey;
@@ -39,4 +45,21 @@ public WebClient mailgunClient() {
3945
public RestTemplate restTemplate() {
4046
return new RestTemplate();
4147
}
48+
49+
@Bean
50+
public WebClient kakaoWebClient() {
51+
return WebClient.builder()
52+
.baseUrl("https://dapi.kakao.com")
53+
.defaultHeader("Authorization", kakaomapApiKey)
54+
.build();
55+
}
56+
57+
58+
@Bean
59+
public WebClient TmapClient(){
60+
return WebClient.builder()
61+
.baseUrl("https://apis.openapi.sk.com")
62+
.defaultHeader("appKey", tmapApiKey)
63+
.build();
64+
}
4265
}

src/main/resources/application.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,10 @@ jwt:
3838
access-token-expiration: 3600 # 1시간
3939
refresh-token-expiration: 1209600 # 14일
4040

41+
tmap: #Tmap 대중교통 추천 api 키
42+
api-key: ${TMAP_API_KEY}
43+
44+
kakao: #Kakao map REST API 키
45+
restapi-key: ${KAKAOMAP_API_KEY}
4146
kopis:
42-
api-key: ${KOPIST_API_KEY}
47+
api-key: ${KOPIST_API_KEY}

0 commit comments

Comments
 (0)