어제(10월 30일) 저녁부터, 블로그에 댓글 게시가 가능해졌습니다!
잘 되나요?

10월 30일 현재의 댓글 작성 UI.

별도 가입 없이 닉네임, 이메일 및 선택적으로 개인 사이트를 입력받는 구조입니다. 다만 페이지에는 닉네임/(개인 사이트)/댓글 내용만 노출되고, 이메일은 데이터베이스에만 저장되기 때문에 공개되지 않습니다.

구현

Giscus

사실, Quartz에는 Giscus를 이용해 댓글을 구현하는 플러그인이 이미 존재합니다. 그렇지만, Giscus는 깃허브 계정으로 로그인해야만 댓글을 작성할 수 있다는 치명적인 단점이 존재합니다. 다른 블로그처럼 로그인 없이(중요) 댓글을 남기도록 하는 것을 저는 원했기 때문에, 결국 이 플러그인을 사용할 수는 없었습니다.

Cloudflare D1

현재 저의 블로그는 Cloudflare R2 버킷에 이미지를 저장하는데, 댓글 저장에는 Cloudflare D1 데이터베이스를 사용하게 되었습니다. R2는 파일 저장용 서비스이고, D1은 SQLite 데이터베이스라는 차이가 있지만, 개인 블로그로 쓰기에는 상당히 넉넉한 무료 사용량을 제공하기 때문에 현재 제 사이트 유지 비용은 도메인 연장에 들어가는 비용 외에는 전무합니다.

아무튼, 댓글 하나는 이렇게 저장됩니다:

  • 고유 ID
  • 닉네임
  • 이메일
  • 웹사이트
  • 댓글 내용
  • 부모 댓글(대댓글 기능 구현)

이후 게시글에 접속하면 데이터베이스에 쿼리를 날려서 댓글 정보를 받아오게 됩니다.

Cloudflare Turnstile

로그인 없이 댓글을 달 수 있다는 시스템의 장점이자 단점은, 바로 누구나 댓글을 달 수 있다는 것입니다. 여기서 그 ‘누구나’라는 단어에는 봇도 포함될 수 있고, 여기서 문제가 발생합니다. 아무리 작은 가능성이라도, 봇이 대규모로 댓글을 작성해서 제 사이트를 포화시킬 수 있다는 걱정이 바로 그것인데, 이걸 해결하기 위해 Cloudflare Turnstile을 사용했습니다. 또 클라우드플레어입니다!!

Pasted image 20261031163355.png
Turnstile 위젯.

Turnstile이 무엇인가 하면, 여러분도 인터넷에서 상당히 자주 보셨을 저 봇 검사용 위젯입니다. 일단 이걸로 봇에 대한 최소한의 방어 장치는 갖추게 된 셈입니다. 다만 인간이 직접 스팸을 작성하는 건 못 막는데, 이 문제는 제 사이트가 그 정도로 유명해질 때 다시 생각해 보도록 하겠습니다.

새로운 Quartz 플러그인

Cloudflare D1과 Turnstile를 이용한 댓글 시스템을 구현한 플러그인이 없는 것 같기 때문에, gpt를 시켜서 새로운 플러그인을 만들었습니다. 코덱스 안 쓰고 그냥 웹에서 시켰는데, github 플러그인 연결하고 레포지토리 주소를 주니까 알아서 커밋하고 PR까지 써 줬습니다. 참 편리한 세상입니다.

현재 이슈

다만 완벽히 구현된 건 아니고, 그렇게 치명적이지는 않지만 확인된 이슈가 몇 개 있습니다:

  • 대댓글을 달면 점점 오른쪽으로 들여쓰기가 적용되는데, 이게 제한이 없기 때문에 너무 많아지면 가독성이 떨어질 수 있다는 위험이 있습니다
  • 댓글을 작성하면, 해당 댓글과 연결되지 않은 댓글의 대댓글이 모두 자동으로 접히는데, 이걸 다시 펴려면 새로고침을 해야 합니다

일단 그렇게 급하지는 않은 것 같기 때문에, 나중에 시간이 나면 고치도록 하겠습니다. 2026년 안에는 고치려고 합니다.

후기

Giscus를 안 쓰고 귀찮은 길로 돌아갔지만, 딱히 후회되지는 않습니다. D1 데이터베이스 만져보면서 기본적인 SQL 문법도 알게 되고, 클라우드플레어 Turnstile도 써 보는 유익한 경험이었던 것 같습니다.

그렇지만 gpt가 코드를 다 쓰다시피 해서, 웹 개발에는 아직도 익숙하지가 않습니다. 좀 더 복잡한 프로젝트에서는 바이브 코딩만으로는 제대로 진행되지 않을 텐데, 결국 웹 개발도 본격적으로 배워야 하겠다는 생각을 하게 되었습니다.