지금 그 동네, 얼마나 붐빌까? — NEMONE PACE에 실시간 유동인구 정보를 붙이기까지
왜 만들었나
PACE(지금여기)는 "지금 이 순간 가볼 만한 곳"을 추천하는 서비스입니다. 그런데 정작 "지금 거기 사람 많아요?"라는 가장 기본적인 질문에는 답을 못 하고 있었습니다. 팝업스토어는 추천해주면서, 막상 가보면 줄이 얼마나 긴지 몰라 헛걸음하는 경우가 생길 수 있었던 거죠.
마침 서울시가 실시간 도시데이터(생활인구·혼잡도) API를 공개하고 있었습니다. 이걸 붙이면 이 공백을 메울 수 있겠다고 판단해, 성수·홍대·강남·강북 4개 권역에 실시간 혼잡도 카드를 붙이는 작업을 시작했습니다.
1. "이름이 다르다" — 계획대로 되는 게 없었다
가장 먼저 확인한 건 두 가지였습니다. API 키가 있는가, 그리고 원하는 지점의 데이터를 정말 받아올 수 있는가. 다행히 기존에 발급받아둔 키를 그대로 쓸 수 있었습니다.
문제는 그다음이었습니다. 서울시 API는 지점을 정확한 등록 명칭으로만 조회할 수 있는데, 우리가 상식적으로 예상한 이름과 실제 등록명이 계속 어긋났습니다.
| 우리가 예상한 이름 | 실제 정답 |
|---|---|
| 홍대관광특구 | 홍대 관광특구 (공백 포함) |
| 이태원 | 이태원 관광특구 |
| 성수카페거리 | 성수카페거리 (예상대로 맞음) |
| 강남역 | 강남역 (예상대로 맞음) |
이런 어긋남은 문서만 봐서는 걸러지지 않습니다. 그래서 후보 이름을 여러 개 만들어 하나씩 실제로 API를 호출해보며 정답을 찾았습니다. "될 것 같다"가 아니라 "실제로 해보고 확인한다" — 이 원칙을 이번 작업 내내 지켰습니다.
2. 로컬 PC에서 돌리다가, 서버로 옮기다
처음엔 개발자 로컬 컴퓨터에서 1시간마다 데이터를 가져오도록 구현했습니다. 빠르게 검증하기엔 편했지만, 곧 명확한 문제가 보였습니다.
"실시간" 데이터인데, 내 노트북이 꺼지면 업데이트가 멈춘다.
사용자에게 보여주는 정보가 로컬 PC의 전원 상태에 좌우되는 건 서비스로서 말이 안 되는 구조였습니다. 그래서 폴링 작업을 서버 자체의 백그라운드 스케줄러로 완전히 옮겼습니다. 이제 서버가 살아있는 한 데이터는 끊기지 않습니다.
수집 주기는 10분으로 정했습니다. 서울시 원본 데이터 자체가 내부적으로 5분 안팎으로 갱신되기 때문에, 그보다 촘촘하게 조회해봐야 의미는 없고 서버 부담만 늘어난다는 계산이었습니다.
3. 화면에 뭘, 어떻게 보여줄까 — 가장 오래 걸린 부분
데이터를 받아오는 것보다, 좁은 모바일 화면에 무엇을 얼마나 보여줄지가 훨씬 어려운 문제였습니다.
- 처음엔 혼잡도·인구수·날씨·연령대·성별을 전부 욱여넣었더니, 정작 가장 중요한 "혼잡도"가 화면 밖으로 잘려나가는 문제가 반복됐습니다.
- 그래서 우선순위를 다시 세웠습니다. 혼잡도와 인구수가 최우선, 나머지(연령대·성별·날씨)는 보조 정보로 격을 낮췄습니다.
- 성별 표기도 "남성 55% / 여성 45%"를 둘 다 보여주면 줄이 밀려서, 우세한 쪽 하나만 보여주는 식으로 압축했습니다.
- 메인 화면 상단에는 여러 지역 정보를 순환해서 보여주는 "전광판" 티커를 만들었습니다. 공항 게시판 느낌을 살리려고 split-flap 애니메이션 라이브러리까지 붙여봤는데, 실제 기기에서 확인해보니 레이아웃이 깨졌습니다. 미련 없이 기존 방식으로 롤백했습니다. 새 기술을 써보는 것보다 "실제로 잘 보이는 것"이 우선이라는 판단이었습니다.
이 과정에서 실제 모바일 화면으로 계속 확인하며 수십 차례 미세 조정을 거쳤습니다. 코드가 동작하는 것과, 화면에서 깨지지 않고 예쁘게 보이는 것은 전혀 다른 문제였습니다.
4. 다국어 지원, 그리고 예상 못 한 버그 발견
혼잡도 기능을 한국어·영어·중국어·일본어 4개 언어로 대응하는 김에, 기존 서비스의 다국어 처리 상태도 다시 점검했습니다.
그 과정에서 이번 작업과는 무관해 보이는 오래된 버그를 하나 발견했습니다. 최근 새로 수집한 장소들은 이름이 일본어로도 이미 번역되어 저장되고 있었는데, 정작 화면에는 계속 한국어로만 표시되고 있었던 겁니다. 원인을 추적해보니:
- 장소 상세·목록을 조회하는 API가 애초에 일본어 번역 데이터를 응답에 담지 않고 있었고,
- 화면을 그리는 컴포넌트 여러 곳에서도 "영어면 영어로, 중국어면 중국어로" 분기 처리는 있는데 일본어 분기만 통째로 빠져 있었습니다.
번역 자체가 안 된 게 아니라, 이미 완성된 번역 데이터가 조회 API와 화면 표시 로직, 두 군데에서 그냥 버려지고 있었던 겁니다. 오늘 작업과는 별개의 문제였지만, 다국어 대응을 점검하는 김에 같이 찾아서 고쳤습니다.
5. 무엇이 완성됐나
- 성수 / 홍대 / 강남역 / 이태원 / 광화문, 5개 지점의 실시간 혼잡도·인구수 제공
- 지도 탭에서는 카드 형태로 자세히, 메인 화면에서는 전광판 형태로 요약해서 노출
- 강남·강북처럼 넓은 권역은 지점을 추가로 늘릴 수 있는 구조로 설계 (예: 강북에 광화문 추가 완료, 향후 확장 가능)
- 카드를 탭하면 해당 지역의 지도 화면으로 바로 이동
- 데이터는 서버에서 10분마다 자동 갱신, 4개 언어로 서비스
돌아보며
이번 기능에서 가장 크게 배운 건 "API 연동" 자체보다 검증하는 습관이었습니다. 지점 이름 하나도 문서를 믿지 않고 실제로 호출해서 확인했고, 로컬에서 잘 돈다고 안심하지 않고 서버 이전까지 마무리했고, UI도 코드가 아니라 실제 화면으로 계속 재확인했습니다. 새 기술(split-flap)을 붙였다가 실제로 안 맞으면 미련 없이 되돌린 것도 같은 맥락이었고요. 그 과정에서 뜻밖에 오래된 버그까지 잡을 수 있었던 건 덤이었습니다.
"실시간"이라는 단어를 쓰려면, 정말로 실시간이어야 한다 — 이번 작업 내내 되새긴 원칙입니다.
서울 나들이 굿즈 보러가기
이 링크는 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

COMMENTS
의견을 남기려면 로그인이 필요합니다.