Project Case Study
Kusting
관심사와 클릭 기록을 반영한 콘텐츠 추천을 구현하고 카카오톡에서 진행하던 일정 투표를 제품 내부로 통합했습니다.
- Role
- Product Engineer
- Period
- 2026.02 ~ 2026.04
- Organization
- Side Project
- Team
- 2인 팀 · 공동 개발
큐레이션 탭 CTR
+15%
전후 각 1주·사용자 33명·동일 노출 위치 기준 상대 증가
Case 01
태그 일치 개수만으로는 사용자의 관심 변화를 반영하기 어려움
문제
초기 추천 시스템은 사용자가 가입할 때 선택한 태그와 게시글 태그의 일치 개수를 계산해 게시글을 정렬했습니다.
동일한 태그를 가진 게시글은 비슷한 점수를 받았고, 사용자가 실제로 어떤 콘텐츠를 클릭했는지도 추천에 반영하지 못했습니다. 가입 이후 관심사가 달라져도 추천 결과가 초기 설정에 머물렀으며, 사용자는 게시글이 자신의 어떤 관심사와 연결돼 추천됐는지 알기 어려웠습니다.
원인 분석
태그는 콘텐츠의 주제를 제한된 값으로 분류하기 때문에 게시글 사이의 세부적인 의미 차이를 표현하기 어려웠습니다. 같은 개발 태그가 붙은 글이라도 프론트엔드, AI, 개발 문화처럼 실제 내용은 다를 수 있지만 태그 일치 개수만 계산하면 유사한 콘텐츠로 처리됐습니다.
사용자의 클릭 기록도 추천 데이터로 사용하지 않아 가입 이후의 관심 변화를 반영할 수 없었습니다. 사용자 관심사와 행동, 게시글 제목과 설명에 담긴 의미가 단순한 태그 비교 과정에서 사라지는 것이 문제였습니다.
해결
태그 일치 개수 기반 추천을 임베딩 유사도 기반 추천으로 전환했습니다. 가입 시 선택한 관심사와 콘텐츠 클릭 기록으로 사용자 관심사를 구성하고, 게시글은 제목과 설명을 결합해 임베딩한 뒤 pgvector HNSW로 의미적으로 가까운 게시글을 검색했습니다.
검색 결과에는 별도의 재정렬 단계를 적용하지 않고 벡터 유사도 순서를 사용했습니다. 추천 이유는 AI가 문장을 생성하는 대신 사용자 관심사와 게시글의 주요 키워드를 조합해 생성 비용과 결과 변동성을 추가하지 않으면서 추천 기준을 설명하도록 했습니다.
초기에는 사용할 수 있는 자체 서버가 있어 Ollama를 사용했습니다. 이후 운영 환경과 모델 변경에 대응할 수 있도록 임베딩 호출부를 provider 인터페이스로 분리해 OpenAI 또는 Ollama로 교체할 수 있게 구성했습니다.


결과
적용 전후 각 1주를 비교한 결과, 사용자 33명과 동일한 노출 위치를 기준으로 큐레이션 탭 CTR이 기존 대비 약 15% 상대 증가했습니다. 가입 시 관심사뿐 아니라 실제 클릭 기록도 추천에 반영하고 태그가 정확히 일치하지 않아도 제목과 설명의 의미가 유사한 게시글을 추천할 수 있게 됐습니다. 표본이 작은 초기 지표이므로 추천 성능을 확정하기보다 개선 가능성을 확인한 결과로 해석했습니다.
Case 02
수동 등록 과정에서 스터디 게시글이 누락됨
문제
스터디원이 글을 작성한 뒤 Notion에 URL과 태그를 직접 등록해야 Kusting에 게시글이 노출됐습니다. 이 과정에서 일주일 동안 작성된 게시글 9건이 등록되지 않았고, 글 한 건을 등록하는 데 평균 약 38초가 필요했습니다.
새 글을 확인하려면 사용자가 직접 Kusting에 방문해야 해 콘텐츠 등록과 전달이 모두 사람의 반복 작업에 의존하고 있었습니다.
원인 분석
글 작성과 서비스 등록이 분리되어 있어 작성자가 등록 절차를 잊거나 늦게 수행하면 실제 글과 Kusting 데이터가 일치하지 않았습니다.
운영자가 작성 현황을 일일이 대조하는 방식으로는 누락을 사전에 막기 어려웠고, 새 콘텐츠를 사용자에게 전달하는 별도의 흐름도 필요했습니다.
해결
스터디원 블로그에서 신규 글을 수집해 자동으로 등록하는 크롤링 흐름을 구축했습니다. 실제 작성 글과 등록 데이터를 일주일 단위로 대조해 수집 결과를 검증했습니다.
PWA와 Firebase Messaging을 연결해 새 콘텐츠가 등록되면 사용자에게 Push 알림을 보내도록 구성했습니다. 운영자는 반복 등록 작업을 하지 않고, 사용자는 직접 방문하지 않아도 새 글을 확인할 수 있게 했습니다.
결과
일주일 기준 게시글 등록 누락을 9건에서 0건으로 줄이고, 글 한 건당 약 38초가 들던 수동 등록 시간을 제거했습니다. 자동 수집과 Push 알림을 적용한 뒤 게시글당 평균 조회수 21회를 기록했습니다.
Case 03
스터디 활동이 카카오톡과 사이트로 분리되어 있음
문제
스터디 콘텐츠와 참여 활동은 Kusting에서 제공했지만 일정 투표는 카카오톡에서 별도로 진행했습니다.
사용자가 일정을 놓치는 문제는 없었지만 사이트를 이용하다가 일정 조율을 위해 카카오톡으로 이동해야 했습니다. 운영자도 사이트와 카카오톡을 함께 사용하며 콘텐츠와 일정을 각각 관리해야 해 Kusting만으로 전체 활동을 완료할 수 없는 상태였습니다.
원인 분석
Kusting은 콘텐츠 탐색과 스터디 참여 기능을 제공했지만 일정 결정 과정은 기존 카카오톡 운영 방식에 의존하고 있었습니다. 하나의 스터디 활동이 여러 플랫폼에 분산되어 사용자는 사이트와 카카오톡을 오가야 했습니다.
사용자가 Kusting에 지속적으로 접속하고 있었기 때문에 일정 투표와 참여 과정도 제품 내부에 포함하면 플랫폼 전환을 줄이고 운영 흐름을 하나로 묶을 수 있다고 판단했습니다.
해결
Kusting 내부에 캘린더 기반 일정 투표 기능을 구현했습니다. 운영자가 투표 가능한 날짜와 마감일을 등록하면 사용자는 캘린더에서 가능한 날짜를 선택하고, 마감일이 지나면 투표가 자동으로 종료되도록 구성했습니다.
사용자가 사이트를 계속 확인하지 않아도 새로운 투표가 생성된 사실을 알 수 있도록 Firebase Messaging 기반 PWA Push를 연결했습니다. 확인된 알림 범위에 맞춰 투표 시작 시점에만 Push를 발송하도록 구현했습니다.

결과
카카오톡에서 별도로 진행하던 일정 투표를 Kusting 내부로 통합했습니다. 사용자는 콘텐츠 확인과 일정 투표를 하나의 플랫폼에서 이어서 진행할 수 있게 됐고, 운영자는 마감일 이후 투표 상태를 직접 변경하지 않아도 됐습니다. 별도의 정량 지표는 수집하지 않았지만 실제 사용자에게 통합된 일정 투표 경험에 대한 긍정적인 반응을 확인했습니다.
From the blog