데브코스 - PetMez 설계편

류희수·2024년 11월 18일
0

예.. 어느덧 시간이 이렇게 흘러 벌써 최종프로젝트가 다가왔습니다...

귀여운 피그마 사진 ㅋㅋㅋㅋ

저희팀은 펫시터를 동네 단위로 매칭해주는 애견 플랫폼을 만들기로 하였습니다.
그중에 저는 매칭을 담당하게 되었습니다... 예.. 열심히 해봅시다!


매칭 방식

특정한 알고리즘에 의하여 추천을 받고
-> 정말 제일 많이 고민했던 방식이다. 사실 매칭플랫폼에 핵심인 매칭 알고리즘이기 때문에 나름대로 여러가지 방법을 생각해보았다.

그렇게 생각한 알고리즘은 점수제이다.
지역(3km)까지 동일한 점수로 40%
선호하는 견종(소,중,대형견) 으로 20%
애견의 산책여부, 돌봄 20%
견bti + mbti 조합을 사용해서 20%
로 종합 점수를 매겨서 유저들과의 매칭을 도와주려고 한다.

(시간이 된다면)
추천된 사람과 매칭하기(좋아요) 누르면 채팅으로 넘어갑니다.
만약 싫어요 누르면 알고리즘 후순위로 밀리도록 구현합니다.
찜해두기나 좋아요 같은 기능도 추가합니다.

데이터 베이스 설계

흠... 여기서 부터 진짜 고민이 많았다...

처음엔 단순히 이렇게 설계를 하였는데 (점수는 빠진 상태)
뭔가 추천된 사람 : {"김oo" : 83.5 , "박00" : 72.5....} 등으로 나열해서
상위 몇명을 가져오고 싶었다.
또한 5번째 정도 불러오면 사용자 입장에서 딜레이가 없게 뒤에서 1명씩 더 불러오고 싶었고 매칭된 유저가 어느정도 쌓이면 데이터를 쌓고 싶었다.

하지만 매칭에서 너무 오래걸리면 사용자가 너무 불편할 것 같았고..
사용자마다 조건이 다르기도 하고 장기적인 매칭 기록이나 복잡한 관계를 유지해야 하는 데이터가 아닌 단순히 계산한 점수만을 저장하기에
NoSQL 방식을 생각하게 되었다.

https://velog.io/@hs201016/NoSQL-Mongo-Redis
nosql에 대한 내용은 다음과 같다.

그래서 내가 생각한 것은 *Redis + Mongo + mysql+ 이다!

MySQL

실시간으로 변하는 매칭 상태만을 저장한다. 매칭 성공 -> 채팅으로 이동하도록
-> 매칭 결과 테이블 생성

Redis

{
  "user_id": 1,
  "recommendations": [
    {"recommended_user_id": 2, "score": 85.5},
    {"recommended_user_id": 3, "score": 78.3},
    {"recommended_user_id": 4, "score": 72.1}
  ]
}

Redis는 실시간 추천 점수와 상위 추천 유저를 캐싱하고 관리한다
(성능면에서 효율 상승)
TTL을 설정하여 24~48 시간마다 초기화 예정

Mongo

{
  "user_id": 1,
  "history": [
    {
      "recommended_user_id": 2,
      "score": 85.5,
      "timestamp": "2024-11-19T12:00:00Z"
    },
    {
      "recommended_user_id": 3,
      "score": 78.3,
      "timestamp": "2024-11-19T12:05:00Z"
    }
  ]
}

Redis는 추천결과가 사라지므로(24시간마다 새로 알고리즘 리셋), 장기적으로 보존
mysql에서 매칭이 성공되면 자세한 내용을 mongo디비로 옮겨 장기간 보관한다. (대용량)
-> 사용자가 특정 시점에 어떤 추천을 받았는 지 추적이 가능하다.
이로 인하여 추천 알고리즘 정확도, 분석이 가능

{
  "user_id": 1,
  "matched_users": [
    {
      "matched_user_id": 2,
      "match_date": "2024-11-19",
      "status": "CONFIRMED"
    },
    {
      "matched_user_id": 3,
      "match_date": "2024-11-20",
      "status": "CANCELED"
    }
  ],
  "total_matches": 10,
  "successful_matches": 8,
  "canceled_matches": 2
}

매칭 통계 제공
유저별 매칭 성공률, 취소율, 매칭 빈도 등 통계를 산출.
관리자 페이지에서 매칭 관련 KPI(Key Performance Indicator) 제공.
예: 유저 A는 지난 한 달간 10번 매칭 요청 중 8번 성공, 유저A는 자주 매칭을 취소(경고)

등으로 사용하기로 하였다.

profile
자바를자바

0개의 댓글