아기 외출 장소 추천, 부적절한 장소 필터링 안 되는 문제 해결
아기 외출 장소 추천 시 인터넷 쇼핑몰, 폐점 장소 등이 노출되는 문제를 해결했습니다. 정밀한 카테고리 화이트리스트 조정으로 해결.
아기 외출 장소 추천 기능에서 부적절한 장소가 계속 노출되는 문제로 골치 아팠다. 아무리 필터링을 걸어도 인터넷 쇼핑몰이나 이미 문 닫은 곳이 떡하니 추천되는 통에 사용자 경험이 엉망이었다. 이 글에서 어떻게 이 문제를 해결했는지 기록해두려 한다.
시도와 함정
처음에는 단순하게 카테고리 세그먼트 필터링으로 해결될 줄 알았다. 인터넷 쇼핑몰, 무브랜드 마트, 폐점한 장소는 당연히 빼야 했고, 이름만으로는 노이즈가 될 수 있는 백화점 내 약국 같은 곳도 제외했다. 대신, 아기랑 가기 좋은 대형마트는 다시 추가했다.
그런데 이게 생각보다 복잡했다. 카테고리 필터링 로직을 아무리 바꿔봐도 자꾸 이상한 곳들이 섞여 나왔다. 예를 들어, 어떤 장소는 '쇼핑몰' 카테고리에 속하면서도 '대형마트'로도 분류되는 경우가 있었다. 이런 중복 분류나 예상치 못한 카테고리 매핑 때문에 필터링이 제대로 작동하지 않았다.
// 실제 필터링 로직의 일부 (가상)
{
"category": "shopping_mall",
"exclude_keywords": ["인터넷", "무브랜드", "폐점", "약국"],
"include_keywords": ["대형마트"]
}
위처럼 단순 키워드 매칭으로는 이런 복잡한 상황을 다 잡아내지 못했다. 3시간 넘게 코드를 들여다보고 로그를 분석했지만, 근본적인 해결책이 보이지 않았다.
원인
결론적으로, 카테고리 필터링 로직이 너무 단순했다. 단순히 특정 키워드를 포함하거나 제외하는 방식으로는 모든 예외 케이스를 처리하기 어려웠다. 특히, 장소 데이터의 카테고리 분류가 일관되지 않거나 여러 카테고리에 중복으로 속하는 경우, 단순 필터링으로는 부적절한 장소를 완벽하게 걸러낼 수 없었다.
해결
그래서 카테고리 화이트리스트를 훨씬 더 정밀하게 조정했다. 단순히 제외할 카테고리를 나열하는 것을 넘어, '반드시 포함해야 할' 카테고리와 '절대 포함하면 안 되는' 카테고리를 명확하게 구분했다.
# 실제 문제 해결 코드 (Python 예시, 실제 라이브러리 및 함수명 사용) from typing import List, Dict, Anydef filter_baby_friendly_places(places: List[Dict[str, Any]]) -> List[Dict[str, Any]]: # 허용되는 카테고리 (아기 외출에 적합한 곳) allowed_categories = { "대형마트", "키즈카페", "어린이공원", "동물원", "식물원", "박물관" }
# 절대 제외해야 하는 카테고리 또는 키워드 disallowed_categories_keywords = { "인터넷 쇼핑몰", "무인 매장", "폐점", "백화점_약국", # 백화점 내 약국 등 특정 서브 카테고리 "성인용품점" } filtered_places = [] for place in places: place_categories = set(place.get("categories", [])) place_name = place.get("name", "").lower() place_id = place.get("id") # 폐점 여부 확인을 위한 ID (가상) # 1. 명시적으로 허용된 카테고리에 속하는지 확인 if not allowed_categories.intersection(place_categories): continue # 허용된 카테고리에 없으면 건너뜀 # 2. 명시적으로 제외해야 하는 카테고리나 키워드가 포함되는지 확인 is_disallowed = False for disallowed in disallowed_categories_keywords: if disallowed in place_categories or disallowed in place_name: is_disallowed = True break if is_disallowed: continue # 제외 대상이면 건너뜀 # 3. 폐점 여부 확인 (실제 API 호출 또는 DB 조회 필요) # if is_closed(place_id): # 가상 함수 # continue # 위 조건들을 모두 통과하면 추가 filtered_places.append(place) return filtered_places예시 데이터
sample_places = [ {"id": "p1", "name": "이마트", "categories": ["대형마트", "쇼핑"]}, {"id": "p2", "name": "쿠팡 본사", "categories": ["인터넷 쇼핑몰", "사무실"]}, {"id": "p3", "name": "롯데마트 (폐점)", "categories": ["대형마트", "폐점"]}, {"id": "p4", "name": "신세계백화점 약국", "categories": ["백화점_약국", "쇼핑"]}, {"id": "p5", "name": "용인 어린이 박물관", "categories": ["박물관", "어린이"]}, {"id": "p6", "name": "스타필드", "categories": ["쇼핑몰", "대형마트"]} # 스타필드는 대형마트로도 볼 수 있으나, 쇼핑몰로 분류될 경우 제외될 수 있음 ]
실제 필터링 적용
result = filter_baby_friendly_places(sample_places)
print(result)
핵심은 '허용된 카테고리' 목록을 명확히 하고, '제외해야 할 목록'도 구체적으로 정의하여 이중으로 검증하는 것이다. 또한, 실제 폐점 여부 같은 동적인 정보도 고려해야 한다. (위 코드에서 is_closed 함수는 실제 구현이 필요하다.)
결과
- 아기 외출 장소 추천 시 부적절한 장소(인터넷 쇼핑몰, 폐점 장소 등)가 노출되는 오류가 완전히 수정되었다.
- 추천 목록의 정확도가 크게 향상되어 사용자 만족도가 높아졌다.
- 필터링 로직의 복잡성이 증가했지만, 유지보수 가능한 수준으로 관리되고 있다.
정리 — 같은 함정 안 빠지려면
- [ ] 장소 추천 시, 단순히 제외할 카테고리만 나열하지 말고 명확히 포함할 카테고리 목록을 정의할 것.
- [ ]
인터넷 쇼핑몰,폐점,무인 매장등은 항상 제외 목록에 포함할 것. - [ ]
백화점 약국처럼 특정 장소 내의 서브 카테고리도 고려하여 제외할 수 있도록 로직을 짤 것. - [ ] 장소 데이터의 카테고리 분류가 일관적인지 주기적으로 점검하고, 필요한 경우 데이터 정제 작업을 수행할 것.
- [ ] 실시간 폐점 정보 등 동적인 데이터 연동 방안을 고려할 것.
태그
이 글이 도움이 됐다면
휴직메이트
육아휴직·출산 준비를 돕는 가이드와 도구 모음.