커리큘럼
home
React
home

매칭 선호도 설정

Created
2025/02/03 06:07
Tags

매칭 선호도 설정

Matching Filtering (매칭 필터링)
매칭 서비스의 핵심 기능은 사용자의 선호도(Preferences)에 따라 매칭 상대를 필터링하는 것입니다. 이를 통해 사용자가 원하는 조건에 맞는 상대방을 추천할 수 있습니다.
“성별”, “거리”, “기술 스택” 세 가지를 기준으로 매칭 상대를 필터링 합니다.
“성별”은 협업 파트너를 찾는 사람을 위해 이성 외에도 동성, 상관없음 항목을 추가하였습니다.
“거리”는 “내 정보 수정”에서 위치 정보를 갱신한 유저들을 기반으로 거리를 계산해서 필터링 합니다.
내가 원하는 상대방의 “기술 스택”을 최대 5개까지 선택하여 필터링 조건에 추가할 수 있습니다.
설정에따른 매칭상대조회

매칭 알고리즘 업데이트 과정

매칭 알고리즘은 순차적으로 업데이트 되었습니다.
이유: 처음에는 가장 기본적인 매칭 방식을 사용하여 시스템의 전체 동작을 확인하고 DB에 해당 데이터가 잘 저장되는지 테스트해보고 안정화 하기 위함이었습니다.
업데이트 과정:
V1: 모든 유저 userId 순서대로 매칭
V2: 모든 유저 무작위 순서 유저 매칭
V3: 좋아요한 유저는 다시 매칭 되지 않게 설정 - 매칭이 단조롭지 않도록 새로운 매칭만을 생성
V4: 선호도 설정에 따른 필터링 된 유저 매칭
V5: 선호도 설정에 위치기반 거리 조건 추가
V6: 선호도 설정에 기술스택 조건 추가 - 서비스 취지에 맞게 개발자들의 협업 가능성을 높임

매칭선호도 설정에 따른 매칭 불발 이슈

테스트 과정 초기에는 users 테이블에 100명의 유저를 faker 함수를 사용하여 seeding 하여 테스트를 하였습니다.
매칭 선호도의 필터링 조건이 하나씩 추가 될수록 매칭되는 유저수가 현격히 줄어들었고, 종국에는 1000명의 유저를 시딩하였지만 문제가 해결되지 않았습니다.
이에 저희는 처음에는 데이터 분포가 불균형하게 이루어진 것이 아닌가 하여 데이터를 점검하였으나 해당 이슈는 아닌 것 같았고, 데이터 또한 잘 가져오고 있는 것을 확인하였습니다. 추가로 거리 조건이 저희의 예상보다 충족시키기가 용이하지 않은가 하여 가상유저들의 거리 또한 파주에서 부산으로 제한하였습니다.
그럼에도 1000명의 유저중 매칭 상대를 아무도 가져오지 못하는 상황이 종종발생하였습니다. 이에 더 많은 유저를 시딩할 것인지, 매칭 선호도를 대폭 완화할 것인지 고민하였고, 서비스 배포 시에 실제로 merge가 되어 채팅 기능을 사용하는 경험을 선사하고 싶어서 매칭 선호도를 대폭 완화하고 20명의 가상 유저만 시딩하여 배포하였습니다.
결과적으로 선호도 설정 조건에 의해 매칭이 0명이 되는 경우에 대한 피드백은 없었습니다.

Background task

성별 필터링 (Gender Filter): 사용자의 선호도에 따라 상대방의 성별을 필터링합니다. 예를 들어, 사용자가 "반대 성별만"을 선택하면, 쿼리 빌더는 oppositeGender 조건을 추가하여 해당 성별의 사용자만 쿼리에 포함되도록 합니다.
거리 필터링 (Distance Filter): 사용자의 위치와 상대방의 위치 간 거리를 계산하여 필터링합니다. 사용자가 설정한 거리 범위 내에 있는 사용자만 매칭 대상으로 선택됩니다. 거리 계산은 사용자의 위도(latitude)와 경도(longitude)를 기반으로 수행되며, SQL 쿼리 내에서 직접 처리됩니다. 이는 기존에는 SQL의 쿼리문이 아닌 서버에서 처리하였는데, 속도상의 이슈가 있어서 개선하였고 해당 내용은 트러블 슈팅 부분에서 다루었습니다.
기술 스택 필터링 (Tech Stack Filter): 사용자가 선호하는 기술 스택에 따라 필터링합니다. 사용자가 특정 기술을 선호할 경우, 해당 기술을 보유한 사용자만 쿼리에 포함됩니다. 이 과정에서 선호하는 기술 이름을 기반으로 기술 ID를 조회한 후, 해당 기술을 가진 사용자만 매칭 대상으로 선택합니다.
거리 필터링 (Distance Filter): 사용자의 위치와 상대방의 위치 간 거리를 계산하여 필터링합니다. 사용자가 설정한 거리 범위 내에 있는 사용자만 매칭 대상으로 선택됩니다. 거리 계산은 사용자의 위도(latitude)와 경도(longitude)를 기반으로 수행되며, SQL 쿼리 내에서 직접 처리됩니다. 이는 기존에는 SQL의 쿼리문이 아닌 서버에서 처리하였는데, 속도상의 이슈가 있어서 개선하였고 해당 내용은 트러블 슈팅 부분에서 다루었습니다.
기술 스택 필터링 (Tech Stack Filter): 사용자가 선호하는 기술 스택에 따라 필터링합니다. 사용자가 특정 기술을 선호할 경우, 해당 기술을 보유한 사용자만 쿼리에 포함됩니다. 이 과정에서 선호하는 기술 이름을 기반으로 기술 ID를 조회한 후, 해당 기술을 가진 사용자만 매칭 대상으로 선택합니다.
거리 필터링 (Distance Filter): 사용자의 위치와 상대방의 위치 간 거리를 계산하여 필터링합니다. 사용자가 설정한 거리 범위 내에 있는 사용자만 매칭 대상으로 선택됩니다. 거리 계산은 사용자의 위도(latitude)와 경도(longitude)를 기반으로 수행되며, SQL 쿼리 내에서 직접 처리됩니다. 이는 기존에는 SQL의 쿼리문이 아닌 서버에서 처리하였는데, 속도상의 이슈가 있어서 개선하였고 해당 내용은 트러블 슈팅 부분에서 다루었습니다.
기술 스택 필터링 (Tech Stack Filter): 사용자가 선호하는 기술 스택에 따라 필터링합니다. 사용자가 특정 기술을 선호할 경우, 해당 기술을 보유한 사용자만 쿼리에 포함됩니다. 이 과정에서 선호하는 기술 이름을 기반으로 기술 ID를 조회한 후, 해당 기술을 가진 사용자만 매칭 대상으로 선택합니다.
나이 차 필터링 (Age Gap Filter): 사용자가 설정한 나이 차이 범위에 따라 필터링을 수행합니다. 예를 들어, "5년 내"를 선택하면 사용자의 생년 기준으로 ±5년 내에 태어난 사용자만 포함됩니다. 연상, 연하를 나누지 않는 이유는 복잡도를 줄이고 매칭을 증가시키기 위함이며, 타 사이트의 나이 필터링 방식을 벤치마킹한 것입니다.
키 필터링 (Height Filter): 사용자의 키 선호도에 따라 상대방의 키를 필터링합니다. 각 키 범위에 대해 최소 및 최대 키 값을 설정하고, 해당 범위에 속하는 사용자만 쿼리에 포함시킵니다. 150이하는 특정 취향을 존중해 줄 수 없어서 제외하였습니다.
체형 필터링 (BodyShape Filter): 사용자는 선호 체형을 SLIM(마른 체형), NORMAL(보통 체형), CHUBBY(통통한 체형), MUSCULAR(근육질 체형), DEVELOPER(개발자 체형), NO_PREFERENCE(상관 없음) 중 하나를 선택하여 그에 맞는 유저를 필터링합니다.
흡연 및 음주 빈도 필터링 (Smoking and Drinking Frequency Filters): 사용자는 음주 흡연 빈도가 FREQUENTLY(자주), SOMETIMES(가끔), NEVER(하지 않음), NO_PREFERENCE(상관 없음) 중 하나를 선택하여 그에 맞는 유저를 필터링합니다.