춤추는 개발자

[Android Studio] 공공데이터를 활용한 버스노선 앱 만들기 본문

Android/study_til

[Android Studio] 공공데이터를 활용한 버스노선 앱 만들기

Heon_9u 2020. 12. 29. 23:46
728x90
반응형

다음은 공공데이터 Open API를 활용하는 방법으로 아래 사이트에서 회원가입, 인증키를 받는 과정은 생략하겠습니다.

 

1. 공공데이터 Open API

www.data.go.kr/

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 위 사이트는 공공기관에서 제공하는 공공데이터로 누구나 쉽고 편리하게 사용할 수 있으며 파일 데이터, Open API, 시각화 등 다양한 방식으로 제공됩니다. 본 예제에서는 Open API의 인증키를 받아 [노선정보조회 서비스]라는 Open API를 활용해보도록 하겠습니다.

 


1. 검색할 노선번호 얻기 - getBusRouteList

 요청하는 웹 사이트 주소에 서비스 인증키와 데이터를 붙여서 보내는 Get방식을 활용합니다. 요청을 통해 데이터(headerCd. busRouteId)를 얻어 옵니다. 이 중에 busRouteId는 getStationByRoute에서 정보를 가져오기 위해 사용합니다.

항목명 기능 자료형태
headerCd 이 값을 이용해서 정상적으로 DB와 연결이 되었는지를 확인할 수 있다. 값이 0이면 정상. string
busRouteId 노선 ID string

 

2. busRouteId로 데이터 가져오기 - getStationByRoute

 위에서 얻은 busRouteId를 통해 getStationByRoute에서 아래와 같은 데이터를 가져옵니다.

항목명 기능 자료형태
gpsX x 좌표 string
gpsY y 좌표 string
stationNm 정류소 이름 string
sectSpd 구간 속도 string
direction 진행 방향 string

 

3. DownloadWebContent 클래스

 AsyncTask 클래스에 상속한 클래스로 onCreate() 메소드에서 DownloadWebContent 클래스의 객체를 생성한 후에 execute 명령을 통해 작동시킨다.

String serviceUrl = "http://ws.bus.co.kr/..."
String serviceKey = "d8QNM..."

String strUrl = serviceUrl + "?serviceKey=" + serviceKey + "&strSrch=" + strSrch;

DownloadWebContent dwc1 = new DownloadWebContent();
dwc1.execute(strUrl);

 

4. 버스 번호를 검색해서 버스 위치 찾기

 원래 예제에서는 버스 번호를 직접 검색하지 않고 숫자를 더하거나 빼서 검색합니다. 하지만 원하는 번호를 직접 입력하게끔 EditView와 Button의 onClick 메소드를 이용해 검색 방식으로 바꿨습니다.

 검색 결과는 다음과 같습니다.

 

 단순히 Open API의 결과값을 Parsing해서 정리한 모습입니다. 만약 여기에 스마트폰 GPS나 지도 API를 활용한다면 버스 도착시간, 정류장 위치 등을 확인할 수 있습니다.

 이번 예제를 통해 배운 점은 총 3가지입니다.

 1. XmlPullParser를 통해 API 결과를 Parsing하는 작업

 2. AsyncTask를 이용해 Thread를 추가 생성하지않고 통신과 Parsing작업 수행하는 방법

 3. Open API를 활용하기 위해 Manifests에 PermissionCleartextTraffic 추가하기

 

1, 2번은 이전 포스팅에서 다뤄봤지만, 3번 때문에 API요청에 대한 응답을 못 받아서 약 4시간동안 삽질했습니다.. 특히, 같은 코드로는 vscode에서 작동하지만 Android Studio에서만 작동이 안됐습니다. Stream형태도 바꿔보고 나중에는 Permission까지 추가해봤지만 계속 실패했습니다.

 다행히 우여곡절 끝에 CleartextTraffic을 추가해서 해결할 수 있었습니다. 해당 문제는 다음 포스팅에서 다뤄보도록 하겠습니다.

 

728x90
반응형