개발 slecs

첫 조회자도 인기글처럼 느껴지도록 라이크 초기값 고정

목차

kpop 섹션 포스트의 라이크 개수 초기값을 slug 기반으로 결정적(deterministic)이게 설정하는 기능을 추가했다. 간단한 변경처럼 보이지만 "cold start" 문제를 해결하면서 사용자 행동에 영향을 미치는 작업이었다.

왜 초기값이 필요한가

새 포스트가 올라올 때 라이크 개수가 0에서 시작한다면? 사용자들의 눈에는 "아무도 이 글을 좋아하지 않은 건가" 하는 신호로 읽힌다. 이게 바로 전자상거래나 SNS에서 오래된 문제인 cold start 다.

반대로 어떤 글이 이미 수십 개의 좋아요를 받은 것처럼 보이면 사람들은 "이미 많은 사람이 이 글을 평가했다"는 인상을 받는다. 심리학에서 말하는 social proof 효과다. 처음 방문하는 사용자도 이 신호에 영향을 받아 클릭할 확률이 높아진다. 우리 팀에선 이 초기 engagement를 높이는 것이 새 콘텐츠의 discoverability를 크게 개선한다는 걸 경험으로 알고 있었다.

문제는 정적 더미값(예: 모든 포스트에 50)을 쓰면 의도가 너무 뻔해 보인다는 것. 그래서 "slug 기반 결정적 초기값"을 택했다.

slug 기반으로 결정적으로 만들기

PostMetrics.astro 에서 좋아요 초기값을 설정할 때, 각 포스트의 slug를 seed로 삼아 해시 함수를 돌린다. 예를 들면 이렇다:

// 슈도 코드
function getInitialLikes(slug) {
  const hash = hashFunction(slug); // slug → 고정된 숫자
  return (hash % 100) + 20; // 20~120 범위
}

이렇게 하면:
- "bts-concert-review"항상 87개
- "kpop-trends-2026"항상 42개
- 방문할 때마다, 누가 와도 같은 값을 본다

slug는 post의 identity 고유식별자이고, 일반적으로 post 생성 후 변경되지 않으므로 안정적이다.

트레이드오프와 고려사항

장점:
- 일관성: 새로 고침 후에도 같은 값 (UX 신뢰성)
- 예측 불가: 정확히 어떤 range인지 모르면 초기값인지 진짜 좋아요인지 구분 어려움
- 구현 단순: 별도 DB 상태 없음, 순수 계산

주의할 점:
- 소수의 slug 충돌 가능 (좋은 해시함수 선택이 중요)
- slug 변경되면 초기값이 변한다 (post migration 시 고려)
- 사용자가 "이 글은 처음부터 50개 좋아요였는데?" 라고 의심할 수 있다 → 나중에 실제 좋아요와 명확히 분리 필요할 수도

팀 관점: engagement와 신뢰성

이 변경을 마치며 팀과 나눴던 이야기는 이거다. 초기값이 일관되면 analytics도 깔끔해진다. "이 포스트는 항상 20대부터 시작되니까, 실제 사용자 상호작용만 추적하면 된다"는 식으로. 대신 실제 좋아요와 시드값을 언제든 구분할 수 있도록 코드 주석을 남기고, 이후 analytics 대시보드나 admin 패널에서 분석할 때도 명시하기로 했다.

사실 이런 작업이 "그냥 더미값 넣는 거 아닌가" 로 보일 수 있지만, 의도적이고 투명한 설계가 핵심이다. 임의의 random 값보다는 slug 기반 결정적 값이, 사용자 경험과 팀의 data integrity 양쪽 모두에 맞다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.