상황
프로젝트 진행 중 출발지(A)와 도착지(B)의 좌표값을 기반으로 대중교통을 이용할 때 어느정도의 시간이 소요되는지를 알아야 했다. 그 과정에서 Google Maps API와 Odsay가 후보군으로 추려졌다.
각 vendor의 대중교통 길찾기 API는 어떤 장단점을 가지고 있을까?
직접 코드를 쳐보며 장단점을 느껴보자
[SPEC 비교]
- 요약
vendor | Google Maps API | Odsay |
특징 | - 월간 200달러 한도 무료(초과시 자동 과금) - 1000건에 5달러 => 일간 1333건까지 무료 |
- 일 1000건 - 6개월 간 무료 |
[ Odsay]
=> 일 1000건에 한해 6개월간 무료 이용 가능하다
[Google Maps]
구글은 제공하는 API 기능에 따라 가격이 다르다
매월 200달러까지 무료 사용가능하고 초과시 초과금액에 대해 자동과금된다.
- 내가 사용하려는 기능은 Route - Compute Routes Api였다
- 1000건에 5달러로 계산되고 있다
이제 직접 코드를 쳐보며 각 플랫폼의 장단점을 비교해보자
restTemplate을 사용해 더럽지만 실험용으로 적당한 코드를 쳐볼 것이다.
세팅 과정은 밑의 과정을 따랐다
[vendor test용 세팅]
- restTemplate bean 등록
@Configuration
public class SpringConfig {
@Bean
SimpleClientHttpRequestFactory requestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
return factory;
}
@Bean
RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder
.requestFactory(this::requestFactory)
.build();
}
}
[Google API]
먼저 간단한 RouteClient를 만들어보자
@Service
public class RouteClient {
private static final String url = "https://maps.googleapis.com/maps/api/directions/json\n"
+ " ?destination=Queens\n"
+ " &origin=Brooklyn\n"
+ " &key={발급받은 API KEY}\n";
private static String duration;
private static String end_address;
private static String start_address;
private final RestTemplate restTemplate;
public RouteClient(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String findPath() {
System.out.println(url);
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
return response.getBody();
}
RouteClient의 findPath는 지정한 url을 googleapi로 발송하고 그로부터 얻은 응답을 String 형태로 변환하여 답을 얻어오고 있다. 여기서 내가 test용으로 호출해본 api는 브루클린에서 퀸즈로의 경로를 호출하는 url이다.
이제 Main 클래스에서 다음 호출의 응답 결과를 출력해보자
public class Main {
private static RouteClient routeClient = new RouteClient(
new RestTemplate(new HttpComponentsClientHttpRequestFactory()));
public static void main(String[] args) throws IOException, InterruptedException, ApiException {
System.out.println(routeClient.findPath());
}
}
결과로 나온 긴 String을 바라보자
=> 결과
{
"geocoded_waypoints" :
[
{
"geocoder_status" : "OK",
"place_id" : "ChIJCSF8lBZEwokRhngABHRcdoI",
"types" :
[
"political",
"sublocality",
"sublocality_level_1"
]
},
{
"geocoder_status" : "OK",
"place_id" : "ChIJK1kKR2lDwokRBXtcbIvRCUE",
"types" :
[
"political",
"sublocality",
"sublocality_level_1"
]
}
],
"routes" :
[
{
"bounds" :
{
"northeast" :
{
"lat" : 40.7293779,
"lng" : -73.79023409999999
},
"southwest" :
{
"lat" : 40.6755784,
"lng" : -73.9441775
}
},
"copyrights" : "Map data ©2024 Google",
"legs" :
[
{
"distance" :
{
"text" : "10.5 mi",
"value" : 16824
},
"duration" :
{
"text" : "29 mins",
"value" : 1759
},
"end_address" : "Queens, NY, USA",
"end_location" :
{
"lat" : 40.72822439999999,
"lng" : -73.79484719999999
},
"start_address" : "Brooklyn, NY, USA",
"start_location" :
{
"lat" : 40.678183,
"lng" : -73.94416129999999
},
"steps" :
[
{
"distance" :
{
"text" : "2.5 mi",
"value" : 4016
},
"duration" :
{
"text" : "12 mins",
"value" : 735
},
"end_location" :
{
"lat" : 40.6756717,
"lng" : -73.89684
},
"html_instructions" : "Head \u003cb\u003esouth\u003c/b\u003e on \u003cb\u003eAtlantic Ave\u003c/b\u003e toward \u003cb\u003eAtlantic Ave\u003c/b\u003e\u003cdiv style=\"font-size:0.9em\"\u003ePass by Popeyes Louisiana Kitchen (on the right in 1.2 mi)\u003c/div\u003e",
"polyline" :
{
"points" : "s}gwF~eibMRB@g@@g@HsD@k@BiAB_ADsBLgG@s@BiADuA@i@@a@LsF?_@NwGBsAPsHF_DBk@?g@H_D?QDcBDgBBuABc@@Q?K@UBwA?C@o@@AH{DDiCBkA@YRiK@w@HaC@K@}@PoHBoA@c@Bs@BwA@i@Bm@BsABkDFoD@a@BcABwAH{D@o@Bo@BaBHoDHyDJuD@KD_D@_@@e@BoA@U?YJuDHyD?ABuB@a@?a@?Y?e@?G@g@?G@[?EB{@FiD?A@G?I?[?G@A?I@m@@g@@w@DmB@YBk@Bi@@_@@SF}@B_@@GB]?G?CDe@?C@IBc@?CDk@BWBc@@IDk@Ds@Bg@@a@Bk@?]?G?O?o@@aAA}AAsA?EA_A?]As@?UCcB?CBGAQ?IIkD"
},
"start_location" :
{
"lat" : 40.678183,
"lng" : -73.94416129999999
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "0.2 mi",
"value" : 262
},
"duration" :
{
"text" : "2 mins",
"value" : 99
},
"end_location" :
{
"lat" : 40.6779881,
"lng" : -73.8974369
},
"html_instructions" : "Turn \u003cb\u003eleft\u003c/b\u003e onto \u003cb\u003ePennsylvania Ave\u003c/b\u003e\u003cdiv style=\"font-size:0.9em\"\u003ePass by McDonald's (on the left)\u003c/div\u003e",
"maneuver" : "turn-left",
"polyline" :
{
"points" : "}mgwFf~_bMYDSDMBw@J}AXe@Fg@HSDw@LGB[DIBa@FSD"
},
"start_location" :
{
"lat" : 40.6756717,
"lng" : -73.89684
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "4.8 mi",
"value" : 7780
},
"duration" :
{
"text" : "8 mins",
"value" : 459
},
"end_location" :
{
"lat" : 40.7150287,
"lng" : -73.8286384
},
"html_instructions" : "Continue straight onto \u003cb\u003eInterborough Pkwy\u003c/b\u003e/\u003cwbr/\u003e\u003cb\u003eJackie Robinson Pkwy\u003c/b\u003e\u003cdiv style=\"font-size:0.9em\"\u003eContinue to follow Jackie Robinson Pkwy\u003c/div\u003e",
"maneuver" : "straight",
"polyline" :
{
"points" : "m|gwF~a`bMa@?Q?K?QAE?KAIAi@KUGSGCAQGSGCCmAc@WIo@SMEUGUEQEC?YGQAi@Eq@EOAU?[AI?[CU?AA_@?KAEAWCIAKAQEQCUGCASGSGSKSIQKAAQKQKAAQKQOQKSOSOQMQMe@]QOQOa@]QOQOSQQOOOOOSQ_@a@SQq@s@o@s@SSIIEGGGIGCEMKQQ_@]QQSOQOSOQOQOA?c@]QMGEu@k@s@i@s@i@g@_@g@a@MIc@]aAs@WUMKQKEEw@k@]YWSQMSQMMQSMQEGIMCGIMEKEIEMA?CIEMEK?CIUG_@GWCUG_@Gg@SiBAIWqB?ACYEYE]AECSE[Kw@CSAEGi@CME[EYEYEYM}@OeAYcBG]E[Kg@G_@?ESiAO{@G[CQEWESAGAMEUEq@C[AWAQ?KGoA?AI}AIsAIgBGeAA_@ASC_@AYAM?A?MAUAMAE?AAGAGAGEKCMEIEGCGGIIKCAIIEEEACCCAEACAEAEAEAEAQAK?IAC?GAG?EAGACACAA?CACAA?AAECEACCECGGCEEECECCCGAEA?ACACAEAECE?CGOI[CIAECKCIEMEMCGACCEAECECECECEEEACEGEEGECEA?EECCECECECCACCEASIECGAAAEAKEECAAGCCACCIECC?ACAEEEGCCCCIMEGACEGAAGGIMEEKMEEEEGGCCGGGGKIGIGGKKECKKGGIIIIYYKKIIKKEGCCGGKOIMEECGIMO]EICKAEACAAAGCKCG?AEQAGAICKAGAKAIAICWAMCWCQAKCWC]Ec@CO?GE]CYGq@K_AC[E]EWGYGWCICKCIK[Qc@GKGOMWU_@MSQSGGIIKIIKMIMKKGIGKEMGWKEAMESGIA]I]EYGWE_BWIAQESCUGOEIEUISIWMSMQO[UMMOOIKOQOSMSKQMWMUIUGOKYEMIWGYIWESMm@G]CSEYEWAICUAUC[I_AAYA]AMAOA]?YA]?a@?Q@]?]@c@?I@]@[Ds@Di@?IFi@B[DYLsABQ@I?EBWD[BY@O?KB]?W@W?C?_@AK?QA]A[E]CYCU?AG]E[GYGUI[K[GUCGO_@IWQg@M]K[K[M_@AE?ACICKI]GWGWAKCKAECOE]C]CME_@E_@E]AG?GIm@E_@COAICQCOCMGYGUAGKa@EKAGEK_@kAQ[Q_@IM[k@EIY_@?AQW[_@CEKMKKIIIIOMGGa@[e@[WOOMQKcAq@_@Y[WCCOOOQSUCEIKKQMSIOO[IOOa@KWEOGOGUEOAGCKCICMCOAGCKAIG_@AMCMGy@A]AYAc@?Y?U?_@Ai@?gA?M?YAS?}AAU?C?_@?]?G?SA[A[?Q?MEuAEs@AU?C?CC]CYAS?AAEC]?GCQCYI{@Ec@Im@E]GUG[G[IWIWCIEOEMOa@KUKSKWMYCEIQKWKWGIQc@Ui@M[MYCGEMKWIWIYEMEMGUI[GYEMKe@Qy@UaAQw@I]IYIWIUIQQ]g@}@AAOUMSOSACKQOSCC[e@OU]m@IOMUIOKUCEAAKUKUKWUe@O_@KUCGIQKUKWMYEI_@{@i@kAEKGOKSKQ?AGMMWKWO]GOKWKUMWKWKWGOGMIOKYMYEMQ_@AEGQIYGQ?CAC?AEY?AAA?A?CCGAK?CACAKAA?A?A?AAC?AMm@i@eDCG?EEQESG[M]g@_B"
},
"start_location" :
{
"lat" : 40.6779881,
"lng" : -73.8974369
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "0.5 mi",
"value" : 790
},
"duration" :
{
"text" : "1 min",
"value" : 44
응답값을 보며 몇가지 특징을 얻을 수 있었다.
- travleMode를 통해 어떻게 이동할 것인지 지정가능하다 => ex) transit이면 대중교통 경로만 검색
- route 각 구간 정보를 객체를 통해 얻을 수 있음
- depth가 깊지 않고 상당히 직관적이다
결과값을 잘 해석할 수 있는데 그중 legs에 경로 탐색 요약정보가 녹아있다.
브루클린에서 시작해서 queens로 가는 데에는 약 29분 정도가 걸린다.
google maps의 장점은 여기서 끝이 아니다.
찾아보니 google은 api 관련 객체를 library를 통해 제공하고 있었다
- build.gradle : 의존성 추가
dependencies {
implementation 'com.google.maps:google-maps-services:2.2.0'
}
그럼 다음과 같이 길찾기 로직을 작성가능하다
public void findPath2() throws IOException, InterruptedException, ApiException {
LatLng originLatLng = new LatLng(37.504794, 127.049675); //선릉역
LatLng destinationLatLng = new LatLng(37.476891, 126.963860); // 낙성대역
DirectionsResult result = DirectionsApi.newRequest(context())
.origin(originLatLng)
.destination(destinationLatLng)
.mode(TravelMode.TRANSIT)
.await();
}
그냥 보면 오! Dto 객체 제공해주고 메서드 체이닝으로 요청 로직 잘 처리해주네! 에서 그칠 수 있지만
이게 강력한 이유는 코드를 작성하며 요청 커스터마이징이 용이하고, intellij에서 어떤 enumtype이 있는지 확인이 가능하기 때문이다. 예를 들어 TravleMode를 확인하는 상황을 보면
다음과 같이 걷는 상황(WALKING), 대중교통을 이용하는 상황(TRANSIT), 자전거 혹은 차를 이용할 때의 경로 탐색 모드를 구글에서 옵션으로 주고 있음을 알 수 있었다.
또,DirectionResult라는 응답 Dto를 통해 원하는 응답값을 받아오기 쉬웠다.
우리가 duration, start_address, end_address만 필요하다고 가정해보자
그럼 다음과 같이 DirectionResult 응답 객체 내에서 필요한 정보를 탐색 가능하다
duration = result.routes[0].legs[0].duration.humanReadable;
start_address = result.routes[0].legs[0].startAddress;
end_address = result.routes[0].legs[0].endAddress;
그렇게 간단히 필요한 정보만을 출력하는 findPath2 로직을 막무가내로 써보았다
public void findPath2() throws IOException, InterruptedException, ApiException {
LatLng originLatLng = new LatLng(37.504794, 127.049675); //선릉역
LatLng destinationLatLng = new LatLng(37.476891, 126.963860); // 낙성대역
DirectionsResult result = DirectionsApi.newRequest(context())
.origin(originLatLng)
.destination(destinationLatLng)
.mode(TravelMode.TRANSIT)
.await();
duration = result.routes[0].legs[0].duration.humanReadable;
start_address = result.routes[0].legs[0].startAddress;
end_address = result.routes[0].legs[0].endAddress;
System.out.println("duration = " + duration);
System.out.println("start_address = " + start_address);
System.out.println("end_address = " + end_address);
}
이번에는 실험으로 선릉역에서 출발해서 낙성대역까지 대중교통을 이용하는 경로를 출력해보았다
약 17분정도 걸리며 출발, 도착 위치도 잘 출력되는 것을 볼 수 있다.
[Google Maps의 장점]
1. OOP를 지키며 프로그래밍이 가능하다
개인적으로 이 부분이 Google Maps API의 큰 강점이라 생각하는데, 라이브러리에서 관련 객체를 모두 제공해주므로 사소한 기능을 모두 개발하지 않아도 된다. 라이브러리에서 제공하는 객체를 기반으로 어느정도 메시지 중심의 프로그래밍이 가능하다
2. 출발시간/도착시간 설정이 가능하다
옵션 중에 departureTime 설정이 가능했다. 즉, 출발시간 설정을 통해 미래 특정 시간의 대중 교통 상황을 고려해 시간 계산이 가능했다.
[Google Maps의 단점]
여기까지 보면 구글 maps api가 굉장히 매력적이다.
그러나, 직접 코드를 치며 몇가지 아쉬운 점이 있었다.
1. reference가 불친절하고 산재되어 있다
우선 라이브러리에서 제공하는 객체를 어떻게 사용해야하는지 정리한 문서가 없다
나 또한 stackOverflow를 뒤지며 findPath2 메서드를 작성하는데 약 3시간이 걸렸다
레퍼런스가 불친절하고 찾기가 매우매우 힘들었다
2. 에러 핸들링이 힘들다
같은 맥락에서 에러가 발생해도, 왜 에러가 발생하는지 모르는 경우가 많았고 내가 작성한 코드가 아닌 라이브러리에 의존하다보니 내부 코드의 어떤 부분에서 에러가 발생하는지 몰랐다
가령 앞서 선릉 -> 낙성대 길찾기 모드를 WALKING으로 바꾸고 다시 findPath2를 호출해보자
ZeroResultException이라는 에러가 발생한다.
걸어서 갈 수 있는 경로를 찾지 못했다는 것인데 왜 그런지 발견하지 못했다
3. 국내 경로에 대한 정확도가 높지 않다.
비슷하게 google maps 국내 경로 탐색에 대한 정확도가 의심되는 정황이 많았다.
예를 들어 광화문역에서 강남역으로의 경로를 확인했는데 탐색된 경로가 건물과 길을 뚫고 광화문역으로 안내했다는 경험을 후술한 블로그글도 존재했다.
Odsay
다음으로 오디세이이다.
RouteCientV2 를 만들어보자
@Service
public class RouteClientV2 {
private static final String key = "{발급받은 API KEY}";
private final RestTemplate restTemplate;
public RouteClientV2(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public void findPath() throws IOException {
// ODsay Api Key 정보
String urlInfo = "https://api.odsay.com/v1/api/searchPubTransPathT"
+"?SY=37.513841" //잠실역
+"&SX=127.101823"
+"&EY=37.476813" // 낙성대역
+"&EX=126.964156"
+"&apiKey="
+ URLEncoder.encode(key, "UTF-8");
ResponseEntity<String> entity = restTemplate.getForEntity(urlInfo, String.class);
System.out.println(entity.getBody());
}
}
이번에는 잠실역에서 출발해 낙성대역까지 도달하는 경로를 호출해보았다
main에서 호출한 결과는 다음과 같다
{"result":{"searchType":0,"outTrafficCheck":0,"busCount":3,"subwayCount":1,"subwayBusCount":0,"pointDistance":12849,"startRadius":700,"endRadius":700,"path":[{"pathType":1,"info":{"trafficDistance":13600.0,"totalWalk":228,"totalTime":25,"payment":1500,"busTransitCount":0,"subwayTransitCount":1,"mapObj":"2:2:216:227","firstStartStation":"잠실","lastEndStation":"낙성대","totalStationCount":11,"busStationCount":0,"subwayStationCount":11,"totalDistance":13828.0,"totalWalkTime":-1,"checkIntervalTime":100,"checkIntervalTimeOverYn":"N","totalIntervalTime":5},"subPath":[{"trafficType":3,"distance":156,"sectionTime":2},{"trafficType":1,"distance":13600,"sectionTime":22,"stationCount":11,"lane":[{"name":"수도권 2호선","subwayCode":2,"subwayCityCode":1000}],"intervalTime":5,"startName":"잠실","startX":127.100164,"startY":37.513346,"endName":"낙성대","endX":126.963421,"endY":37.477113,"way":"낙성대","wayCode":2,"door":"null","startID":216,"endID":227,"startExitNo":"8","startExitX":127.10123963129443,"startExitY":37.5138286885815,"endExitNo":"2","endExitX":126.9638451931944,"endExitY":37.476815989674506,"passStopList":{"stations":[{"index":0,"stationID":216,"stationName":"잠실","x":"127.100171","y":"37.51335"},{"index":1,"stationID":217,"stationName":"잠실새내","x":"127.086893","y":"37.511574"},{"index":2,"stationID":218,"stationName":"종합운동장","x":"127.073674","y":"37.511037"},{"index":3,"stationID":219,"stationName":"삼성","x":"127.063186","y":"37.508872"},{"index":4,"stationID":220,"stationName":"선릉","x":"127.049281","y":"37.504585"},{"index":5,"stationID":221,"stationName":"역삼","x":"127.036377","y":"37.500643"},{"index":6,"stationID":222,"stationName":"강남","x":"127.027619","y":"37.497952"},{"index":7,"stationID":223,"stationName":"교대","x":"127.014395","y":"37.493902"},{"index":8,"stationID":224,"stationName":"서초","x":"127.007702","y":"37.491852"},{"index":9,"stationID":225,"stationName":"방배","x":"126.997667","y":"37.481496"},{"index":10,"stationID":226,"stationName":"사당","x":"126.981363","y":"37.476575"},{"index":11,"stationID":227,"stationName":"낙성대","x":"126.963428","y":"37.477119"}]}},{"trafficType":3,"distance":72,"sectionTime":1}]},{"pathType":2,"info":{"trafficDistance":14623.0,"totalWalk":295,"totalTime":59,"payment":1600,"busTransitCount":2,"subwayTransitCount":0,"mapObj":"1435:1:21:37@1187:1:53:68","firstStartStation":"잠실역8번출구","lastEndStation":"서울미술고.인헌중고","totalStationCount":31,"busStationCount":31,"subwayStationCount":0,"totalDistance":14918.0,"totalWalkTime":-1,"checkIntervalTime":100,"checkIntervalTimeOverYn":"N","totalIntervalTime":18},"subPath":[{"trafficType":3,"distance":39,"sectionTime":1},{"trafficType":2,"distance":8037,"sectionTime":29,"stationCount":16,"lane":[{"busNo":"341","type":11,"busID":1435,"busLocalBlID":"100100056","busCityCode":1000,"busProviderCode":4}],"intervalTime":12,"startName":"잠실역8번출구","startX":127.10139,"startY":37.513914,"endName":"뱅뱅사거리","endX":127.032421,"endY":37.487708,"startID":163083,"startStationCityCode":1000,"startStationProviderCode":4,"startLocalStationID":"123000043","startArsID":"24-132","endID":106382,"endStationCityCode":1000,"endStationProviderCode":4,"endLocalStationID":"121000005","endArsID":"22-005","passStopList":{"stations":[{"index":0,"stationID":163083,"stationName":"잠실역8번출구","stationCityCode":1000,"stationProviderCode":4,"localStationID":"123000043","arsID":"24-132","x":"127.10139","y":"37.513914","isNonStop":"N"},{"index":1,"stationID":108901,"stationName":"잠실역.롯데월드","stationCityCode":1000,"stationProviderCode":4,"localStationID":"123000049","arsID":"24-138","x":"127.097512","y":"37.512821","isNonStop":"N"},{"index":2,"stationID":108828,"stationName":"잠실5단지","stationCityCode":1000,"stationProviderCode":4,"localStationID":"123000050","arsID":"24-139","x":"127.093989","y":"37.512271","isNonStop":"N"},{"index":3,"stationID":108661,"stationName":"잠실새내역.잠실2동주민센터","stationCityCode":1000,"stationProviderCode":4,"localStationID":"123000052","arsID":"24-141","x":"127.08731","y":"37.511815","isNonStop":"N"},{"index":4,"stationID":108543,"stationName":"잠실엘스아파트앞","stationCityCode":1000,"stationProviderCode":4,"localStationID":"123000053","arsID":"24-142","x":"127.083258","y":"37.511991","isNonStop":"N"},{"index":5,"stationID":108444,"stationName":"종합운동장사거리","stationCityCode":1000,"stationProviderCode":4,"localStationID":"123000054","arsID":"24-143","x":"127.079218","y":"37.512139","isNonStop":"N"},{"index":6,"stationID":108178,"stationName":"잠실종합운동장","stationCityCode":1000,"stationProviderCode":4,"localStationID":"123000055","arsID":"24-144","x":"127.072173","y":"37.511084","isNonStop":"N"},{"index":7,"stationID":107915,"stationName":"강남경찰서면허시험장","stationCityCode":1000,"stationProviderCode":4,"localStationID":"122000093","arsID":"23-196","x":"127.065853","y":"37.509926","isNonStop":"N"},{"index":8,"stationID":107786,"stationName":"한국무역센터.삼성역","stationCityCode":1000,"stationProviderCode":4,"localStationID":"122000098","arsID":"23-201","x":"127.061796","y":"37.508741","isNonStop":"N"},{"index":9,"stationID":107506,"stationName":"포스코건너편","stationCityCode":1000,"stationProviderCode":4,"localStationID":"122000114","arsID":"23-217","x":"127.055408","y":"37.506726","isNonStop":"N"},{"index":10,"stationID":107285,"stationName":"선릉역","stationCityCode":1000,"stationProviderCode":4,"localStationID":"122000115","arsID":"23-218","x":"127.050428","y":"37.50519","isNonStop":"N"},{"index":11,"stationID":106957,"stationName":"서울상록회관.한국기술센터","stationCityCode":1000,"stationProviderCode":4,"localStationID":"122000174","arsID":"23-277","x":"127.04377","y":"37.503154","isNonStop":"N"},{"index":12,"stationID":106716,"stationName":"아가방빌딩.하나은행","stationCityCode":1000,"stationProviderCode":4,"localStationID":"122000177","arsID":"23-280","x":"127.038632","y":"37.501572","isNonStop":"N"},{"index":13,"stationID":106527,"stationName":"역삼역4번출구","stationCityCode":1000,"stationProviderCode":4,"localStationID":"122000180","arsID":"23-283","x":"127.034994","y":"37.500425","isNonStop":"N"},{"index":14,"stationID":106171,"stationName":"신분당선강남역","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000009","arsID":"22-009","x":"127.028525","y":"37.496083","isNonStop":"N"},{"index":15,"stationID":106332,"stationName":"래미안아파트.파이낸셜뉴스","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000007","arsID":"22-007","x":"127.03057","y":"37.491819","isNonStop":"N"},{"index":16,"stationID":106382,"stationName":"뱅뱅사거리","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000005","arsID":"22-005","x":"127.032421","y":"37.487708","isNonStop":"N"}]}},{"trafficType":3,"distance":122,"sectionTime":2},{"trafficType":2,"distance":6586,"sectionTime":25,"stationCount":15,"lane":[{"busNo":"641","type":11,"busID":1187,"busLocalBlID":"100100094","busCityCode":1000,"busProviderCode":4}],"intervalTime":6,"startName":"뱅뱅사거리","startX":127.032977,"startY":37.486703,"endName":"서울미술고.인헌중고","endX":126.965622,"endY":37.476501,"startID":106410,"startStationCityCode":1000,"startStationProviderCode":4,"startLocalStationID":"121000006","startArsID":"22-006","endID":104512,"endStationCityCode":1000,"endStationProviderCode":4,"endLocalStationID":"120000002","endArsID":"21-101","passStopList":{"stations":[{"index":0,"stationID":106410,"stationName":"뱅뱅사거리","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000006","arsID":"22-006","x":"127.032977","y":"37.486703","isNonStop":"N"},{"index":1,"stationID":106318,"stationName":"뱅뱅사거리","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000049","arsID":"22-125","x":"127.02943","y":"37.48899","isNonStop":"N"},{"index":2,"stationID":106190,"stationName":"서초그랑자이아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000051","arsID":"22-127","x":"127.025905","y":"37.487943","isNonStop":"N"},{"index":3,"stationID":105929,"stationName":"서일초등학교","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000036","arsID":"22-112","x":"127.021253","y":"37.486526","isNonStop":"N"},{"index":4,"stationID":124976,"stationName":"국제전자센터","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000297","arsID":"22-376","x":"127.017773","y":"37.485461","isNonStop":"N"},{"index":5,"stationID":105660,"stationName":"남부터미널.한일시멘트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000080","arsID":"22-156","x":"127.014074","y":"37.484727","isNonStop":"N"},{"index":6,"stationID":105386,"stationName":"서초중학교","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000070","arsID":"22-146","x":"127.00857","y":"37.483681","isNonStop":"N"},{"index":7,"stationID":105289,"stationName":"서울고등학교","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000072","arsID":"22-148","x":"127.004859","y":"37.482965","isNonStop":"N"},{"index":8,"stationID":105220,"stationName":"방배동신동아아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000152","arsID":"22-228","x":"127.001814","y":"37.482344","isNonStop":"N"},{"index":9,"stationID":105134,"stationName":"지하철2호선방배역","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000157","arsID":"22-233","x":"126.996402","y":"37.481226","isNonStop":"N"},{"index":10,"stationID":105078,"stationName":"대우효령아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000160","arsID":"22-236","x":"126.99334","y":"37.480245","isNonStop":"N"},{"index":11,"stationID":105017,"stationName":"종로교회","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000159","arsID":"22-235","x":"126.98902","y":"37.478641","isNonStop":"N"},{"index":12,"stationID":104964,"stationName":"서울교통공사","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000158","arsID":"22-234","x":"126.986206","y":"37.476805","isNonStop":"N"},{"index":13,"stationID":104810,"stationName":"사당1동관악시장앞","stationCityCode":1000,"stationProviderCode":4,"localStationID":"119000048","arsID":"20-141","x":"126.977896","y":"37.476851","isNonStop":"N"},{"index":14,"stationID":104683,"stationName":"엔지니어링회관","stationCityCode":1000,"stationProviderCode":4,"localStationID":"119000049","arsID":"20-142","x":"126.972796","y":"37.476095","isNonStop":"N"},{"index":15,"stationID":104512,"stationName":"서울미술고.인헌중고","stationCityCode":1000,"stationProviderCode":4,"localStationID":"120000002","arsID":"21-101","x":"126.965622","y":"37.476501","isNonStop":"N"}]}},{"trafficType":3,"distance":134,"sectionTime":2}]},{"pathType":2,"info":{"trafficDistance":14840.0,"totalWalk":395,"totalTime":55,"payment":2900,"busTransitCount":2,"subwayTransitCount":0,"mapObj":"8014:1:25:36@2811223:1:57:74","firstStartStation":"잠실역6번출구","lastEndStation":"서울미술고.인헌중고","totalStationCount":28,"busStationCount":28,"subwayStationCount":0,"totalDistance":15235.0,"totalWalkTime":-1,"checkIntervalTime":100,"checkIntervalTimeOverYn":"N","totalIntervalTime":50},"subPath":[{"trafficType":3,"distance":261,"sectionTime":4},{"trafficType":2,"distance":6850,"sectionTime":20,"stationCount":11,"lane":[{"busNo":"9303","type":4,"busID":8014,"busLocalBlID":"227000019","busCityCode":1070,"busProviderCode":2}],"intervalTime":20,"startName":"잠실역6번출구","startX":127.098931,"startY":37.514301,"endName":"강남역.강남역사거리","endX":127.026557,"endY":37.497824,"startID":108916,"startStationCityCode":1070,"startStationProviderCode":2,"startLocalStationID":"123000048","startArsID":"92-017","endID":157359,"endStationCityCode":1070,"endStationProviderCode":2,"endLocalStationID":"121000091","endArsID":"90-161","passStopList":{"stations":[{"index":0,"stationID":108916,"stationName":"잠실역6번출구","stationCityCode":1070,"stationProviderCode":2,"localStationID":"123000048","arsID":"92-017","x":"127.098931","y":"37.514301","isNonStop":"N"},{"index":1,"stationID":108762,"stationName":"잠실리센츠아파트앞","stationCityCode":1070,"stationProviderCode":2,"localStationID":"123000051","arsID":"92-009","x":"127.091345","y":"37.512035","isNonStop":"N"},{"index":2,"stationID":108543,"stationName":"잠실엘스아파트앞","stationCityCode":1070,"stationProviderCode":2,"localStationID":"123000053","arsID":"92-005","x":"127.083258","y":"37.511991","isNonStop":"N"},{"index":3,"stationID":108178,"stationName":"잠실종합운동장","stationCityCode":1070,"stationProviderCode":2,"localStationID":"123000055","arsID":"92-002","x":"127.072173","y":"37.511084","isNonStop":"N"},{"index":4,"stationID":107915,"stationName":"강남경찰서면허시험장","stationCityCode":1070,"stationProviderCode":2,"localStationID":"122000093","arsID":"91-164","x":"127.065853","y":"37.509926","isNonStop":"N"},{"index":5,"stationID":107786,"stationName":"한국무역센터.삼성역","stationCityCode":1070,"stationProviderCode":2,"localStationID":"122000098","arsID":"91-155","x":"127.061796","y":"37.508741","isNonStop":"N"},{"index":6,"stationID":107506,"stationName":"포스코건너편","stationCityCode":1070,"stationProviderCode":2,"localStationID":"122000114","arsID":"91-066","x":"127.055408","y":"37.506726","isNonStop":"N"},{"index":7,"stationID":107285,"stationName":"선릉역","stationCityCode":1070,"stationProviderCode":2,"localStationID":"122000115","arsID":"91-168","x":"127.050428","y":"37.50519","isNonStop":"N"},{"index":8,"stationID":106957,"stationName":"서울상록회관.한국기술센터","stationCityCode":1070,"stationProviderCode":2,"localStationID":"122000174","arsID":"91-169","x":"127.04377","y":"37.503154","isNonStop":"N"},{"index":9,"stationID":106527,"stationName":"역삼역4번출구","stationCityCode":1070,"stationProviderCode":2,"localStationID":"122000180","arsID":"91-167","x":"127.034994","y":"37.500425","isNonStop":"N"},{"index":10,"stationID":5018754,"stationName":"강남역12번출구A","stationCityCode":1070,"stationProviderCode":2,"localStationID":"122000745","arsID":"23-494","x":"127.029372","y":"37.49873","isNonStop":"N"},{"index":11,"stationID":157359,"stationName":"강남역.강남역사거리","stationCityCode":1070,"stationProviderCode":2,"localStationID":"121000091","arsID":"90-161","x":"127.026557","y":"37.497824","isNonStop":"N"}]}},{"trafficType":3,"distance":0,"sectionTime":0},{"trafficType":2,"distance":7990,"sectionTime":29,"stationCount":17,"lane":[{"busNo":"N75","type":11,"busID":2811223,"busLocalBlID":"111000016","busCityCode":1000,"busProviderCode":4}],"intervalTime":30,"startName":"강남역.강남역사거리","startX":127.026557,"startY":37.497824,"endName":"서울미술고.인헌중고","endX":126.965622,"endY":37.476501,"startID":157359,"startStationCityCode":1000,"startStationProviderCode":4,"startLocalStationID":"121000091","startArsID":"22-167","endID":104512,"endStationCityCode":1000,"endStationProviderCode":4,"endLocalStationID":"120000002","endArsID":"21-101","passStopList":{"stations":[{"index":0,"stationID":157359,"stationName":"강남역.강남역사거리","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000091","arsID":"22-167","x":"127.026557","y":"37.497824","isNonStop":"N"},{"index":1,"stationID":106001,"stationName":"서초동진흥아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000092","arsID":"22-168","x":"127.022761","y":"37.49663","isNonStop":"N"},{"index":2,"stationID":105832,"stationName":"서초동유원아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000093","arsID":"22-169","x":"127.019506","y":"37.495639","isNonStop":"N"},{"index":3,"stationID":105710,"stationName":"지하철2호선교대역4출구","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000094","arsID":"22-170","x":"127.015822","y":"37.494518","isNonStop":"N"},{"index":4,"stationID":105619,"stationName":"교대역14번출구","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000085","arsID":"22-161","x":"127.013832","y":"37.491951","isNonStop":"N"},{"index":5,"stationID":105641,"stationName":"서울교대사거리","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000082","arsID":"22-158","x":"127.014636","y":"37.487543","isNonStop":"N"},{"index":6,"stationID":105660,"stationName":"남부터미널.한일시멘트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000080","arsID":"22-156","x":"127.014074","y":"37.484727","isNonStop":"N"},{"index":7,"stationID":105386,"stationName":"서초중학교","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000070","arsID":"22-146","x":"127.00857","y":"37.483681","isNonStop":"N"},{"index":8,"stationID":105289,"stationName":"서울고등학교","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000072","arsID":"22-148","x":"127.004859","y":"37.482965","isNonStop":"N"},{"index":9,"stationID":105220,"stationName":"방배동신동아아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000152","arsID":"22-228","x":"127.001814","y":"37.482344","isNonStop":"N"},{"index":10,"stationID":151512,"stationName":"현대멤피스2차아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000171","arsID":"22-247","x":"126.998534","y":"37.479875","isNonStop":"N"},{"index":11,"stationID":112066,"stationName":"방배그랑자이아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000169","arsID":"22-245","x":"127.000311","y":"37.477178","isNonStop":"N"},{"index":12,"stationID":105103,"stationName":"성뒤마을.교육연수원","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000179","arsID":"22-255","x":"126.994624","y":"37.473805","isNonStop":"N"},{"index":13,"stationID":151811,"stationName":"방배동래미안타워.동덕여중고","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000263","arsID":"22-340","x":"126.990779","y":"37.474727","isNonStop":"N"},{"index":14,"stationID":104987,"stationName":"대항병원","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000181","arsID":"22-257","x":"126.987057","y":"37.47574","isNonStop":"N"},{"index":15,"stationID":104810,"stationName":"사당1동관악시장앞","stationCityCode":1000,"stationProviderCode":4,"localStationID":"119000048","arsID":"20-141","x":"126.977896","y":"37.476851","isNonStop":"N"},{"index":16,"stationID":104683,"stationName":"엔지니어링회관","stationCityCode":1000,"stationProviderCode":4,"localStationID":"119000049","arsID":"20-142","x":"126.972796","y":"37.476095","isNonStop":"N"},{"index":17,"stationID":104512,"stationName":"서울미술고.인헌중고","stationCityCode":1000,"stationProviderCode":4,"localStationID":"120000002","arsID":"21-101","x":"126.965622","y":"37.476501","isNonStop":"N"}]}},{"trafficType":3,"distance":134,"sectionTime":2}]},{"pathType":2,"info":{"trafficDistance":14840.0,"totalWalk":395,"totalTime":55,"payment":2900,"busTransitCount":2,"subwayTransitCount":0,"mapObj":"18523:1:69:80@2811223:1:57:74","firstStartStation":"잠실역6번출구","lastEndStation":"서울미술고.인헌중고","totalStationCount":28,"busStationCount":28,"subwayStationCount":0,"totalDistance":15235.0,"totalWalkTime":-1,"checkIntervalTime":100,"checkIntervalTimeOverYn":"N","totalIntervalTime":50},"subPath":[{"trafficType":3,"distance":261,"sectionTime":4},{"trafficType":2,"distance":6850,"sectionTime":20,"stationCount":11,"lane":[{"busNo":"2000","type":4,"busID":18523,"busLocalBlID":"222000075","busCityCode":1120,"busProviderCode":2}],"intervalTime":20,"startName":"잠실역6번출구","startX":127.098931,"startY":37.514301,"endName":"강남역.강남역사거리","endX":127.026557,"endY":37.497824,"startID":108916,"startStationCityCode":1120,"startStationProviderCode":2,"startLocalStationID":"123000048","startArsID":"92-017","endID":157359,"endStationCityCode":1120,"endStationProviderCode":2,"endLocalStationID":"121000091","endArsID":"90-161","passStopList":{"stations":[{"index":0,"stationID":108916,"stationName":"잠실역6번출구","stationCityCode":1120,"stationProviderCode":2,"localStationID":"123000048","arsID":"92-017","x":"127.098931","y":"37.514301","isNonStop":"N"},{"index":1,"stationID":108762,"stationName":"잠실리센츠아파트앞","stationCityCode":1120,"stationProviderCode":2,"localStationID":"123000051","arsID":"92-009","x":"127.091345","y":"37.512035","isNonStop":"N"},{"index":2,"stationID":108543,"stationName":"잠실엘스아파트앞","stationCityCode":1120,"stationProviderCode":2,"localStationID":"123000053","arsID":"92-005","x":"127.083258","y":"37.511991","isNonStop":"N"},{"index":3,"stationID":108178,"stationName":"잠실종합운동장","stationCityCode":1120,"stationProviderCode":2,"localStationID":"123000055","arsID":"92-002","x":"127.072173","y":"37.511084","isNonStop":"N"},{"index":4,"stationID":107915,"stationName":"강남경찰서면허시험장","stationCityCode":1120,"stationProviderCode":2,"localStationID":"122000093","arsID":"91-164","x":"127.065853","y":"37.509926","isNonStop":"N"},{"index":5,"stationID":107786,"stationName":"한국무역센터.삼성역","stationCityCode":1120,"stationProviderCode":2,"localStationID":"122000098","arsID":"91-155","x":"127.061796","y":"37.508741","isNonStop":"N"},{"index":6,"stationID":107506,"stationName":"포스코건너편","stationCityCode":1120,"stationProviderCode":2,"localStationID":"122000114","arsID":"91-066","x":"127.055408","y":"37.506726","isNonStop":"N"},{"index":7,"stationID":107285,"stationName":"선릉역","stationCityCode":1120,"stationProviderCode":2,"localStationID":"122000115","arsID":"91-168","x":"127.050428","y":"37.50519","isNonStop":"N"},{"index":8,"stationID":106957,"stationName":"서울상록회관.한국기술센터","stationCityCode":1120,"stationProviderCode":2,"localStationID":"122000174","arsID":"91-169","x":"127.04377","y":"37.503154","isNonStop":"N"},{"index":9,"stationID":106527,"stationName":"역삼역4번출구","stationCityCode":1120,"stationProviderCode":2,"localStationID":"122000180","arsID":"91-167","x":"127.034994","y":"37.500425","isNonStop":"N"},{"index":10,"stationID":5018754,"stationName":"강남역12번출구A","stationCityCode":1120,"stationProviderCode":2,"localStationID":"122000745","arsID":"23-494","x":"127.029372","y":"37.49873","isNonStop":"N"},{"index":11,"stationID":157359,"stationName":"강남역.강남역사거리","stationCityCode":1120,"stationProviderCode":2,"localStationID":"121000091","arsID":"90-161","x":"127.026557","y":"37.497824","isNonStop":"N"}]}},{"trafficType":3,"distance":0,"sectionTime":0},{"trafficType":2,"distance":7990,"sectionTime":29,"stationCount":17,"lane":[{"busNo":"N75","type":11,"busID":2811223,"busLocalBlID":"111000016","busCityCode":1000,"busProviderCode":4}],"intervalTime":30,"startName":"강남역.강남역사거리","startX":127.026557,"startY":37.497824,"endName":"서울미술고.인헌중고","endX":126.965622,"endY":37.476501,"startID":157359,"startStationCityCode":1000,"startStationProviderCode":4,"startLocalStationID":"121000091","startArsID":"22-167","endID":104512,"endStationCityCode":1000,"endStationProviderCode":4,"endLocalStationID":"120000002","endArsID":"21-101","passStopList":{"stations":[{"index":0,"stationID":157359,"stationName":"강남역.강남역사거리","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000091","arsID":"22-167","x":"127.026557","y":"37.497824","isNonStop":"N"},{"index":1,"stationID":106001,"stationName":"서초동진흥아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000092","arsID":"22-168","x":"127.022761","y":"37.49663","isNonStop":"N"},{"index":2,"stationID":105832,"stationName":"서초동유원아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000093","arsID":"22-169","x":"127.019506","y":"37.495639","isNonStop":"N"},{"index":3,"stationID":105710,"stationName":"지하철2호선교대역4출구","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000094","arsID":"22-170","x":"127.015822","y":"37.494518","isNonStop":"N"},{"index":4,"stationID":105619,"stationName":"교대역14번출구","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000085","arsID":"22-161","x":"127.013832","y":"37.491951","isNonStop":"N"},{"index":5,"stationID":105641,"stationName":"서울교대사거리","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000082","arsID":"22-158","x":"127.014636","y":"37.487543","isNonStop":"N"},{"index":6,"stationID":105660,"stationName":"남부터미널.한일시멘트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000080","arsID":"22-156","x":"127.014074","y":"37.484727","isNonStop":"N"},{"index":7,"stationID":105386,"stationName":"서초중학교","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000070","arsID":"22-146","x":"127.00857","y":"37.483681","isNonStop":"N"},{"index":8,"stationID":105289,"stationName":"서울고등학교","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000072","arsID":"22-148","x":"127.004859","y":"37.482965","isNonStop":"N"},{"index":9,"stationID":105220,"stationName":"방배동신동아아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000152","arsID":"22-228","x":"127.001814","y":"37.482344","isNonStop":"N"},{"index":10,"stationID":151512,"stationName":"현대멤피스2차아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000171","arsID":"22-247","x":"126.998534","y":"37.479875","isNonStop":"N"},{"index":11,"stationID":112066,"stationName":"방배그랑자이아파트","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000169","arsID":"22-245","x":"127.000311","y":"37.477178","isNonStop":"N"},{"index":12,"stationID":105103,"stationName":"성뒤마을.교육연수원","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000179","arsID":"22-255","x":"126.994624","y":"37.473805","isNonStop":"N"},{"index":13,"stationID":151811,"stationName":"방배동래미안타워.동덕여중고","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000263","arsID":"22-340","x":"126.990779","y":"37.474727","isNonStop":"N"},{"index":14,"stationID":104987,"stationName":"대항병원","stationCityCode":1000,"stationProviderCode":4,"localStationID":"121000181","arsID":"22-257","x":"126.987057","y":"37.47574","isNonStop":"N"},{"index":15,"stationID":104810,"stationName":"사당1동관악시장앞","stationCityCode":1000,"stationProviderCode":4,"localStationID":"119000048","arsID":"20-141","x":"126.977896","y":"37.476851","isNonStop":"N"},{"index":16,"stationID":104683,"stationName":"엔지니어링회관","stationCityCode":1000,"stationProviderCode":4,"localStationID":"119000049","arsID":"20-142","x":"126.972796","y":"37.476095","isNonStop":"N"},{"index":17,"stationID":104512,"stationName":"서울미술고.인헌중고","stationCityCode":1000,"stationProviderCode":4,"localStationID":"120000002","arsID":"21-101","x":"126.965622","y":"37.476501","isNonStop":"N"}]}},{"trafficType":3,"distance":134,"sectionTime":2}]}]}}
여기서 주의 깊게 보아야 하는 곳은 다음 파트이다.
"path":[
{"pathType":1,
"info":{
"trafficDistance":13600.0,
"totalWalk":228,
"totalTime":25,
"payment":1500,
"busTransitCount":0,
"subwayTransitCount":1,
"mapObj":"2:2:216:227",
"firstStartStation":"잠실",
"lastEndStation":"낙성대",
"totalStationCount":11,
"busStationCount":0,
"subwayStationCount":11,
"totalDistance":13828.0,
"totalWalkTime":-1,
"checkIntervalTime":100,
"checkIntervalTimeOverYn":"N",
"totalIntervalTime":5
},
출발지가 잠실역으로 정확히 잡혔고 도착지도 낙성대역으로 잘잡혔다
소요시간은 25분으로 네이버 지도 측정시간과 동일하다
[Odsay의 장점]
- 국내 교통상황을 잘 반영해 시간이 상당히 정확한 편이다
- 조작법이 간단하고 reference가 잘 정리되어 있다. 키발급부터 연결까지 30분이 안걸렸다
- 도시간 검색 설정이 가능하다
[Odsay의 단점]
- DTO부터 요청 로직까지 직접 작성해야 한다
- 출발/도착시간 설정이 불가능하다
- 일 1000건으로 가능한 호출 횟수가 google maps에 비해 적다
[우리 팀의 선택]
처음 google api를 다룰 때까지만 해도 지원하는 라이브러리가 강력했고 이에 따라 미리 구현되어 있는 기능이 많아 google maps api 쪽으로 마음이 기울어졌다. 그러나 오류를 만나거나 라이브러리를 사용하려할 때마다 reference가 산재되어 있고 찾기가 힘들어 이슈 하나를 해결하는데 시간이 많이 소요되었다.
또한 가장 치명적인 부분은 국내 기준 시간계산의 정확도였다. 소요시간을 반환하긴 하는데 정확한 시간인지에 대한 확신이 없었다.어디서 오류가 발생할지 예측이 불가했고 그 오류를 어떻게 핸들링해야하는지도 잘 감이 안잡혔다.
그에 반해 오디세이는 국내 대중교통 상황을 실시간 반영함은 물론 에러의 이유를 한글로 모두 반환해주어 디버깅에 용이했다. 가령 도착지와 출발지가 너무 가까워 대중교통 경로를 찾을 수 없는 경우에는 다음과 같은 메시지가 반환된다.
디버깅의 용이성과 정확성 측면에서 오디세이가 라이트하지만 스프린트 개발에 어울린다 생각이 들어 채택되었다.
'프로젝트 > 오디' 카테고리의 다른 글
🌐NAT gateway로 private 서브넷에서 외부 API 호출하기 (0) | 2024.10.29 |
---|---|
CD 배포 스크립트 실행 중 오류가 발생한다면? : tag를 활용한 롤백 전략 구축 하기 (1) | 2024.10.28 |
🙉 Test Fixture 생성전략에 대한 고민 feat) FixtureMonkey (2) | 2024.10.12 |
Odsay 대중교통 길찾기 API를 쓰며 느낀 3가지 단점 (2) | 2024.08.26 |
[인프라 구축] AWS EC2 백엔드 API 서버 배포 (1) | 2024.07.14 |