지하철 역을 오가다 보면 잘 알려지지 않은 공간이 눈에 들어왔다. 갤러리, 휴게 공간, 공연 무대. 매일 지나치면서도 모르는 공간이 많았다. 마침 철도산업정보센터에서 주최한 “역 편의정보 공공데이터 활용” 대회를 발견했다. 약 3주간 진행되는 해커톤이었다. 팀원 두 명과 함께 팀리드로 참가했다.

서비스

숨겨진 휴식공간은 지하철 역의 잘 알려지지 않은 휴식 공간을 알려주는 Android 앱이다.

네 가지 기능을 담았다. 역별 숨은 휴식 공간 정보(위치·사진·평점), 역 안에서 열리는 공연 일정, 같은 역 이용자들의 오픈채팅방, 그리고 화장실·수유실·문화시설 같은 일반 편의시설이다.

마지막 항목은 공공데이터에 이미 들어 있던 자료를 한 화면으로 정리했고, 앞 세 항목은 자체 콘텐츠로 만들었다. 숨은 휴식 공간은 사용자가 평점을 남길 수 있어 추천 흐름이 자연스럽게 만들어졌다.

아키텍처

3주 안에 끝내려면 검증된 스택으로 가야 했다. Android 앱 + 단일 API 서버 + RDB 의 단순 구조로 설계했다.

flowchart TD
    App["Android App\n(Java)"] --> API["API Server\n(PHP + Apache)"]
    API --> DB[(MariaDB)]
    API -. FCM .-> App
    App --> Maps["Google Maps API"]
    App --> PublicData["철도산업정보센터\n공공데이터"]

서버는 PHP 와 Apache 로 구성했다. 이전에 다뤄본 스택이라 짧은 기간에 안정적으로 운영할 수 있는 점이 컸다. MVC 와 Singleton 으로 코드 구조를 정리하고, MariaDB 에 역과 휴식 공간 데이터를 적재했다.

앱은 Java 로 개발했다. Google Maps API 로 역 위치를 표시하고, Glide 로 이미지를 캐싱했다. 작은 인터랙션은 Lottie 애니메이션으로 처리했다. 신규 휴식 공간이나 공연 알림은 FCM 으로 전달했다.

서버와 안드로이드 앱 양쪽을 맡았다. 팀원 두 명과 역할을 나눠 데이터 적재와 클라이언트 화면을 병행했다.

핵심 구현

공공데이터 활용

대회의 핵심은 공공데이터를 어떻게 가공해 사용자에게 의미 있게 보여주는가였다. 철도산업정보센터에서 제공하는 역 편의정보 데이터를 받아 가공한 뒤 자체 DB 에 적재했다. 원본 데이터 구조가 화면에 그대로 매핑되지 않아 중간 변환 단계를 두었고, 공연이나 채팅 같은 자체 콘텐츠는 별도 테이블로 두었다.

라이브러리 선택

3주의 짧은 일정에는 라이브러리 선택이 곧 일정 관리였다. Google Maps 로 위치 UI 를 통째로 가져왔고, Glide 로 이미지 처리 코드를 줄였다. 알림은 FCM 으로 서버에서 직접 발송할 수 있게 했다. 손으로 만들었을 때 빠지기 쉬운 자리를 라이브러리로 덮어 두니 핵심 기능에 시간을 더 쓸 수 있었다.

회고

입선했다. 짧은 기간 안에 공공데이터를 가공하고 자체 콘텐츠를 더한 점이 통한 결과라고 봤다.

팀리드로서 일정과 범위를 정하는 일이 가장 큰 부담이었다. 기능을 더 넣고 싶은 욕심은 컸지만, 3주 안에 시연 가능한 수준까지 가려면 어느 시점부터는 멈춰야 했다. 핵심 네 기능을 정한 뒤 그 너머로 늘리지 않은 결정이 마감에 닿는 데 가장 크게 작용했다고 본다.

공공데이터를 직접 다뤄본 첫 경험이기도 했다. 외부 데이터를 그대로 노출하지 않고 우리 도메인에 맞게 재해석하는 과정이 의외로 많은 시간을 잡아먹었다. 다음에 비슷한 결의 데이터를 만난다면, 변환 레이어부터 잡는 순서로 가보려 한다.