같은 주소가 다섯 줄 나온 이유

📝 한줄 요약

검색 결과가 화면에서 중복돼 보이는 건 데이터가 아니라 화면 글자를 만드는 방식 때문일 수 있다. 그래서 중복 제거는 원본 기준이 아니라 사용자 눈에 보이는 글자 기준으로 해야 한다.

👥 이런 분께 추천

  • 외부 API 검색 결과를 화면에 뿌렸더니 같은 항목이 반복돼서 당황한 경우

  • 버그의 원인을 “그냥 API가 이상한가 보다”로 넘기지 않고 끝까지 추적하는 과정이 궁금한 경우

  • 개별 버그 수정을 재사용 가능한 규칙으로 바꾸는 방법이 궁금한 경우


증상

주소 칸에 “350 new york”을 입력하자 이렇게 나왔습니다:

똑같은 주소가 다섯 줄. 사용자 눈에는 명백한 고장입니다. 뭘 골라야 할지도 알 수 없고요.


원인 추적

다섯 스텝으로 따라가면 이렇습니다.

스텝 1: 주소 검색은 Photon API를 쓰고, Photon은 OpenStreetMap(OSM)이라는 지도 데이터를 검색합니다.

스텝 2: OSM에서는 한 주소 위에 여러 개의 데이터가 따로 등록될 수 있습니다. 같은 번지에 건물 자체, 그 안의 가게, 사무실, 출입구가 각각 별개의 데이터로 존재합니다. 350 5th Avenue는 엠파이어 스테이트 빌딩이라 특히 많습니다.

스텝 3: 검색하면 Photon은 이 데이터들을 각각 별개의 결과로 돌려줍니다. 원본에서는 서로 다른 것이 맞습니다. 좌표도 조금씩 다릅니다.

스텝 4: 그런데 우리 화면의 한 줄은 원본의 이름이 아니라 번지 + 거리 + 도시 + 우편번호 + 국가를 조립해서 만듭니다. 서로 다른 데이터라도 주소가 같으면 조립한 글자가 똑같아집니다.

스텝 5: 결과적으로 원본에서는 5개였던 것이 화면에서는 구분 불가능한 같은 줄 5개가 됩니다.

즉, API도 데이터도 고장이 아니었습니다. 원본에서는 다른 항목인 것이 우리 화면의 글자 만드는 방식 때문에 같아 보인 것뿐입니다.


해결

화면에 보이는 글자가 같으면 사용자에게는 같은 것입니다. 그래서 두 가지를 했습니다.

1. 조립한 글자(label) 기준으로 중복 제거

결과를 화면 글자로 바꾼다
  → 이미 나온 글자면 버린다
  → 처음 나온 글자만 남긴다

2. 원본을 넉넉히 받아서 표시 개수를 채운다

중복을 걸러내면 5개가 안 남을 수 있습니다. 그래서 API에는 15개를 요청하고, 걸러낸 뒤 5개를 표시합니다.

같은 검색어로 다시 확인하니, 이번에는 서로 다른 주소 4개가 나왔습니다


왜 규칙으로 남겼나

이건 Photon만의 문제가 아닙니다. 어떤 데이터든 “원본에서는 다른 항목인데 화면 글자로는 같아지는” 일이 생길 수 있습니다. 나중에 만들 사건번호 검색에서 같은 사건의 여러 기록이 나올 수도 있고요.

그래서 DEV.md 규칙 14번으로 일반화했습니다: 검색 결과를 화면에 뿌리기 전에, 보이는 글자 기준 중복 제거를 항상 거친다.


배운 점

버그의 위치와 원인의 위치는 다를 수 있다

증상은 화면(중복 노출)에 있었지만, 원인은 지도 데이터의 구조(한 주소에 여러 데이터)와 우리의 글자 조립 방식이 만나는 지점에 있었습니다. “API가 이상하네”에서 멈췄다면 엉뚱한 수리를 했을 겁니다.

중복의 기준은 시스템이 아니라 사용자다

원본 기준으로는 중복이 아니었습니다. 하지만 사용자가 구분할 수 없다면 그건 중복입니다. 판단 기준을 데이터가 아니라 사용자 눈에 두니 해법이 명확해졌습니다.

개별 수정을 규칙으로 바꾸면 다음 화면이 빨라진다

주소 필드 하나 고치고 끝낼 수도 있었지만, 원인을 문서로 남기고 규칙으로 일반화했으니 사건번호 검색을 만들 때는 처음부터 중복 제거를 넣게 됩니다.


솔직한 소감

같은 줄이 다섯 번 나온 화면을 처음 봤을 때는 단순히 “API가 이상한가”라고 생각했습니다. 그런데 원인을 따라가 보니 지도 데이터가 세상을 어떻게 표현하는지(한 건물에도 여러 데이터가 있다)까지 내려가야 했습니다. 버그 하나가 데이터 구조 공부가 된 하루였습니다.

1
1개의 답글
지피터스 뉴스레터

이번 주 AI, 딱 쓸 것만

매주 월요일 오후,
읽고 바로 써먹을 AI 소식만