전하게 자거 타는 임(이하 안전모) 안드로이드 어플리케이션에 대한 코드 리뷰 및 코드 리팩토링 작업에 대해 포스팅하기 앞서, 간단한 안전모 어플리케이션의 개요와 개발 목표에 대해 정리해보고자 한다. 원래 Fragment와 관련된 포스팅을 먼저 진행하려 했지만.. 안전모에 대한 포스팅이 더 하고 싶어져서 먼저 해보는 걸로~

우선, 안전모는 나의 첫 번째 안드로이드 어플리케이션인 비콘을 활용한 쇼핑 도우미 앱 ‘Betriever’ 다음으로 최애작이라고 할 수 있다. (Betriever의 대한 포스팅도 시간이 될 때 꼭 해보는 걸로~)

이 프로젝트는 대학에서 공돌이들을 대상으로 진행하는 졸업인증의 하나인 캡스톤 디자인이라는 졸업 작품 프로젝트의 일환으로 개발 되었다. 정처기도 그래서 땄더라는..

길벗, 한국형 자전거 안전제도와 교육 프로그램 모색 김진태, 김주영, 김준용, 배현식, C-ITS 환경의 자전거 및 이륜차 안전 서비스 연구, 2016, PP.28-38 우선 안전모는 여러 논문자료, 통계자료, 언론자료 등을 바탕으로 하여 자전거 이용자들에게 발생하는 자전거 교통사고 원인, 유형 등을 분석한 후, 이를 적절하게 자전거 이용자에게 알리자는 아주 좋은 취지?로 개발 되었다.

위 사진을 보면 자전거 이용자의 안전운전불이행이 사고로 이어지는 횟수가 매우 많음을 알 수 있다. 그 중에서도 서울시 자전거 이용자직각 교차로에서의 사고 발생률이 월등히 높음을 알 수 있다.

우리나라의 자전거 교통 분담률은 2%대로 굉장히 낮음에도 이 정도 수치가 나오는 것은 OECD 평균을 훨씬 웃도는 심각한 문제라 할 수 있다. 이 점에 착안해서 이를 중점적으로 파고?들었다.

구글 설문지를 도식화한 자전거 이용자의 앱 요구사항 우선 앱 개발에 앞서, 커뮤니티 사이트인 ‘뽐뿌’와 자전거 동호회를 하는 지인의 도움을 받아, 자전거 이용자들의 요구사항을 분석 해보았다. 위험 요소에 대한 알림 기능에 대해 긍정적인 대답을 해주신 분들이 많았고, 속도계, 길찾기, 편의시설 정보 제공 기능 등과 같이 자전거 어플리케이션으로써 그 의의가 있기 위해선 안전과 관련된 기능만으론 사용자에게 다가가기 어려울 수 있다는 것을 알 수 있다.

기존의 많은 자전거 어플리케이션에서 제공하는 편의 기능을 벤치마킹해서 제공함과 동시에 안전 기능을 더해보자라는 아아아ㅏㅏㅏㅏ주 좋은 취지로 개발을 시작했다 헿. (이 때 까진 미처 알지 못했다. 앱 개발이 이렇게 힘든 일인 줄은..)

결과적으로 서울시 자전거 이용자를 대상으로 개발 되었지만, 처음엔 전국의 자전거 이용자를 대상으로 개발하는 것을 목표로 했었다… 앱의 주 타겟층을 바꾼데에는 그만한 몇 가지 이유가 있었지만, 가장 큰 이유는 실시간으로 앱 사용자들의 위치와 직접 구축한 공간(Spatial)DB를 핸들링 하기가 너무 어렵다는 것이다.

postgreSQL과 https를 연동해보기도 하고, 안드로이드에서 자체적으로 제공하는 근접 알림 메소드인 addProximityAlert를 이용해보기도 했지만, 트래픽을 감당하지 못하거나 ANR이 걸리면서 앱이 죽어버렸다.

내가 짠 코드의 문제가 있었을 가능성이 가장 크지만, 일단은 관심지점(POI)이 3000개 이상 넘어가니 그 때부터 기존의 접근 방식으론 실시간으로 위치 정보를 핸들링하는 것이 불가능하다고 판단하여 기존의 500여줄이 넘는 코드를 갈아 엎고… (이 때 진짜 눈물 나왔다.) Firebase 플랫폼을 사용하기로 했다. (갓 구글 찬양)

최애작인 Betriever를 개발할 때 Firebase에 대해 사용해본 적이 있었다. 때문에, 그 효용성과 서버 사이드 개발 시간이 단축되는 이점을 알고 있었다. (Dashboard만 놓고 보면 개인적인 기준에선 AWS에 비해 더 직관적이어서 좋다.) 위치 데이터베이스 핸들링과 관련된 부분은 그 파트에 대한 코드 리뷰를 하면서 정리해보자.

이야기가 삼천세계로 조금 빠졌다. 다시 돌아와서, 안전모 프로그램의 WorkFlow Diagram을 살펴 보자. 안전모 워크 플로우 위 구성도에 대해 간단하게 정리해보자. 스마트폰의 GPS 및 네트워크 수집 정보를 통해 사용자의 위치를 파악하고, 이를 Firebase 데이터베이스에 저장된 5077개의 위험 관련 좌표 정보와 실시간으로 비교하게 된다.

  • 음성 안내는 사고 위험이 높은 직각교차로, 사고다발지역, 어린이보호구역, 보행자도로를 기준으로 알림을 하게 되며, 사용자는 안전운전을 유도해야할 필요성이 있는 위치 반경 20m 안으로 들어오면 음성안내를 통해 주의를 받게 되고 속도가 20km 이상이 되면 화면 터치가 불가능하다.
  • 속도가 30km 이상이 되면 감속을 요청하는 음성안내와 화면 깜빡임을 제공받게 된다. 뿐만 아니라, 스마트폰에 내장된 가속도계 센서를 활용해 넘어짐을 감지하여 일정 시간 동안 사용자의 응답이 없을 시에 SMS를 전송하게 된다.
  • 이 밖에 편의 기능은 속도계, 카카오내비 어플리케이션을 연동한 이륜차용 길 안내, 다음 지도 API를 활용한 편의시설 검색, 주행기록 저장, 오픈웨더맵 API를 활용한 서울시 일일 날씨 정보와 영어, 일본어, 중국어 등의 다개국어를 지원하는 기능이 있다.

각각의 기능 들에 대해선 파트 별로 따로 리뷰를 해보는 걸로 하고, 공간 DB와 관련된 내용을 살펴보자.

제공 기관 활용 DB명
서울특별시 서울시 자전거 사고다발지역 (서울 열린 데이터 광장)
서울특별시 서울시 한강공원 보행자 도로(서울 열린 데이터 광장)
서울특별시 서울시 자전거 도로(서울 열린 데이터 광장)
통계청 서울시 25개구 행정구역 경계 및 인구 통계
ITS표준노드링크시스템 서울시 평면 교차로
공공 데이터 포털 서울시 어린이 보호구역
오픈웨더맵 일일 서울시 날씨 데이터

현재 코드 리팩토링을 진행하며 추가 된 DB 정보가 더 있지만, 초기 DB 구성은 위 내용과 같다. 오픈 웨더맵 API는 DB라고 하기 좀 그렇지만 일단 넣어봤다.. 헿.

아무튼, 직접 구축하기도 했고 가장 중점적으로 생각했던 직각 교차로 DB는 GIS 관련 프리웨어인 Q-GIS 프로그램으로 진출입로, 골목길, 인구 밀집지역, 자전거 도로 근방 등을 위주로 국내 지도 엔진에서 제공하는 로드뷰, 위성사진, 수치지도, 지적도를 보며 하나하나 직접 찍었다.. 헬 노가다..

나머지 DB는 사실, 국내 주요 기관에서 제공하는 경위도 좌표 DB를 그대로 활용했다. (정보 공개 3.0 참 좋다.) 위에서 잠깐 언급한, Q-GIS를 비롯해, 개발 환경에 대해 또 잠깐 보고 가자. 개발 환경 빨간 줄로 밑 줄이 그어진 친구들이 있는데, 파워포인트에 작성한 내용을 그대로 캡처해서 그렇다.. 별 다른 특별한 의미는 없다. 귀차니즘의 폐해 무튼간에 굉장히 뭐가 많이 쓰였다. 각각의 역할?에 대해선 기능 설명할 때 함께 살펴 보는 걸로~

이렇게 안전모 프로젝트에 대해 간단하게 프롤로그를 구성해보았다. 프롤로그 정리만으로도 힘이 드는 것을 알 수 있다. 역시 문서 정리가 제일 힘듦을 새삼 느낀다.

프로젝트는 약 6개월간 진행 되었는데, 다음 포스팅에서 부턴 6개월 간의 실제 개발 과정에 대해서 살펴 보는 걸로~

  • 오타나 잘못된 부분을 지적 해주시면 감사히 생각하고 수정토록 하겠습니다 :)