
구름톤 트레이닝 수료 후 많이 지친 상태였다. 쉬면서 포트폴리오와 이력서를 새로 만들면서 보충하면 좋을 부분을 되짚어 보았다. 포트폴리오가 여러모로 아쉬웠다.
구름톤에서 진행했던 2개의 프로젝트를 통해 많이 성장했지만, 좀 더 내가 하고싶었던 주제로 진행해보고 싶었다. 그러던 차에, 공모전이 시작됐다.
작년 수상작은 정말 쟁쟁했다. 거의 모든 작품에 AI가 들어갔다. 나는 AI는 할 줄 모르는데.. 하지만 참여에 의의를 두기로 했다.
나는 잿밥에도 관심이 많은 편인데, SW 개발 공모전은 6개월동안 배우면 좋을 강의도 많이 제공했다. 간단한 언어부터 AI, 블록체인, 자율주행까지 정말 다양한 강의를 줬는데, 일정이 바빠 아쉽게도 아직 듣지는 못했다.
구름톤에서 만났던 인원과 충원을 통해 새로운 팀이 빌딩 되었다. 총 4명의 소규모 팀이었다. FE 2명과 BE 2명이었다.

SW 개발 공모전은 참여 주제로 유형을 나눴다. 기업과제, 사회문제, 지속발전과제였는데 우리는 이 중, 사회문제 유형을 선택했다.
사회문제는 다시 환경, 생활, 안전, 교육 유형으로 나뉘고 우리는 생활부문으로 응시했다.
사회적 약자를 위한 여러 주제가 오고 갔다. 가장 유력했던 두 가지 주제는 노인을 위한 멘토링과 이동 약자를 위한 지하철 서비스였다. 긴 토의 끝에, 우리는 2번 통합 지하철 서비스를 선택했다.
- 노인 멘토링
- 약 10년간 편의점 아르바이트를 하며 많은 손님들께서 휴대폰 다루는 법을 물어보셨던 기억을 바탕으로 고안한 주제.
- 간단한 웹 서비스 가입, 쇼핑, 포인트 바코드 찾기 등이 주 기능
- 휴대폰이 익숙한 1030세대가 멘토로 활동하며 포인트 적립을 하는 서비스
- 이동 약자를 위한 서비스
- 오프라인 교육을 듣던 당시, 발목 인대가 늘어나 불편했던 경험을 바탕으로 고안한 주제.
- 해당 역 어느 출구에 엘리베이터나 에스컬레이터 등 편의시설 제공이 메인기능
- 호선 별 채팅 서비스로 어느 열차가 지연되거나 문제가 생기는 것을 실시간 공유한다.
노선도를 바탕으로 할 것인지, 지도 기반으로 할 것인지에 대한 이야기도 오고 갔다.
이미 국내에는 많은 지하철 서비스가 웹/앱으로 존재하며 비교하고 토론한 결과, 우리는 지도를 기반으로 한 서비스를 제공하기로 했다. 노선도의 경우 한 눈에 알아보기 쉽지만 가시성이 떨어지기 때문이다.
지도는 네이버와 카카오 둘 중 카카오 지도를 선택했다. Google Maps의 경우 정확도가 떨어져 후보에 들지 못했고, 네이버 지도를 서비스하고 싶었으나 한 번에 띄울 수 있는 마커가 5개밖에 되지 않았다. 좌표 역시 중심 좌표 vs 양 모서리 좌표 중, 중심 좌표를 보내는 것으로 기획을 잡았다.
채팅의 경우 WebSocket과 Kafka 방식이 후보에 올랐다. 채팅은 이미 두 번 개발한 경험이 있었으므로 담당 FE의 선택에 맡겼는데, WebSocket을 선택해 진행하기로 했다.
전국 지하철역은 총 1083개였다. 총 5지역(수도권, 부산, 대전, 대구, 광주) 에 지하철이 운행하고 있었으며, 모든 역의 편의시설을 미리 DB에 넣어 제공하는 것을 우선순위로 잡았다.
해당 프로젝트의 경우, 얼마나 데이터를 잘 가공하느냐가 관건이었다. 지하철에서 제공하는 서비스는 생각보다 훨씬 더 다양했다. 가능한 모든 편의시설을 제공하고 싶었지만 시간이 제한적이므로 우선순위를 정했다.

- 지하철 기본 정보, 엘리베이터, 에스커레이터, 휠체어 리프트
- 화장실, 장애인 화장실, 수유실, 유실물 센터
- 역 내 편의점, 제세동기, 짐 보관소 등
또한, 이 번에는 회원 기능을 축소했다. 메인 기능은 비회원도 접근 가능하되,
로그인을 할 경우 채팅에 참여 가능하게끔 기획했다. 해당 서비스를 급하게 이용할 경우를 대비해서였다.

5일간 기획 및 UI 작업을 끝낸 뒤, 본격적인 DB 작업이 시작됐다. 지하철 기본 정보를 시작으로 총 13개의 sheet로 나눠 작업하기 시작했다.
가장 시행착오가 많고 정성이 드는 작업이었다. 전국엔 총 1083개의 역이 존재한다.
(현재 운행중지된 자기부상선 제외) 최근 어떤 역들은 민간업체에게 병기명을 판매해 부가적으로 작성이 되기도 했는데, 논의 끝에 이수(총신대입구)역을 제외한 모든 역의 부가 이름은 제외하기로 결정했다. 검색 시 오류를 최소화하기 위해서였다.
ex. 성수역(CJ올리브영), 을지로3가(신한카드), 논현(강남브랜드안과) 등

😃 PyCharm으로 돌려서 나온 위, 경도의 결과

😃 눈을 의심하게 되는 휠체어 리프트의 설명

😃 정확도를 높이기 위해 따로 체크했던 정보

가장 메인이 되는 엘리베이터, 에스컬레이터의 경우 naver, kakao 맵도 정확하지는 않았다. 내부에 있는 엘리베이터가 마치 외부에 존재하는 것 처럼 표시되어 있기도 했기 때문이다. 해당 시트를 맡은 팀원은 가장 꼼꼼했는데, 모든 지도의 로드뷰, 역 구조도에 이어 항공뷰까지 보며 완벽하게 설정할 수 있었다. 정말 고맙다. 그래도 위치를 알 수 없는건 해당 역에 직접 전화로 문의를 드려 정보를 파악했다.
휠체어 리프트의 경우 한계중량은 kg으로 통일 되어있었던 반면 길이와 폭은 단위가 cm와 mm로 섞여있었고 레일포털, 코레일, 서울메트로, 각종 역에 전화로 문의를 드렸려 여쭤봤지만 정확한 단위를 알 수 없었다.
관리자분마다 길이에 대한 의견이 이동 길이, 혹은 리프트의 길이라는 의견이 분분했기 때문이다. 아쉽게도 해당 데이터는 따로 수정하지 않고 그대로 기입했다. 그럼에도 최대한 자세히 알려주셨던 모든 관계자분들께 다시 한 번 감사하다.
제세동기, 수유실, 전동 휠체어 장비, 고객센터 등의 경우는 유, 무가 가장 중요하다 판단되어 정확한 위, 경도를 설정하지 않고 상세 설명까지 작업을 완료했다.
이렇게 열심히 한 작업 중, 어떤 시트들은 통째로 재재재작업을 해야 하기도 했다. 위, 경도가 밀려 작업 되기도 했고, 주소를 도로명 주소로 변경해야 하기도 했기 때문이다.
총 10,350건이지만 실제로는 수 번에 걸쳐 재가공하고, 또 재가공했다. 그렇게 만족스런 결과물이 나왔다.
지하철 기본 정보, 엘리베이터, 에스컬레이터, 화장실, 장애인 화장실, 휠체어 리프트, 전동 휠체어 충전 설비, ATM, 제세동기, 수유실, 고객센터를 포함한 데이터 전처리 과정을 완료했으며, 추가적으로 지하철 기본 정보에 들어갔던 시간표 테이블을 따로 빼 상, 하행선 시간표를 보다 정확하게 작업 중에 있다.
거의 모든 작업을 밤을 새야 했다. 8월엔 갑자기 수도권 8호선에 역이 신설되기도 했다. 반가운 소식이지만 우리는 조금 슬펐다..🙃 작업을 할 땐 웃기게도 google sheet에 떠있는 팀원들의 프로필을 보며 위로, 응원이 됐다. 노동요를 들으며 작업했는데 왜 노동요라 부르는지 알 수 있었다. 지금은 즐거운 추억이 됐다!
정보 제공이 메인이고 가장 어려울 것이라 생각했으나, 데이터 처리를 하면 할 수록 추가 기능에 대한 필요성을 느꼈다. 조회만 하면 끝이기 때문이었다. 또한 지도 기반 서비스이기 때문에 FE의 업무 가중성이 치우쳐지지 않게끔 하기 위해 열심히 찾았다.
여러 의견이 나왔다. 인기 검색어, 길 찾기(도보, 자전거, 킥보드), 역 내 길 찾기(편의 시설까지 or 환승 노선 제공), 역간 혼잡도 등.. 모두 매력적인 기능들이었으나 현실적인 어려움에 부딪혔다.
인기 검색어의 경우엔 필요성을 느끼지 못했다. 가장 해보고 싶었던 역 내 길 찾기는 지하에서 GPS를 정확하게 가져오지 못하는 한계가 있었다.
그렇게 낙찰된 추가 기능은 길 찾기(도보 및 자전거) / 역 정차 시 해당 역 조회 /
지하철 역간 경로 안내가 되었다.
길 찾기는 도보, 자전거, 킥보드 3가지로 나눌 수 있었으나 공공데이터포털에서 제공하는 실시간 킥보드 API의 경우, 오로지 세종시만 조회가 가능했다. 아쉽게도 킥보드를 제외하게 되었다.
추가 기능의 경우 여러 외부 API를 사용하게 되었는데, 길 찾기(도보)의 경우 Sk API를 사용하였으며, 역 간 경로 안내의 경우 Odsay API를 활용하게 되었다.
실시간 자전거 API를 활용하게 되었으나, 서울(경기도X)과 대전만 이 API가 존재해 아쉬움이 남는다. 다른 지역들도 공공자전거가 있는데, 얼른 API가 나왔으면 한다.


- 🚇 [공모전] 2024 공개 SW 개발자대회 후기 [이번역] 회고_02
- 🚇 NoneStep GitHub : https://github.com/None-Step/None-Step-BE.git