토로너스 투표 시스템 설계 — 공정한 토론을 위한 구조
투표가 핵심이다
토로너스에서 투표는 단순한 기능이 아닙니다. 앱의 핵심 메커니즘입니다.
좋은 의견에 투표가 쌓이고, 그 투표가 랭킹에 반영되고, 랭킹이 올라가면 더 많은 노출을 받는 구조입니다. 투표가 제대로 작동하지 않으면 전체 앱의 가치가 무너집니다.
어뷰징 방지
가장 먼저 고민한 것은 어뷰징 방지였습니다.
투표에 보상이 연결되면 반드시 투표 조작 시도가 생깁니다. 계정을 여러 개 만들어서 자기 의견에 투표하거나, 특정 사람의 의견에 집단적으로 반대 투표를 몰아주는 식입니다.
대응책으로 몇 가지를 도입했습니다:
- 디바이스 기반 제한: 같은 디바이스에서 같은 토론에 중복 투표 불가
- 신규 계정 제한: 가입 후 일정 기간 내 투표 수 제한
- 비율 감지: 특정 의견에 단시간에 투표가 집중되면 플래그 처리
완벽한 해결책은 없습니다. 하지만 어뷰징의 비용을 높여서 시도 자체를 줄이는 것이 목표였습니다.
투표 가중치
모든 투표가 같은 가중치를 가지면 안 된다는 생각도 했습니다.
토론에 열심히 참여해온 사용자의 투표와, 방금 가입한 계정의 투표가 같은 무게를 가지면 어뷰징에 취약합니다. 활동 이력이 많은 사용자의 투표에 약간 더 높은 가중치를 주는 방식을 실험했습니다.
다만 이를 너무 복잡하게 만들면 사용자가 시스템을 이해하기 어려워집니다. 결국 가중치 차이를 크게 두지 않고, 주로 어뷰징 감지 쪽에 더 투자하는 방향으로 결론을 냈습니다.
시간 감쇠
랭킹에는 시간 감쇠(time decay)를 적용했습니다.
오래된 투표일수록 현재 랭킹에 미치는 영향이 줄어듭니다. 한번 좋은 의견을 써서 투표를 많이 받으면 영원히 상위에 머무는 게 아니라, 계속 좋은 의견을 내야 순위를 유지할 수 있는 구조입니다.
이렇게 해야 신규 사용자에게도 기회가 있고, 커뮤니티가 활성화되는 효과가 있습니다.
배운 점
투표 시스템은 생각보다 훨씬 복잡한 문제입니다.
기술적인 구현 자체보다 "어떻게 하면 공정하게 만들 수 있을까"라는 설계 고민이 더 오래 걸렸습니다. 레딧, 해커뉴스, 스택오버플로우 같은 커뮤니티들의 투표 시스템을 분석하고 참고했습니다.
완성된 시스템이 없습니다. 지금도 개선 중입니다.