diff --git a/build.gradle.kts b/build.gradle.kts index 17957819..57642f05 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,5 @@ +import org.gradle.kotlin.dsl.implementation + plugins { java id("org.springframework.boot") version "3.5.8" diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/KakaoTestController.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/KakaoTestController.java new file mode 100644 index 00000000..aefab7d9 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/KakaoTestController.java @@ -0,0 +1,28 @@ +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.service.KakaoLocalService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/test") +@RequiredArgsConstructor +public class KakaoTestController { + + private final KakaoLocalService kakaoLocalService; + + @GetMapping("/kakao-restaurants") + public List testKakaoRestaurants() { + + // ✅ 테스트용 하드코딩 좌표 (서울 시청 근처) + double lat = 37.5665; + double lng = 126.9780; + + return kakaoLocalService.searchNearbyRestaurants(lat, lng); + } +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/TmapController.java b/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/TmapController.java new file mode 100644 index 00000000..46551541 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/controller/TmapController.java @@ -0,0 +1,26 @@ +package com.back.web7_9_codecrete_be.domain.location.controller; + +import com.back.web7_9_codecrete_be.domain.location.service.TmapService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/tmap") +public class TmapController { + + private final TmapService tmapService; + + @GetMapping("/transit") + public String getTransit( + @RequestParam double startX, + @RequestParam double startY, + @RequestParam double endX, + @RequestParam double endY + ) { + return tmapService.getRoute(startX, startY, endX, endY); + } +} \ No newline at end of file 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/KakaoLocalResponse.java new file mode 100644 index 00000000..c66f8318 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/KakaoLocalResponse.java @@ -0,0 +1,20 @@ +package com.back.web7_9_codecrete_be.domain.location.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class KakaoLocalResponse { + private List documents; + + @Data + public static class Document { + private String place_name; + private String x; // longitude + private String y; // latitude + private String road_address_name; + private String address_name; + private String place_url; + } +} \ No newline at end of file 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/TmapResponse.java new file mode 100644 index 00000000..2e248d8a --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/TmapResponse.java @@ -0,0 +1,15 @@ +package com.back.web7_9_codecrete_be.domain.location.dto; + +import lombok.Data; + +@Data +public class TmapResponse { + + private String startX; + private String startY; + private String endX; + private String endY; + private int count; //최대 응답 결과 개수 + private String format; //출력포멧 : jsom, xml + +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/dummy.txt b/src/main/java/com/back/web7_9_codecrete_be/domain/location/dto/dummy.txt deleted file mode 100644 index e69de29b..00000000 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 new file mode 100644 index 00000000..e6ff9ffb --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/KakaoLocalService.java @@ -0,0 +1,32 @@ +package com.back.web7_9_codecrete_be.domain.location.service; + +import com.back.web7_9_codecrete_be.domain.location.dto.KakaoLocalResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class KakaoLocalService { + + private final WebClient kakaoWebClient; + + public List searchNearbyRestaurants(double lat, double lng) { + + return kakaoWebClient.get() + .uri(uriBuilder -> uriBuilder + .path("/v2/local/search/keyword.json") + .queryParam("query", "음식점") + .queryParam("y", lat) + .queryParam("x", lng) + .queryParam("radius", 1000) // 반경 1km + .build() + ) + .retrieve() + .bodyToMono(KakaoLocalResponse.class) + .block() // 동기 호출 (필요하면 비동기로 변경 가능) + .getDocuments(); + } +} \ No newline at end of file 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 new file mode 100644 index 00000000..055166d3 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/location/service/TmapService.java @@ -0,0 +1,32 @@ +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 org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; + +@Service +@RequiredArgsConstructor +public class TmapService { + + private final WebClient TmapClient; + + 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); + + return TmapClient.post() + .uri("/transit/routes") + .bodyValue(request) + .retrieve() + .bodyToMono(String.class) + .block(); + } +} 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 24efa859..6e64f813 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 @@ -21,6 +21,12 @@ public class WebClientConfig { @Value("${mailgun.domain}") private String mailgunDomain; + @Value("${tmap.api-key}") + private String tmapApiKey; + + @Value("${kakao.restapi-key}") + private String kakaomapApiKey; + @Bean public WebClient mailgunClient() { String auth = "api:" + mailgunApiKey; @@ -39,4 +45,21 @@ public WebClient mailgunClient() { public RestTemplate restTemplate() { return new RestTemplate(); } + + @Bean + public WebClient kakaoWebClient() { + return WebClient.builder() + .baseUrl("https://dapi.kakao.com") + .defaultHeader("Authorization", kakaomapApiKey) + .build(); + } + + + @Bean + public WebClient TmapClient(){ + return WebClient.builder() + .baseUrl("https://apis.openapi.sk.com") + .defaultHeader("appKey", tmapApiKey) + .build(); + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a582f7f4..9bfca2fd 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -38,5 +38,10 @@ jwt: access-token-expiration: 3600 # 1시간 refresh-token-expiration: 1209600 # 14일 +tmap: #Tmap 대중교통 추천 api 키 + api-key: ${TMAP_API_KEY} + +kakao: #Kakao map REST API 키 + restapi-key: ${KAKAOMAP_API_KEY} kopis: - api-key: ${KOPIST_API_KEY} \ No newline at end of file + api-key: ${KOPIST_API_KEY} diff --git a/src/test/java/com/back/web7_9_codecrete_be/domain/location/service/dummy.txt b/src/test/java/com/back/web7_9_codecrete_be/domain/location/service/dummy.txt deleted file mode 100644 index bbe54a13..00000000 --- a/src/test/java/com/back/web7_9_codecrete_be/domain/location/service/dummy.txt +++ /dev/null @@ -1,5 +0,0 @@ -controller -dto -entity -repository -service \ No newline at end of file