[실전 커뮤니티 03] 댓글 트리, 대댓글과 깊이

지난 편에서 텅 빈 공간을 초기 콘텐츠로 채우는 이야기를 했다. 이제 그 공간에서 사람들이 실제로 대화하게 만들 차례다. 커뮤니티에서 대화의 기본 단위는 댓글이다. 이번 편은 댓글 시스템, 특히 답글에 답글이 달리는 대댓글 구조와 그 깊이를 어디까지 허용할지에 대한 내 설계 고민이다.


1. 댓글은 커뮤니티의 심장이다

글은 커뮤니티의 뼈대지만, 댓글은 심장이다. 사람들이 다시 찾아오는 진짜 이유는 자기 글이나 남의 글에 달린 반응 때문이다. 내가 운영하며 확인한 것도 그랬다. 글만 읽고 나가는 사람보다, 댓글을 남긴 사람의 재방문율이 훨씬 높았다. 한 번 대화에 참여한 사람은 그 대화가 어떻게 이어졌는지 궁금해서 돌아온다. 그래서 나는 댓글 경험에 글쓰기 경험만큼, 어쩌면 그 이상으로 공을 들였다.


댓글의 힘은 무응답을 깨는 데서 나온다. 첫 편에서 말한 텅 빈 방의 공포는 사실 댓글 하나로 상당 부분 해소된다. 내가 쓴 글에 누군가 짧게라도 답을 달아주면, 그 사람은 이 공간이 자기 목소리를 들어준다고 느낀다. 그래서 나는 초기에 새 글마다 최소한의 반응이 붙도록 특별히 신경 썼다. 아무 댓글 없는 글이 목록에 쌓이는 것은 커뮤니티가 죽어간다는 가장 확실한 징후였다.


기술적으로 댓글은 글보다 다루기 까다로웠다. 글은 한 화면에 하나지만 댓글은 수십, 수백 개가 한 화면에 뜬다. 그래서 성능과 구조를 동시에 신경 써야 했다. 댓글 수가 많아질수록 어떻게 저장하고 어떻게 불러와 어떤 순서로 보여줄지가 전부 문제가 됐다. 심장이 빨리 뛸수록 그 심장을 감당할 혈관도 튼튼해야 했다.


그리고 댓글은 감정이 가장 날것으로 드러나는 곳이기도 했다. 잘 설계된 댓글 공간은 활발한 토론을 낳지만, 잘못 설계된 댓글 공간은 싸움판이 된다. 구조 하나, 정렬 하나, 표시 방식 하나가 대화의 온도를 바꿨다. 그래서 댓글 설계는 단순한 기능 구현이 아니라 커뮤니티 문화를 빚는 일에 가까웠다.


2. 대댓글, 어디까지 파고들 것인가

가장 먼저 부딪힌 결정은 대댓글의 깊이였다. 답글에 답글, 그 답글에 또 답글이 달릴 수 있게 하면 대화는 나무처럼 가지를 친다. 이 방식은 누가 누구에게 답하는지가 명확해서 맥락이 잘 유지된다. 하지만 깊이에 제한을 두지 않으면 화면이 오른쪽으로 한없이 밀려난다. 특히 좁은 모바일 화면에서는 몇 단만 들어가도 글자가 세로로 한 줄씩 끊겨 읽을 수 없게 된다.


반대로 깊이를 아예 두지 않고 모든 댓글을 한 줄로 평평하게 나열하는 방식도 있다. 이건 구현이 단순하고 화면도 깔끔하지만, 누가 누구에게 하는 말인지 헷갈린다. 대화가 조금만 얽혀도 맥락이 실종된다. 나는 이 두 극단 사이에서 오래 고민했다. 트리처럼 깊게 갈 것인가, 리스트처럼 평평하게 갈 것인가.


결론은 절충이었다. 나는 깊이를 딱 한 단계로 제한했다. 원 댓글이 있고, 그 아래 답글들이 붙는다. 하지만 답글의 답글은 다시 그 답글 그룹 안에 나란히 들어간다. 즉 시각적으로는 두 층만 존재한다. 누가 누구에게 답하는지는 답글 안에서 상대를 언급하는 방식으로 표시했다. 개념적으로는 모든 답글이 하나의 부모 댓글에 소속되는 얕은 트리 구조였다.


이 결정의 근거는 명확했다. 실제로 사람들이 나누는 대화의 대부분은 두 층이면 충분했다. 세 층, 네 층까지 파고드는 대화는 전체의 아주 일부였고, 그 소수를 위해 화면 전체를 희생할 이유가 없었다. 깊은 트리를 허용하는 대형 커뮤니티도 있지만, 그들은 넓은 화면과 접기 기능을 함께 제공한다. 내 규모에서는 얕고 명확한 구조가 훨씬 실용적이었다.


3. 정렬이 대화의 성격을 바꾼다

댓글을 어떤 순서로 보여줄지도 생각보다 큰 문제였다. 오래된 순으로 보여주면 대화가 시간 흐름대로 읽혀서 맥락이 자연스럽다. 처음부터 끝까지 이야기가 이어지는 느낌이라, 토론형 커뮤니티에 어울린다. 나는 기본 정렬을 이 시간순으로 뒀다. 대화는 흐름이 생명인데, 인기순으로 뒤섞으면 그 흐름이 끊기기 때문이다.


하지만 인기순 정렬의 유혹도 있었다. 추천을 많이 받은 댓글을 위로 올리면, 사람들이 가장 공감하는 반응이 먼저 보인다. 문제는 이게 소수의 목소리를 위로, 다수의 목소리를 아래로 밀어낸다는 점이다. 게다가 초기에 우연히 추천 몇 개를 받은 댓글이 계속 상단을 차지하며 눈덩이처럼 표를 더 받는 쏠림도 생긴다. 먼저 눈에 띈다는 이유만으로 계속 유리해지는 것이다.


여기서 나는 흥미로운 사실을 알게 됐다. 어떤 대형 커뮤니티는 댓글 정렬에 단순 추천 수가 아니라 통계적 신뢰 구간을 쓴다. 추천이 하나뿐인 댓글은 표본이 적어 신뢰할 수 없으니 함부로 위로 올리지 않고, 추천 열 개에 비추천 하나인 댓글이 추천 마흔 개에 비추천 스무 개인 댓글보다 위로 갈 수 있게 한다. 표의 절대 수가 아니라 비율의 확실성으로 순위를 매기는 것이다. 이 아이디어는 나중에 정렬 편에서 더 깊이 다루겠다.


나는 결국 상황에 따라 정렬을 고를 수 있게 열어뒀다. 기본은 시간순으로 대화의 흐름을 지키되, 원하면 공감순으로도 볼 수 있게. 다만 기본값을 무엇으로 두느냐가 결정적이었다. 대부분의 사용자는 기본값을 바꾸지 않기 때문이다. 나는 커뮤니티의 성격을 토론과 대화 쪽으로 잡았기에, 흐름을 지키는 시간순을 기본으로 삼았다.


4. 삭제와 수정이 남기는 구멍

댓글 시스템에서 가장 골치 아팠던 건 삭제였다. 원 댓글에 답글이 여러 개 달렸는데 원 댓글 작성자가 그걸 지우면 어떻게 되는가. 답글들을 다 같이 지우면 애먼 사람들의 대화가 증발한다. 그렇다고 원 댓글만 지우면 답글들이 허공에 뜬 고아가 된다. 문맥이 사라진 답글은 읽는 사람을 혼란스럽게 한다.


나는 이 문제를 흔적을 남기는 방식으로 풀었다. 답글이 달린 원 댓글이 삭제되면, 내용만 삭제된 댓글이라는 표시로 바꾸고 자리는 남겨뒀다. 그래야 아래 답글들의 맥락이 유지된다. 답글이 하나도 없는 댓글이라면 그냥 완전히 지웠다. 개념적으로는 자식이 있는 노드는 내용만 비우고 껍데기는 보존하는 방식이었다. 대화의 구조를 무너뜨리지 않으면서 작성자의 삭제 권리도 존중하는 절충이었다.


댓글 수 세기도 은근히 함정이었다. 화면에는 이 글에 댓글 몇 개라고 표시되는데, 삭제된 껍데기 댓글을 이 숫자에 포함할지 말지를 정해야 했다. 나는 사용자에게 보이는 숫자와 실제 저장된 행의 수를 분리해 관리했다. 이 둘을 헷갈리면 목록의 댓글 수와 실제 댓글 수가 어긋나 사용자가 속은 기분을 느낀다. 사소해 보이는 카운트 하나가 신뢰와 직결됐다.


수정도 비슷한 고민을 남겼다. 댓글을 자유롭게 고칠 수 있게 하면, 추천을 많이 받은 뒤 내용을 엉뚱하게 바꾸는 악용이 가능하다. 그래서 나는 수정된 댓글에는 수정됨 표시를 남겼다. 투명성을 위한 최소한의 장치였다. 무엇을 지우고 무엇을 남기느냐의 규칙이 곧 그 공간이 얼마나 정직한지를 결정했다.


5. 댓글도 콘텐츠다

운영을 하며 깨달은 가장 중요한 사실은, 댓글이 부속물이 아니라 그 자체로 훌륭한 콘텐츠라는 점이다. 어떤 글은 본문보다 댓글이 더 재미있고 유익하다. 사람들은 그 댓글을 보러 다시 온다. 그래서 나는 댓글에도 이미지를 붙일 수 있게 하고, 좋은 댓글이 묻히지 않도록 신경 썼다. 다만 이미지는 대화를 산만하게 만들 수 있어 개수를 절제했다.


댓글이 콘텐츠라는 관점은 검색과 발견에도 영향을 줬다. 좋은 댓글이 달린 글은 그 자체로 더 가치 있는 페이지가 됐다. 그래서 나는 본문과 댓글을 함께 하나의 읽을거리로 취급했다. 이 관점은 이 시리즈 마지막에서 다룰 검색과 발견 이야기와 곧바로 이어진다. 좋은 대화가 묻히지 않게 하는 것이 커뮤니티 운영의 큰 축이었다.


동시에 댓글은 가장 관리가 필요한 공간이기도 했다. 본문은 쓰는 데 심리적 문턱이 있어 그나마 신중하지만, 댓글은 즉흥적이라 감정이 날것으로 튀어나온다. 싸움도 대부분 댓글에서 시작된다. 그래서 댓글 설계는 신고, 모더레이션, 알림 같은 뒤 편들의 주제와 촘촘히 얽혀 있다. 심장이 뛰는 곳인 만큼 가장 세심하게 돌봐야 했다.


다음 편에서는 그 댓글과 글에 붙는 추천과 비추천을 다룬다. 표를 어떻게 세고, 중복 투표를 어떻게 막고, 비추천이라는 위험한 버튼을 둘 것인가 말 것인가. 그리고 그렇게 모인 표가 목록의 순서를 어떻게 바꾸는지, 인기순이라는 말 뒤에 숨은 함정까지 이어서 이야기하겠다.