내 주변 버스정류소와 경유 노선을 한눈에 확인하는 앱
최근 생활 편의 앱 시리즈의 하나로 버스정류소어때 앱을 개발했습니다.
버스정류소어때는 현재 위치 또는 입력한 지역을 기준으로 주변 버스정류소를 조회하고, 선택한 정류소를 경유하는 버스 노선 정보를 확인할 수 있는 위치기반 버스정보 앱입니다.
단순히 정류소 이름만 보여주는 것이 아니라, 정류소의 위치, 정류소 ID, 경유 노선, 노선 유형, 기점과 종점 정보를 함께 확인할 수 있도록 구성했습니다.
1. 앱 개발 목적
대중교통을 이용할 때 가장 먼저 필요한 정보는 “내 주변에 어떤 버스정류소가 있는가?”입니다.
하지만 실제로는 다음과 같은 불편함이 있습니다.
- 현재 위치 주변 정류소를 빠르게 찾기 어려움
- 정류소 이름은 알지만 어떤 노선이 지나는지 확인이 번거로움
- 지역별 버스 정보 품질이 다름
- 정류소 위치와 노선 정보를 한 화면에서 보기 어려움
- 공공데이터 API가 지역마다 다르게 동작함
그래서 이번 앱은 다음 목표를 기준으로 개발했습니다.
현재 위치 기준 정류소 조회
입력 위치 기준 정류소 조회
정류소별 경유 노선 확인
정류소 위치 지도 표시
버스 위치정보 확장 가능 구조
2. 앱 이름: 버스정류소어때
앱 이름은 기존 생활 편의 앱 시리즈와 맞춰 버스정류소어때로 정했습니다.
이름에서 바로 기능을 알 수 있도록 했고, 사용자 입장에서도 “버스정류소를 찾아주는 앱”이라는 인상을 쉽게 받을 수 있도록 구성했습니다.
3. 주요 기능
1) 현재 위치 기반 버스정류소 조회
앱을 실행하면 GPS 권한을 확인한 뒤 현재 위치를 가져옵니다.
현재 위치를 기준으로 가까운 버스정류소를 조회하고, 목록에 표시합니다.
표시되는 주요 정보는 다음과 같습니다.
도시명
정류소명
정류소ID
정류소 목록은 Grid 형태로 표시하여 한눈에 보기 쉽게 구성했습니다.
2) 입력 위치 기반 조회
현재 위치뿐만 아니라 사용자가 직접 지역명을 입력해서 조회할 수도 있습니다.
예를 들어 다음과 같이 입력할 수 있습니다.
창원시청
서울역
강남역
부산역
입력된 위치를 좌표로 변환한 뒤, 해당 위치 주변의 버스정류소를 조회합니다.
이 기능은 현재 위치가 아닌 다른 지역의 버스정류소를 미리 확인할 때 유용합니다.
3) 버스정류소 목록 표시
조회된 정류소는 목록 형태로 표시됩니다.
초기에는 일정 건수만 표시하고, 필요할 경우 더 많은 정류소를 조회할 수 있도록 구성했습니다.
화면에서는 다음과 같은 형태로 표시됩니다.
도시명 정류소명 정류소ID
창원시 시청정문 CWB3790033
부산광역시 부산역 ...
서울특별시 서울역버스환승센터 ...
정류소를 선택하면 해당 정류소의 경유 노선 화면으로 이동합니다.
4) 정류소별 경유 노선 조회
정류소를 선택하면 해당 정류소를 경유하는 버스 노선 정보를 조회합니다.
표시 항목은 다음과 같습니다.
노선번호
노선유형
기점
종점
예를 들어 다음과 같은 식입니다.
100번 간선 대방동 마산역
101번 간선 창원대 월영동
707번 급행 창원중앙역 부산신항
이를 통해 사용자는 특정 정류소에서 어떤 버스를 탈 수 있는지 쉽게 확인할 수 있습니다.
5) 정류소 위치 지도 표시
정류소 상세 화면에는 지도도 함께 표시됩니다.
기존에는 단순히 OpenStreetMap URL을 WebView로 표시하는 방식이었지만, 이후 개선 과정에서 eMap 앱에서 사용하던 지도 구조를 적용했습니다.
현재는 다음 기능을 지원합니다.
OSM 지도
브이월드 일반 지도
브이월드 위성 지도
정류소 마커 표시
지도 확대/축소
지도는 WebView 내부에 OpenLayers 기반 HTML을 직접 구성하는 방식으로 처리했습니다.
6) 버스 위치정보 화면
노선을 선택하면 버스 위치정보 화면으로 이동할 수 있도록 확장했습니다.
버스 위치정보 화면에서는 해당 노선의 운행 차량 위치를 조회하고, 지도에 표시합니다.
최근 개선한 내용은 다음과 같습니다.
정류소 기준 가까운 버스 2대 우선 표시
전체보기 시 운행 차량 전체 표시
하단 차량 위치 목록을 가까운 순으로 정렬
차량 선택 시 해당 버스 위치를 지도에 표시
불필요한 지도 안내 문구 제거
즉, 처음 화면이 열렸을 때는 사용자가 선택한 정류소 기준으로 가까운 차량 2대만 우선 보여주고, 전체보기를 누르면 해당 노선의 전체 운행 차량을 지도에 표시하도록 했습니다.
4. 개발 기술
이번 앱은 C# .NET MAUI 기반으로 개발했습니다.
주요 기술 구성은 다음과 같습니다.
C#
.NET MAUI
Syncfusion DataGrid
공공데이터 OpenAPI
TAGO 버스정류소정보 API
WebView
OpenLayers
VWorld 지도
Android 위치 권한
GPS / Geocoding
5. 화면 구성
앱은 크게 다음 화면으로 구성되어 있습니다.
1) 메인 화면
메인 화면은 주변 버스정류소를 조회하는 화면입니다.
구성 요소는 다음과 같습니다.
앱 제목
현재 위치 표시
위치 입력창
현재위치 조회 버튼
입력조회 버튼
버스정류소 목록 Grid
상태 메시지
첫 화면에서는 버스정류소 목록이 너무 크게 보이지 않도록 블록 높이를 조정했습니다.
2) 버스노선 화면
정류소를 선택하면 버스노선 화면으로 이동합니다.
구성 요소는 다음과 같습니다.
정류소명
정류소 정보
정류소 위치 지도
경유 노선 목록 Grid
도착시간 재조회 버튼
지도 영역은 너무 많은 공간을 차지하지 않도록 높이를 줄이고, 노선 목록을 함께 보기 좋게 조정했습니다.
3) 버스 위치정보 화면
노선을 선택하면 버스 위치정보 화면으로 이동합니다.
구성 요소는 다음과 같습니다.
노선번호
기점 / 종점
버스 위치 지도
위치 재조회 버튼
전체보기 버튼
운행 차량 위치 Grid
하단의 차량 위치 목록은 정류소 기준 가까운 순으로 정렬됩니다.
차량을 선택하면 해당 차량 위치가 지도 상단에 바로 표시됩니다.
6. 공공데이터 API 활용
버스정류소어때는 공공데이터 기반으로 동작합니다.
기본적으로 활용한 API는 TAGO 버스정류소정보조회 서비스입니다.
주요 API는 다음과 같습니다.
getCrdntPrxmtSttnList
좌표기반 근접 정류소 목록 조회
getCtyCodeList
도시코드 목록 조회
getSttnThrghRouteList
정류소별 경유 노선 목록 조회
getSttnNoList
정류소명 기반 정류소 조회
이 중 핵심은 현재 위치 주변 정류소를 조회하는 getCrdntPrxmtSttnList와, 정류소별 경유 노선을 조회하는 getSttnThrghRouteList입니다.
7. 개발 중 겪은 문제
1) 도시코드 문제
개발 과정에서 가장 많이 신경 쓴 부분은 도시코드였습니다.
일부 지역은 도시코드가 2자리로 제공되고, 일부 지역은 5자리로 제공됩니다.
예를 들면 다음과 같습니다.
부산광역시: 21
대전광역시: 25
창원시: 38010
처음에는 일부 5자리 코드를 2자리로 변환하려고 했지만, 실제로는 지역마다 다르게 처리해야 했습니다.
특히 창원시는 단순히 38이 아니라 38010으로 조회해야 정상적인 도시코드에 해당합니다.
따라서 무조건 앞 2자리만 사용하는 방식은 맞지 않았습니다.
2) 지역별 데이터 품질 차이
TAGO API는 전국 공통 API처럼 보이지만, 실제 데이터는 지역마다 품질 차이가 있습니다.
부산은 비교적 노선 정보가 잘 조회되지만, 충남이나 강원 일부 지역은 정류소는 조회되어도 경유 노선이 나오지 않는 경우가 있었습니다.
즉, 다음과 같은 상황이 발생할 수 있습니다.
정류소 위치조회는 성공
정류소명 검색은 실패
경유노선 조회는 0건
이는 앱 오류라기보다는 공공데이터 제공 상태의 차이에 가깝습니다.
3) 서울시 API 인증 문제
서울시 버스 API도 검토했습니다.
하지만 서울시 API는 별도 승인과 서비스별 인증키 반영이 필요했고, 승인 후에도 다음과 같은 오류가 발생할 수 있었습니다.
Key인증실패
SERVICE KEY IS NOT REGISTERED ERROR
이 문제는 앱 코드보다는 서울 버스 API 서버에 인증키가 정상 반영되지 않았거나, 호출한 서비스와 승인된 서비스가 맞지 않을 때 발생할 수 있습니다.
따라서 서울 지역은 TAGO와 서울시 API를 병행하거나, 서울 API 인증이 안정화된 후 별도 서비스 클래스로 분리하는 방식이 적합합니다.
8. 지도 기능 개선
초기에는 지도 표시를 위해 OpenStreetMap URL을 직접 WebView에 연결했습니다.
하지만 이 방식은 확장성이 부족했습니다.
그래서 이후 eMap 앱에서 사용하던 지도 구조를 가져와 다음처럼 개선했습니다.
OpenLayers 기반 지도 HTML 생성
WebView에 HtmlWebViewSource 적용
정류소 마커 표시
버스 위치 마커 표시
선택 차량 강조 표시
OSM / VWorld 일반 / VWorld 위성 지도 전환
이를 통해 단순 지도 표시에서 벗어나, 앱 내부에서 마커와 지도 동작을 직접 제어할 수 있게 되었습니다.
9. UI 개선 방향
앱 개발 중 화면 배치도 여러 번 조정했습니다.
특히 모바일 화면에서는 지도와 목록이 동시에 표시될 때 공간이 부족하기 때문에 다음과 같이 개선했습니다.
첫 화면 정류소 목록 높이 축소
버스노선 화면 지도 높이 조정
버스위치 화면 지도 높이 조정
상태 표시 라벨 일부 제거
차량 목록을 가까운 순으로 정렬
전체보기 버튼 추가
사용자가 필요한 정보를 더 빠르게 볼 수 있도록, 화면의 불필요한 여백과 안내 문구를 줄였습니다.
10. 앱의 한계와 보완 방향
버스정류소어때는 공공데이터 기반 앱이기 때문에 데이터 제공 상태에 따라 일부 정보가 표시되지 않을 수 있습니다.
특히 다음과 같은 한계가 있습니다.
지역별 버스 API 품질 차이
일부 정류소의 경유 노선 미제공
일부 지역의 버스 위치정보 미제공
서울시 API 별도 인증 필요
지자체별 API 구조 차이
향후에는 지역별 API를 추가로 연동하여 보완할 계획입니다.
예상 보완 방향은 다음과 같습니다.
서울시 버스 API 별도 연동
부산 버스 API 연동 검토
창원/경남 버스 API 연동 검토
강원/충남 지역 지자체 API 검토
정류소 즐겨찾기 기능
최근 조회 위치 저장
버스 도착 예정시간 표시
노선 전체 경로 표시
11. 앱 활용 예시
버스정류소어때는 다음과 같은 상황에서 유용합니다.
낯선 지역에서 가까운 버스정류소를 찾을 때
현재 위치 주변의 대중교통 이용 가능 여부를 확인할 때
특정 정류소에 어떤 노선이 지나는지 확인할 때
정류소 위치를 지도에서 바로 보고 싶을 때
버스 위치정보를 간단히 확인하고 싶을 때
출퇴근, 외출, 여행, 출장 등 다양한 상황에서 활용할 수 있습니다.
12. 마무리
버스정류소어때는 생활 속에서 자주 필요한 버스정류소 정보를 조금 더 쉽게 확인하기 위해 개발한 앱입니다.
처음에는 단순히 주변 정류소를 보여주는 기능으로 시작했지만, 개발을 진행하면서 경유 노선 조회, 지도 표시, 버스 위치정보, 전체보기, 가까운 차량 표시 등 다양한 기능을 추가했습니다.
공공데이터 기반 앱은 데이터 품질과 지역별 차이를 고려해야 하기 때문에 생각보다 많은 예외 처리가 필요했습니다.
하지만 이런 과정을 통해 전국 공통 구조와 지역별 보완 구조를 함께 고려하는 앱으로 발전시킬 수 있었습니다.
앞으로는 더 많은 지역의 버스 정보를 안정적으로 제공할 수 있도록 API 보완과 화면 개선을 계속 진행할 예정입니다.
버스정류소어때
내 주변 버스정류소와 경유 노선을 빠르게 확인하는 위치기반 버스정보 앱
'조그만 기술로 세상을 이롭게 > 버스정류소어때' 카테고리의 다른 글
| 버스 위치·도착정보 API란? (0) | 2026.05.24 |
|---|---|
| 버스정류소어때 업데이트 안내 (0) | 2026.05.14 |
| 새롭게 개발한 버스정류소어때 앱의 비공개 테스트를 진행하고 있습니다. (0) | 2026.05.14 |