라떼군 이야기
정적 블로그에 ‘댓글’을 달고 싶다면? Bluesky로 DevOps 없이 코멘트 섹션 붙이기
TL;DR 정적 사이트의 고질적인 문제인 ‘댓글’을, 별도 서버 운영 없이 Bluesky의 공개 API로 해결한 사례다. 작성자는 게시글에 대응하는 Bluesky 포스트를 메타데이터로 연결하고, 해당 포스트의 답글을 불러와 읽기 전용 댓글 UI로 렌더링했다. 핵심은 “대화는 소셜 플랫폼에 맡기고, 사이트는 표시만 한다”는 분업 설계다.
개인 블로그나 문서 사이트는 정적 생성(SSG)과 CDN 호스팅 덕분에 빠르고 저렴하지만, 댓글 같은 ‘동적 기능’은 늘 골칫거리다. 댓글을 직접 운영하려면 DB, 인증, 스팸/봇 대응, 모더레이션까지 떠안게 되어 결국 ‘취미 개발자 → 파트타임 운영자(DevOps)’로 전직하기 쉽다. 이 글은 그 부담을 최소화하면서도 사이트 안에서 대화를 보여주는 방법으로 Bluesky를 댓글 백엔드처럼 활용한다. 특히 Bluesky가 공개 API를 제공하고, 비교적 개방적인 생태계(AT Proto)를 지향한다는 점이 선택의 배경으로 등장한다.
핵심 내용
작성자는 정적 블로그에 댓글을 달고 싶었지만, 별도 VPS/클라우드로 동적 서비스를 운영하는 비용과 시간을 피하고자 했다. 대신 각 글에 대응하는 Bluesky 포스트를 하나 정해 메타데이터로 저장해두고, 페이지 로드 시 Bluesky API에서 그 포스트의 ‘replies’를 가져와 댓글처럼 표시하는 방식을 택했다. 구현은 TypeScript 기반으로 Bluesky SDK를 사용했고, 특정 AT Protocol URI를 입력으로 받아 스레드(원문+답글)를 반환하는 엔드포인트를 호출해 데이터를 얻는다. 데이터 페칭은 컴포넌트에서 직접 처리하는 대신 TanStack Query를 써서 로딩/에러/재시도 같은 상태 관리를 단순화했다. UI는 Bluesky의 풍부한 포스트 구조(마크업/첨부/참조)를 모두 구현하기보다 텍스트 중심으로 단순화하고, 스레드형 답글은 들여쓰기와 왼쪽 보더로 가독성을 확보했으며, 참여는 Bluesky 원문 링크로 유도하는 ‘읽기 전용 댓글’로 마무리했다.
기술적 인사이트
이 접근은 ‘댓글 시스템을 만든다’가 아니라 ‘대화의 소스 오브 트루스(SoT)를 외부에 둔다’는 아키텍처 전환이다: 사이트는 렌더러, Bluesky는 인증·저장·스팸·모더레이션을 담당한다. 전통적인 Disqus류 임베드나 자체 댓글 대비 장점은 운영 부담이 거의 없고(서버/DB 불필요), 계정/모더레이션이 플랫폼에 위임되며, 공개 API 기반이라 커스터마이징 여지가 크다는 점이다. 반면 트레이드오프도 명확하다: 플랫폼 의존(가용성/정책 변경), 댓글의 소유권·백업·검색성 문제, 그리고 ‘사이트 내에서 바로 쓰기’가 아니라 외부(Bluesky)로 이동해야 하는 UX 마찰이 생긴다. 또한 Bluesky의 리치 텍스트/임베드/미디어를 모두 지원하지 않으면 표현력이 제한되고, 스레드 정렬·중첩 깊이·모바일 레이아웃 같은 UI 난이도가 생각보다 크다. 결과적으로 이 설계는 “완전한 댓글 제품”이 아니라 “가벼운 커뮤니티 창구”에 최적화된 선택이며, 요구사항(소유/UX/기능)과 운영 여력 사이의 균형점을 잘 보여준다.
시사점
개인 개발자나 소규모 팀은 댓글을 ‘기능’이 아니라 ‘운영 비용’으로 보고, 가능한 한 외부 플랫폼과 분업하는 전략을 택할 수 있다. 정적 사이트에서도 메타데이터로 외부 대화 스레드를 연결하면, 콘텐츠 파이프라인(SSG/MDX)과 커뮤니티를 느슨하게 결합할 수 있어 확장성이 좋아진다. 실무적으로는 “읽기 전용 임베드 → 필요 시 OAuth로 쓰기 기능 추가”처럼 단계적 도입이 가능하며, TanStack Query 같은 데이터 페칭 계층을 두면 API 변경/에러 처리에 강해진다. 다만 조직/프로덕트 성격상 데이터 보존, 규정 준수, 접근성, 벤더 락인 리스크가 중요하다면 자체 호스팅이나 GitHub Discussions 같은 대안을 함께 비교해야 한다.
댓글을 직접 운영하는 대신, ‘대화가 이미 일어나는 곳’을 사이트로 끌어오는 방식은 앞으로 더 흔해질 수 있다. 당신의 사이트에 필요한 것은 완벽한 댓글 제품인가, 아니면 참여를 유도하는 최소한의 대화 창구인가? 외부 플랫폼에 의존하는 만큼, 장기적으로는 데이터 보존(아카이빙)과 플랫폼 변화에 대비한 추상화 계층을 어디까지 둘지 고민해볼 만하다.