알고리즘이 실생활에 적용되는 사례를 생각해보다가 "인기순" 정렬이 생각이 났습니다.
모든 판매 플랫폼에는 고객의 구매를 돕는 "인기순" 정렬이 있습니다.
"인기순" 정렬 기준이 플랫폼마다 다를거라는 생각이 들어서 일반적으로 어떤식으로 설계하는지 알아봤습니다.
저는 LMS 플랫폼을 기준으로 생각해봤습니다.
1. 핵심 지표 선정
'인기'란 추상적인 단어입니다. 어떤걸 '인기'의 척도로 할지 고민이 필요합니다.
Ex)
- 수강 신청 수
- 별점
- 댓글 수
- 완강률
- 장바구니에 담은 사용자의 수
- 사용자 행동 로그(클릭, 조회, 머무른 시간)
여기서 한개의 지표로만 정렬을 하기에는 로직 자체는 간단하지만 몇가지의 오류가 생길 것 같았습니다.
- 수강 신청 수 -> 강의를 오픈한지 오래 됐을 수록 수강 신청 수 가 많을 가능성이 높아짐 -> 실제 좋은 강의인지 알 수 없다.
- 별점 -> 누군가 의도적으로 조작할 수 있음
- 댓글 수 -> 한 고객당 댓글 수 제한이 있지 않은 이상 조작이 가능
- 완강률 -> 완강률 자체로 좋은 강의 판단 척도로는 부족
- 장바구니에 담은 사용자의 수 -> 실제 강의를 수강하려는 결제까지 안갔기 때문에 이 또한 지표로 보기에는 어려움
따라서 각 기준에 대한 가중치가 있으면 더욱 정확한 정렬이 되지 않을까 생각했습니다.
Ex) 인기도 = ( 수강 신청 수 * 0.5 + 별점 * 0.3 ) 실제 가중치는 팀내, 타부서와의 협의 필요
2. 기간
인기순을 정렬할 때 "기간" 또한 중요합니다.
1일, 7일, 30일 기준 등 고객이 원하는 기준이 다를 수 있습니다.
어떤 고객은 가장 최근의 인기도를 알고 싶을수도 어떤 고객은 스테디한 인기도를 알고 싶을 수 있습니다.
이는 주간 인기순, 월간 인기순, 최근 24시간 내 인기 등으로 선택할 수 있게 하는 것이 좋을 것 같습니다.
3. 인기도 점수 처리 주기
인기도를 산정할 때 얼마나 자주 업데이트 할지 빈도를 정해야합니다.
Ex)
- 실시간 -> 비용이 늘어남
- 배치(지정된 시간 처리)
4. 인기 점수 DB
매번 모든 고객이 인기순 버튼을 클릭할 때 마다 계산하고 정렬하기 보다는 미리 정렬을 해둔걸 응답해주는게 효율적같다고 생각했습니다.
Ex)
캐시 : Redis에 미리 정렬된 강의를 저장
검색 엔진 : Elasticsearch를 통해 빠르게 검색하고 정렬, 인덱싱을 활용
검색 엔진 + 캐시 -> 7일 인기순 검색 요청 -> Redis 캐시 확인 -> 없으면 Elasticsearch에서 정렬 요청 -> Redis 캐시에 저장
'개발' 카테고리의 다른 글
회원가입 로직 구현 벤치마킹 (0) | 2025.02.12 |
---|---|
대규모 트래픽이란? (2) | 2025.01.22 |