Backend
home
💬

oopy 블로그 Giscus 댓글 기능 연동 (Utterances → Giscus 전환)

생성 일시
2026/04/11 05:24
유형
Workflow Setting

작업 개요

oopy 블로그에 댓글 기능을 연동했다. 처음엔 Utterances로 시작했으나 GitHub Issues 기반의 한계(카테고리 분류 불가, 반응 이모지 없음 등)로 인해 Giscus로 최종 전환했다.

연동 대상

블로그 플랫폼: oopy (codesche.oopy.io)
댓글 저장소: codesche/blog-comment-repo (GitHub Public Repository)
최종 댓글 시스템: Giscus (GitHub Discussions 기반)

작업 흐름 전체 요약

Utterances → Giscus 전환 이유

항목
Utterances
Giscus
기반
GitHub Issues
GitHub Discussions
카테고리 분류
❌
✅ General 등
반응 이모지
❌
✅
대댓글
❌
✅
비용
무료
무료

최종 적용 설정값

항목
data-repo
codesche/blog-comment-repo
data-repo-id
R_kgDOR_oZIw
data-category
General
data-category-id
DIC_kwDOR_oZI84C6lrv
data-mapping
pathname
data-theme
dark
data-lang
ko

oopy HTML body 태그 최종 코드

<script> (function() { var observer = new MutationObserver(function() { var container = document.querySelector('div.notion-page-content'); if (container) { observer.disconnect(); // 댓글창 상단 여백 조절 var style = document.createElement('style'); style.innerHTML = '.giscus { margin-top: -40px !important; }'; document.head.appendChild(style); var script = document.createElement('script'); script.src = 'https://giscus.app/client.js'; script.setAttribute('data-repo', 'codesche/blog-comment-repo'); script.setAttribute('data-repo-id', 'R_kgDOR_oZIw'); script.setAttribute('data-category', 'General'); script.setAttribute('data-category-id', 'DIC_kwDOR_oZI84C6lrv'); script.setAttribute('data-mapping', 'pathname'); script.setAttribute('data-strict', '0'); script.setAttribute('data-reactions-enabled', '1'); script.setAttribute('data-emit-metadata', '0'); script.setAttribute('data-input-position', 'bottom'); script.setAttribute('data-theme', 'dark'); script.setAttribute('data-lang', 'ko'); script.setAttribute('crossorigin', 'anonymous'); script.async = true; container.appendChild(script); } }); observer.observe(document.body, { childList: true, subtree: true }); })(); </script>
JavaScript
복사

특이사항

blog-repository는 최종적으로 Private 유지 (블로그 포스트 및 코드 저장용)
댓글 전용 blog-comment-repo는 Public 유지 필수 (Giscus API 접근 조건)
oopy Utterances 플러그인은 Repo name을 비워서 비활성화 처리
MutationObserver를 사용한 이유: oopy가 Notion 페이지를 비동기로 렌더링하기 때문에 콘텐츠 로드 완료 후 스크립트를 삽입해야 정상 작동함

적용결과