story · how it was built
설명
무엇을 (문제·대상)
부산에 오는 외국인 방문객의 상당수는 K-콘텐츠에서 본 「장면」 때문에 옵니다. 그런데 기존 관광앱은 전부 장소 이름을 알아야 검색이 시작됩니다. 이들이 가진 건 이름이 아니라 스크린샷 한 장입니다. 그래서 실제로는 커뮤니티에 「이 사진 어디예요?」를 올리고 며칠을 기다립니다.
스냅부산은 검색의 방향을 뒤집습니다. 이름 → 장소가 아니라, 이미지 → 장소입니다.
주요 기능
- 사진 1장 모드 — 드라마 캡처든 직접 찍은 사진이든 올리면 후보를 대조해 장소를 확정합니다. 「감천문화마을 · 95% 일치」처럼 확신도를 함께 냅니다.
- 시각 근거 제시 — 왜 그 장소로 봤는지를 설명합니다. 「층층이 이어진 경사, 빽빽한 파스텔색 집, 파란 지붕선이 마을의 특징과 일치합니다」 같은 식으로, 사진의 어느 단서를 봤는지 말합니다.
- 모를 때는 모른다 — 확신이 낮으면 후보를 억지로 늘리지 않고 솔직하게 알려 줍니다.
- 길찾기 — 내 위치에서 거기까지 카카오 대중교통·자동차 경로로 잇습니다.
- 반나절 코스 — 반경 2km 안의 검증된 장소로 먹거리·카페를 묶어 제안하고, 고르면 그대로 일정이 됩니다.
- 여러 장 모드 — 사진을 여러 장 올리면 하루 일정으로 편성합니다.
- 6개 국어 — 결과 카드와 안내가 다국어로 나옵니다.
어떻게 만들었는가 (과정·도구 활용)
가입을 요구하지 않고, 올린 이미지를 저장하지 않습니다. 스크린샷 한 장을 올리는 데 계정을 만들어야 한다면 그 순간 대부분 떠납니다.
가장 신경 쓴 규칙은 「확정되지 않은 것을 확정된 것처럼 만들지 않는다」입니다. 판별에 실패해도 추천으로 일정을 만들 수 있지만, 그때 「내 사진의 장소가 일정에 있다」고 읽히는 문구는 쓰지 않습니다.
배포 후 회귀 검증을 스크립트로 묶어 두었습니다. 예시 사진 3종, 데모 버튼 4개, 4개 로케일 판별 정확도 매트릭스, 장애 경로에서 화면이 정직한지, 같은 장소를 다시 넣어도 0km 유령 이동이 안 생기는지를 실제 브라우저로 확인합니다.
한계·다음
- 판별 대상은 부산입니다. 다른 지역 사진은 모른다고 답합니다.
- 비전 판별은 각도·시간대·크롭에 민감합니다. 그래서 확신이 낮으면 후보를 늘리기보다 모른다고 답하는 쪽을 택했습니다.
journey · lessons
과정 · 배운 점
본문 = 무엇·기능·사용법. 여기 = 시간순 여정 + 다음에 남긴 교훈.
서버의 용량 상한보다 플랫폼의 요청 본문 한계가 낮으면, 우리 코드가 실행되기도 전에 요청이 잘립니다. 서버는 8MB 를 허용하는데 4.39MB 요청이 413으로 잘렸고, 배치는 1.47MB 짜리 흔한 폰 사진 4장(합계 5.88MB)에서 일정 만들기 자체가 실패했습니다. 그것도 우리 JSON 이 아니라 플랫폼이 뱉는 플레인 텍스트로요.
고친 방식은 클라이언트가 업로드 전에 예산 안으로 줄이는 것이었는데, 이건 클라이언트 로직이라 curl 같은 raw HTTP 테스트로는 검증이 되지 않습니다. 원본을 그대로 보내면 재현 조건 자체가 달라지기 때문입니다. 그래서 실제 브라우저로 파일을 올리고, 네트워크 응답에서 플랫폼의 413 플레인 텍스트를 직접 감시하는 검증 스크립트를 따로 만들었습니다.
「고쳤다」는 커밋 메시지는 증거가 아닙니다. 무엇으로 재는지를 먼저 정해야 합니다.
피드백 원함 · 개선 제안 · 질문 · 아이디어