주소 인식을 위한 삽질의 기록

Kyoungwon Lee
Jul 16 · 6 min read

당신의 안전을 위해서라면 뭐든지 할 거예요. 그게 삽질이라도…

Image for post
Image for post

당근마켓에서는 왜 주소를 인식해야 하나요?

당근마켓은 중고거래에서 있을 수 있는 사기 등의 범죄를 예방하기 위해 다양한 노력을 하고 있어요. 사기꾼을 실시간으로 제재하기도 하고, 당근마켓 채팅 내에 다양한 안내 및 경고 메시지들을 통해 사용자에게 알려주기도 해요.

그러면 이제 주소를 인식해볼까요?

정규식을 활용해 첫 시도를 해봤어요. 사용자가 확실히 주소를 입력한 경우에 도로명 주소를 확인하는 정규식은 다른 서비스의 테크 블로그들에서 찾아볼 수 있었어요. 하지만 저희는 채팅 내의 다양한 텍스트들 사이에서 주소를 찾아야 했기 때문에 그대로 사용하기는 어려웠어요. 당근마켓의 사용자들은 내 근처에서 거래하기 때문에 시/도 레벨의 주소보다는 읍/면/동/리나 도로명 주소를 직접 주고받는 경우가 많고 101동 101호와 같이 아파트 동호수만도 주고받는 경우가 많아요. 그래서 정규식을 당근마켓에 상황에 맞게 작성해보았어요.

/(([가-힣A-Za-z·\d~\-\.]{2,}(로|길).[\d]+)|([가-힣A-Za-z·\d~\-\.]+(읍|동)\s)[\d]+)/

이 정규식은 “디지털로30길 28” 과 같은 도로명 주소나 “구로동 222–12” 와 같은 지번 주소를 인식하기 위한 것이에요. 아파트 등의 “101동 101(호)”도 부분적으로 인식할 수 있어요.

결론적으로 의도했던 텍스트에 대해서는 안내 메시지가 잘 노출 됐지만 의도하지 않은 텍스트에도 메시지가 노출되는 문제가 발생했어요. 예를 들면 이런 예상치 못한 텍스트들이요. 😢

  • 오픈기념으로 1
  • 말씀드린대로 12
  • 종류별로 15
  • 빳데리 2
  • 허리 28
  • 가로90cm세로40

의도치 않은 데이터를 제외한 진짜 주소 검증하기

첫번째 시도로 잘못된 케이스의 안내 메시지가 일부 사용자에게 발송되었어요. 똑똑하지 못했던 안내 메시지 발송 플래그를 끄고, 문제를 해결하기 위해 정규식으로 검출된 텍스트에 대한 검증 단계를 추가했어요.

이미 당근마켓 지역 데이터베이스에 실제로 쓰이고 있는 법정동/행정동 정보가 있었기 때문에 이 정보를 조회해서 읍/면/동/리 등의 텍스트가 실제로 존재하는지 판단하도록 개선했어요. 아파트 등의 동호수는 법정동/행정동으로만 검증하면 없는 정보가 되기 때문에 이에 대한 조건을 먼저 체크하도록 대응했어요.

데이터 검증 단계에 있어서 가장 큰 문제는 도로명 주소였어요. 우선 이 데이터를 내부적으로 가지고 있지도 특별히 눈에 띄는 오픈 API도 존재하지 않았어요. 정부 데이터는 도로명 주소 DB를 제공하는 것만 찾을 수 있었어요. 그러던 중 API 형태는 아니었지만 도로명주소 라는 정부 사이트에서 도로명 정보 조회 메뉴를 찾을 수 있었어요.

지역을 선택하면 해당 지역의 도로명 주소 리스트를 보여주고 엑셀 파일로 다운로드 받을 수 있는데 조회된 도로명 주소 리스트가 10,000건이 넘는 경우에는 엑셀 파일로 다운로드받을 수 없어서 일부 광역시는 한 번에 받을 수 있었지만 서울이나 도 단위 지역은 시군구를 하나하나 선택해서 다운로드하고 다시 데이터를 하나로 합치는 고통의 반복작업을 하게 됩니다. 개발자로서 이 과정을 자동화할까 하고 잠시 고민하긴 했지만, 사용자에게 빨리 안내하고 싶어 우선 적용해보고 차츰 개선해보기로 결정을 내렸어요.

똑똑한 안내 메시지 보내기

다운로드받은 데이터를 내부 Google SpreadSheet에 옮겨 중복을 제거하고나니 그 이후 작업은 훨씬 수월했어요. CSV 파일로 다운로드 받아서 스크립트로 필요한 부분만 골라 내부 저장소에 저장하는 방식으로 검증 데이터를 저장했어요. 데이터 저장은 Redis를 선택했는데 Set을 이용해서 주어진 도로명이 존재하는지의 여부만 쉽게 파악하기 위함이고 전체 데이터의 양이 적지 않기 때문에 시/도 단위로 데이터를 분할에서 저장했어요.

그 결과 일반적인 주소 형태를 모두 잘 인식할 뿐 아니라 정규식으로 뽑힌 주소가 아닌 텍스트도 잘 회피할 수 있었어요.

Image for post
Image for post

새로운 주소가 생겨도 인식할 수 있게 자동화하기

도로명 주소는 새롭게 추가되기도 한다고 해요. 주소 인식 프로토타입은 고통의 반복 작업으로 결과를 얻었지만, 앞으로의 유지보수를 위해 자동화를 하고 싶어졌어요. 자동화 고민을 하며 정신을 차리고 도로명주소 사이트를 다시 살펴보니 아까는 보이지 않던 개발자센터를 발견했어요. 도로명 주소는 빠르게 대량으로 변화하는 데이터가 아니기 때문에 오픈API를 활용하여 일정 주기로 업데이트 할 수 있을 거라 기대했어요. 하지만 오픈API의 경우 커머스 서비스 등의 주소 입력을 위한 주소 검색에 가까워 기존 방식을 자동화하거나 도로명 고시 정보를 매일 체크해서 데이터를 최신으로 유지하는 것이 낫다는 판단을 내렸어요.

아직 자동화 개발을 완성하지는 않았지만 아래와 같이 동작할 것 같아요.

  • 일정 주기로 도로명 주소 데이터를 동기화하는 Job을 실행하기
  • 고시 정보나 도로명 정보 페이지를 통해 주기적으로 엑셀을 다운로드 하기
  • 엑셀 데이터를 내부 저장소에 반영하기

아직도 더 개선할 것들이 남아있어요.

  • 띄어쓰기를 제대로 하지 않은 주소 텍스트에 대한 처리 (ex. “구로구디지털로30길28”)
  • 동호수가 숫자가 아닌 문자열인 경우에 대한 처리 (ex. A동101호)
  • 사무실이나 주택 등에 대한 다양한 주소 처리 (ex. 건물 이름과 층수로 끝나는 주소 또는 다세대 주택의 주소 형식 등 — 마리오타워 609호)
Image for post
Image for post

당근마켓 서비스 팀은 당근마켓 사용자를 안전하게 보호하고 이웃과의 따뜻한 거래를 지원하기 위해 다양한 노력을 하고 있어요(다양한 노력이 궁금하다면?). 저희와 함께 당근마켓을 더 좋은 서비스로 만들고 싶은 분은 채용 공고를 확인해주세요.

당근마켓 팀블로그

당근마켓은 동네 이웃 간의 연결을 도와 따뜻하고 활발한 교류가 있는 지역 사회를 꿈꾸고 있어요.

Kyoungwon Lee

Written by

Software engineer @당근마켓 — Write the code, change the world.

당근마켓 팀블로그

당근마켓은 동네 이웃 간의 연결을 도와 따뜻하고 활발한 교류가 있는 지역 사회를 꿈꾸고 있어요.

Kyoungwon Lee

Written by

Software engineer @당근마켓 — Write the code, change the world.

당근마켓 팀블로그

당근마켓은 동네 이웃 간의 연결을 도와 따뜻하고 활발한 교류가 있는 지역 사회를 꿈꾸고 있어요.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store