요즘 시끄러운 나라 분위기에 시위가 자주 일어나고 있다.
사람이 몰리지 않는 곳에서 피해 없이 진행되면 좋겠지만, 유동 인구가 많은 곳에서 진행되기 마련이다.
그러던 중, 여자친구의 출퇴근길 불편한 점을 듣게 됐다.
시위로 인해 버스가 무정차하기도 하고, 교통이 혼잡해지며 출퇴근 시간이 들쭉날쭉한 것.
사전에 알고 있었다면?
다른 버스를 타러 가거나 미리 알고 보다 일찍 나오면 여유롭게 해결할 수 있다!
그럼, 어떻게 사전에 알 수 있을까?
사실 경찰청 사이트에 매일 다음 날 신고된 시위/집회 일정이 미리 올라온다.
게시글은 아래와 같이 PDF 파일로 제공된다.
그렇다면 매일,
는 너무 번거롭고, 매일 전날에 알려주는 것도 쉽지 않다.
개발자스럽게 자동화해보자! 싶어서 프로젝트를 시작했다.
프로세스는 간단하게 생각했다.
- PDF 자동 다운로드
- PDF에서 시위 데이터 추출
- 데이터를 가공하여 보여주기
간단하게는 이렇게 구성했지만, 사실 최종적인 그림은
그러나, 빠르게 만들어 배포하고 사용자들의 피드백을 받고 싶었다.
그래서 우선 예정된 시위 일정을 지도상에 표시하는 것부터 시작했다.
Python은 인턴 기간 동안 집중적으로 사용했기 때문에 활용이 익숙했다.
먼저, 경찰청 시위 게시판에서 최신 게시글을 찾아 PDF 첨부 파일을 자동으로 다운로드하는 Python 코드를 작성해보자.
여기까지는 간단했다.
이 과정에서 PDF 양식이 매일 일관되게 작성될 것이라고 가정하고,
정규식을 활용해 "시간", "장소", "예상 인원", "관할서", "지역" 정보를 추출했다.
위와 같이 추출한 데이터를 CSV 파일로 저장했다.
또한, 지도상에 위치를 표시하려면 위도와 경도 좌표가 필요했다.
이 과정에서 Google Maps API를 활용하였고
구글 API 키를 발급받아, 장소 이름을 기반으로 위도와 경도를 조회했다.
이 과정에서 몇 가지 난관이 있었다.
예를 들어 "구로구청"의 좌표를 조회하면, 구글맵이 이를 인식하지 못하는 경우가 있었다.
따라서 모든 장소 뒤에 '서울'을 붙여 "구로구청, 서울시"와 같은 형태로 검색했다.
그럼에도 불구하고 일부 장소는 검색되지 않았다.
결국 공식 문서를 참고한 결과,
Google Maps API의 'region' 항목을 'korea'로 설정하면 해당 지역을 우선적으로 검색한다는 점을 발견했다.
이를 적용한 후, 모든 좌표를 정상적으로 가져올 수 있었다.
API 응답 데이터는 아래와 같다.
많은 데이터 중 위도와 경도만 추출하여
기존 시위 데이터에 추가한 후, 프론트엔드로 전송하면 완료!
데이터 전송 시 JSON 형식의 API 응답으로 구성했다.
실제 응답 데이터는 아래와 같다.
이 데이터는 프론트엔드에서 받아, 지도에 시위 위치를 표시하는 데 활용했다.
경찰청 게시판에서 PDF로 제공되던 데이터를 가공하여, 사용자들이 쉽게 지도에서 시위 위치를 확인할 수 있도록 했다.
이 시위 일정은 매일 오후 7시에 자동으로 업데이트되도록 Python 스케줄링을 설정했다.
아직 추가할 기능과 개선할 부분이 많지만, 차근차근 보완해 나갈 예정이다.
편하게 방문해주세요!
PM2를 처음 사용해봤다.
인턴 기간 동안 서버 백그라운드 실행을 위해 nohup
을 간단히 사용한 경험이 있었지만,
PM2가 보다 간편하고 유용하다는 의견이 많아 직접 적용해보았다. 확실히 접근성이 높았다.
서버 유지비 절감이 필요하다.
운영 비용을 최소화할 수 있는 방법을 고민해야겠다.
백엔드 개발자라도 프론트엔드 언어를 알면 유용하다.
직접 프론트까지 구성해보니, 전체적인 서비스 구조를 이해하는 데 큰 도움이 됐다.
프론트엔드 지식이 있으면 더 좋은 경험을 제공할 수 있을 것 같다.
와 ^^ 정말 너무 멋진 서비스 같아요 ^^