![[실전 커뮤니티 04] 추천과 비추천, 표를 세는 법](https://img.thenullpage.com/posts/5725/5725_1_4fa8c8.webp)
지난 편에서 댓글 구조를 설계했다. 이제 그 글과 댓글에 사람들이 표를 던지는 이야기다. 추천과 비추천은 버튼 하나처럼 단순해 보이지만, 실제로는 커뮤니티의 분위기를 통째로 바꾸는 장치였다. 이번 편은 표를 어떻게 세고, 중복을 어떻게 막고, 비추천이라는 위험한 버튼을 어떻게 다뤘는지에 대한 기록이다.
1. 추천 버튼의 무게
추천 버튼은 커뮤니티에서 가장 많이 눌리는 버튼이다. 글을 쓰는 사람은 소수지만, 표를 던지는 사람은 다수다. 대부분의 방문자는 글을 읽고 조용히 나가지만, 그중 일부는 마음에 드는 글에 추천을 눌러 자기 존재를 아주 작게 남긴다. 이 가벼운 참여가 사실 커뮤니티에서 가장 흔한 상호작용이다. 그래서 나는 추천 버튼을 사소하게 보지 않았다.
추천은 글쓴이에게 주는 가장 값싼 보상이기도 하다. 돈이 드는 것도, 시간이 드는 것도 아니지만, 자기 글에 추천이 하나둘 쌓이는 걸 보는 기쁨은 생각보다 크다. 첫 편에서 말한 무응답의 공포를 깨는 또 하나의 장치가 바로 이 추천이었다. 댓글을 달 만큼 열의는 없어도 추천 하나로 반응을 남기는 사람이 훨씬 많았다. 그래서 나는 추천을 누르는 문턱을 최대한 낮췄다.
동시에 추천 수는 커뮤니티의 품질 신호였다. 어떤 글이 많은 사람의 공감을 받았는지를 숫자로 보여주기 때문이다. 이 신호는 다음 편에서 다룰 정렬의 재료가 된다. 좋은 글을 위로 올리고 나쁜 글을 아래로 내리는 판단의 기초 데이터가 바로 이 표였다. 그래서 표를 정확하고 공정하게 세는 것은 단순한 카운팅이 아니라 커뮤니티 신뢰의 근간이었다.
다만 나는 추천 수를 절대적인 진리로 취급하지 않으려 애썼다. 표는 인기의 척도일 뿐 품질의 척도는 아니다. 자극적인 글이 좋은 글보다 표를 더 받는 일은 흔했다. 이 간극을 인정하는 것이 표를 건강하게 다루는 출발점이었다. 표는 유용한 신호지만 맹신하면 커뮤니티가 자극 경쟁으로 흐른다는 것을, 나는 운영하며 반복해 목격했다.
2. 한 사람 한 표를 지키는 법
표를 센다는 것은 곧 부정 투표를 막는다는 뜻이다. 한 사람이 한 글에 추천을 백 번 누를 수 있다면 그 숫자는 아무 의미가 없다. 그래서 가장 기본은 한 사람이 한 글에 한 번만 표를 던지게 하는 것이다. 나는 누가 어떤 글에 표를 던졌는지를 기록으로 남겨, 이미 표를 던진 사람이 다시 누르면 취소로 처리했다. 개념적으로는 사용자와 대상의 조합을 유일하게 묶어 중복을 원천 차단하는 방식이었다.
이 기록을 남기는 방식에는 두 갈래가 있었다. 하나는 표의 총합만 세는 것이고, 다른 하나는 누가 던졌는지 개별로 남기는 것이다. 총합만 세면 저장 공간은 아낄 수 있지만 중복을 막을 수 없고, 개별로 남기면 저장은 늘지만 누가 눌렀는지 알 수 있어 취소와 중복 방지가 가능하다. 나는 후자를 택했다. 정확성을 위해 저장 비용을 감수한 것이다.
더 까다로운 건 로그인하지 않은 사람의 표였다. 비회원에게도 추천을 열어주면 참여는 늘지만 중복을 막기가 거의 불가능하다. 같은 사람이 브라우저만 바꿔도 다른 사람으로 보이기 때문이다. 나는 표만큼은 로그인한 사람에게만 허용했다. 참여의 문턱을 조금 높이더라도, 표의 신뢰를 지키는 게 더 중요하다고 판단했다. 표는 커뮤니티의 화폐라, 위조가 쉬우면 화폐 가치가 무너진다.
표 기록은 나중에 어뷰징을 탐지하는 데도 요긴했다. 누가 언제 어떤 글에 표를 던졌는지가 남아 있으니, 특정 계정들이 항상 같은 글에만 몰려 표를 던지는 이상 패턴을 찾아낼 수 있었다. 이 여론 조작 탐지는 뒤의 어뷰징 편에서 따로 다루겠다. 표를 개별로 기록한 결정이, 단순한 중복 방지를 넘어 커뮤니티 방어의 자산이 된 셈이다.
3. 비추천이라는 양날의 검
가장 오래 고민한 것은 비추천 버튼을 둘 것인가였다. 비추천은 강력한 자정 장치다. 나쁜 글, 틀린 정보, 무례한 댓글을 커뮤니티가 스스로 눌러 아래로 내릴 수 있게 한다. 모더레이터 한 명이 다 못 하는 일을 다수의 표가 대신 해주는 것이다. 이 자정 기능은 매력적이었다. 잘만 작동하면 커뮤니티가 알아서 품질을 관리한다.
하지만 비추천에는 어두운 면이 있었다. 사람들은 틀린 글이 아니라 마음에 안 드는 글에 비추천을 누른다. 소수 의견, 낯선 관점, 인기 없는 취향이 비추천 폭격을 맞고 묻힌다. 비추천이 강할수록 커뮤니티는 다수의 취향으로 획일화되고, 새로운 목소리가 설 자리를 잃는다. 자정 장치가 검열 장치로 변질되는 순간이었다. 나는 이 위험을 가볍게 볼 수 없었다.
또 비추천은 글쓴이에게 주는 상처가 컸다. 추천 열 개보다 비추천 하나가 더 오래 기억에 남는다. 애써 글을 썼는데 비추천이 붙으면 다시는 글을 쓰고 싶지 않아진다. 첫 편에서 말한 잔존의 관점에서 보면, 비추천은 어렵게 붙잡은 사람을 내쫓는 버튼이 될 수 있었다. 자정 효과와 이탈 위험 사이에서 저울질이 필요했다.
나의 절충은 비추천을 두되 그 힘을 약하게 만드는 것이었다. 비추천 수를 추천만큼 크게 노출하지 않고, 정렬에 미치는 영향도 제한적으로 뒀다. 비추천이 일정 수준 이상 쌓인 글만 조용히 아래로 가라앉히되, 개별 비추천 숫자로 글쓴이를 공개적으로 망신 주지는 않았다. 자정은 살리되 폭력성은 누그러뜨리는 방향이었다.
4. 표를 세는 시스템의 함정
표를 세는 일은 기술적으로도 만만치 않았다. 인기 글은 짧은 시간에 수많은 사람이 동시에 추천을 누른다. 이때 표의 총합을 매번 다시 계산하면 서버가 버티지 못한다. 그래서 나는 표의 총합을 미리 저장해두고, 누를 때마다 그 숫자만 갱신하는 방식을 썼다. 매번 전체를 세지 않고 증감만 반영하는 것이다. 이 캐싱된 카운터가 성능의 핵심이었다.
문제는 이 미리 저장한 숫자가 실제와 어긋날 수 있다는 점이었다. 표를 던진 기록은 있는데 총합 숫자가 반영이 안 됐거나, 반대로 총합은 늘었는데 기록이 없는 불일치가 생길 수 있다. 나는 이 둘을 주기적으로 대조해 어긋난 걸 바로잡는 장치를 뒀다. 캐시된 숫자는 빠르지만 언젠가 진실과 어긋나므로, 진실과 맞추는 절차가 반드시 필요했다.
동시성도 골칫거리였다. 두 사람이 같은 순간에 표를 던지면, 잘못 설계된 코드에서는 한 표가 사라진다. 둘 다 갱신 전의 숫자를 읽어서 각자 하나씩 더한 뒤 같은 값을 써버리기 때문이다. 나는 이 경쟁 조건을 막기 위해 갱신을 원자적으로 처리했다. 개념적으로는 읽고 더해서 쓰는 세 동작을 하나의 나눌 수 없는 연산으로 묶는 방식이었다. 표 하나도 허투루 잃지 않으려는 장치였다.
조회 수 세기도 비슷한 고민을 안겼다. 한 사람이 새로고침을 열 번 하면 조회 수를 열 번 올릴 것인가. 나는 방문마다 올리는 단순한 규칙을 택하되, 그 숫자의 의미를 과대 해석하지 않았다. 표와 조회 수는 모두 유용하지만 불완전한 신호라, 시스템은 정확히 세되 사람은 겸손하게 해석해야 한다는 게 내 결론이었다.
5. 표가 만드는 문화
추천과 비추천은 결국 커뮤니티가 무엇을 좋아하는지를 규정한다. 어떤 글이 표를 많이 받는지가 곧 그 커뮤니티의 취향이 되고, 사람들은 그 취향에 맞춰 글을 쓰게 된다. 자극적인 제목이 표를 받으면 자극적인 제목이 늘고, 정성 어린 정보 글이 표를 받으면 그런 글이 늘어난다. 표는 단순한 집계가 아니라 커뮤니티의 방향을 정하는 나침반이었다.
그래서 나는 무엇이 표를 받는 구조인지를 늘 살폈다. 만약 자극만 표를 받는 구조라면, 그건 시스템이 잘못 설계된 것이다. 정렬 방식, 노출 위치, 표의 가중치 같은 세부가 사람들의 행동을 은근히 유도했다. 표를 어떻게 세느냐보다, 그 표가 어떤 글을 보상하도록 설계했느냐가 커뮤니티의 성격을 결정했다.
또 하나 배운 것은 표에 과하게 의존하면 안 된다는 점이다. 표는 다수의 즉각적 반응일 뿐, 깊이 있는 좋은 콘텐츠를 항상 알아보지는 못한다. 그래서 나는 표만으로 모든 걸 줄 세우지 않고, 운영자의 판단이 개입할 여지를 남겨뒀다. 완전히 표에 맡긴 커뮤니티는 인기 영합으로 흐르고, 완전히 운영자가 통제하는 커뮤니티는 생기를 잃는다. 그 사이의 균형이 관건이었다.
표는 모였지만, 이제 그 표로 무엇을 할지가 남았다. 표가 많은 글을 위로 올리는 인기순 정렬은 당연해 보이지만, 그 안에는 깊은 함정이 숨어 있다. 다음 편에서는 정렬 알고리즘을 다룬다. 왜 단순 인기순이 커뮤니티를 망치는지, 시간과 표를 어떻게 버무려야 신선하면서 공정한 목록이 되는지 이야기하겠다.