<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog on 0AndWild_log</title><link>https://0andwild.com/series/blog/</link><description>Recent content in Blog on 0AndWild_log</description><generator>Hugo -- gohugo.io</generator><language>ko-KR</language><lastBuildDate>Fri, 17 Oct 2025 12:00:00 +0900</lastBuildDate><atom:link href="https://0andwild.com/series/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Giscus로 Hugo 블로그에 댓글 기능 추가하기</title><link>https://0andwild.com/posts/251017_comments_giscus/</link><pubDate>Fri, 17 Oct 2025 12:00:00 +0900</pubDate><guid>https://0andwild.com/posts/251017_comments_giscus/</guid><description>&lt;img src="https://0andwild.com/" alt="Featured image of post Giscus로 Hugo 블로그에 댓글 기능 추가하기" /&gt;&lt;h2 id="giscus란"&gt;&lt;a href="#giscus%eb%9e%80" class="header-anchor"&gt;&lt;/a&gt;Giscus란?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Giscus&lt;/strong&gt;는 GitHub Discussions를 백엔드로 사용하는 오픈소스 댓글 시스템입니다.&lt;/p&gt;
&lt;h3 id="주요-특징"&gt;&lt;a href="#%ec%a3%bc%ec%9a%94-%ed%8a%b9%ec%a7%95" class="header-anchor"&gt;&lt;/a&gt;주요 특징
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;완전 무료&lt;/strong&gt; (GitHub 기능 활용)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;서버 불필요&lt;/strong&gt; (GitHub이 모든 것을 처리)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Markdown 완벽 지원&lt;/strong&gt; (코드 블록, 이미지, 표 등)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;반응(Reactions)&lt;/strong&gt; (👍, ❤️, 😄 등)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;GitHub 알림&lt;/strong&gt; (댓글 달리면 알림 받음)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;다크모드&lt;/strong&gt; (블로그 테마와 자동 동기화)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;데이터 소유&lt;/strong&gt; (본인 저장소에 저장)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="utterances와의-차이점"&gt;&lt;a href="#utterances%ec%99%80%ec%9d%98-%ec%b0%a8%ec%9d%b4%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;Utterances와의 차이점
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;기능&lt;/th&gt;
					&lt;th&gt;Giscus&lt;/th&gt;
					&lt;th&gt;Utterances&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;백엔드&lt;/td&gt;
					&lt;td&gt;GitHub Discussions&lt;/td&gt;
					&lt;td&gt;GitHub Issues&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;반응&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;대댓글&lt;/td&gt;
					&lt;td&gt;✅ (중첩)&lt;/td&gt;
					&lt;td&gt;⚠️ (flat)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;댓글 정렬&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⚠️&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;적합성&lt;/td&gt;
					&lt;td&gt;댓글 전용&lt;/td&gt;
					&lt;td&gt;이슈 트래킹&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;결론&lt;/strong&gt;: Giscus가 Utterances의 상위 호환입니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="사전-준비"&gt;&lt;a href="#%ec%82%ac%ec%a0%84-%ec%a4%80%eb%b9%84" class="header-anchor"&gt;&lt;/a&gt;사전 준비
&lt;/h2&gt;&lt;h3 id="필요한-것"&gt;&lt;a href="#%ed%95%84%ec%9a%94%ed%95%9c-%ea%b2%83" class="header-anchor"&gt;&lt;/a&gt;필요한 것
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;GitHub 계정&lt;/li&gt;
&lt;li&gt;Public GitHub 저장소 (블로그 저장소)&lt;/li&gt;
&lt;li&gt;Hugo + Blowfish 테마&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="제약사항"&gt;&lt;a href="#%ec%a0%9c%ec%95%bd%ec%82%ac%ed%95%ad" class="header-anchor"&gt;&lt;/a&gt;제약사항
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Public 저장소만 가능&lt;/strong&gt; (Private 저장소는 Discussions 기능 제한)&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;GitHub 계정 필요&lt;/strong&gt; (익명 댓글 불가)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="1단계-github-discussions-활성화"&gt;&lt;a href="#1%eb%8b%a8%ea%b3%84-github-discussions-%ed%99%9c%ec%84%b1%ed%99%94" class="header-anchor"&gt;&lt;/a&gt;1단계: GitHub Discussions 활성화
&lt;/h2&gt;&lt;h3 id="11-저장소-설정-페이지-이동"&gt;&lt;a href="#11-%ec%a0%80%ec%9e%a5%ec%86%8c-%ec%84%a4%ec%a0%95-%ed%8e%98%ec%9d%b4%ec%a7%80-%ec%9d%b4%eb%8f%99" class="header-anchor"&gt;&lt;/a&gt;1.1 저장소 설정 페이지 이동
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;GitHub에서 블로그 저장소 접속&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;예: https://github.com/0AndWild/0AndWild.github.io
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Settings&lt;/strong&gt; 탭 클릭&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="12-discussions-활성화"&gt;&lt;a href="#12-discussions-%ed%99%9c%ec%84%b1%ed%99%94" class="header-anchor"&gt;&lt;/a&gt;1.2 Discussions 활성화
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;페이지를 아래로 스크롤하여 &lt;strong&gt;Features&lt;/strong&gt; 섹션 찾기&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Discussions&lt;/strong&gt; 체크박스를 ✅ 체크&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;자동으로 저장됨&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="13-확인"&gt;&lt;a href="#13-%ed%99%95%ec%9d%b8" class="header-anchor"&gt;&lt;/a&gt;1.3 확인
&lt;/h3&gt;&lt;p&gt;저장소 상단에 &lt;strong&gt;Discussions&lt;/strong&gt; 탭이 생성되었는지 확인&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Code | Issues | Pull requests | Discussions | ← 새로 생김!
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="2단계-giscus-app-설치"&gt;&lt;a href="#2%eb%8b%a8%ea%b3%84-giscus-app-%ec%84%a4%ec%b9%98" class="header-anchor"&gt;&lt;/a&gt;2단계: Giscus App 설치
&lt;/h2&gt;&lt;h3 id="21-giscus-github-app-설치"&gt;&lt;a href="#21-giscus-github-app-%ec%84%a4%ec%b9%98" class="header-anchor"&gt;&lt;/a&gt;2.1 Giscus GitHub App 설치
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/apps/giscus" target="_blank" rel="noopener"
 &gt;https://github.com/apps/giscus&lt;/a&gt; 접속&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt; 버튼 클릭&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;권한 선택:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;All repositories&lt;/strong&gt; (모든 저장소)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Only select repositories&lt;/strong&gt; (특정 저장소만 - 권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;블로그 저장소 선택:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;0AndWild/0AndWild.github.io
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt; 클릭&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="22-권한-확인"&gt;&lt;a href="#22-%ea%b6%8c%ed%95%9c-%ed%99%95%ec%9d%b8" class="header-anchor"&gt;&lt;/a&gt;2.2 권한 확인
&lt;/h3&gt;&lt;p&gt;Giscus가 요청하는 권한:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Read access to discussions&lt;/strong&gt; (토론 읽기)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Write access to discussions&lt;/strong&gt; (토론 쓰기)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Read access to metadata&lt;/strong&gt; (메타데이터 읽기)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="3단계-giscus-설정-생성"&gt;&lt;a href="#3%eb%8b%a8%ea%b3%84-giscus-%ec%84%a4%ec%a0%95-%ec%83%9d%ec%84%b1" class="header-anchor"&gt;&lt;/a&gt;3단계: Giscus 설정 생성
&lt;/h2&gt;&lt;h3 id="31-giscus-웹사이트-접속"&gt;&lt;a href="#31-giscus-%ec%9b%b9%ec%82%ac%ec%9d%b4%ed%8a%b8-%ec%a0%91%ec%86%8d" class="header-anchor"&gt;&lt;/a&gt;3.1 Giscus 웹사이트 접속
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://giscus.app/ko" target="_blank" rel="noopener"
 &gt;https://giscus.app/ko&lt;/a&gt; 방문&lt;/p&gt;
&lt;h3 id="32-저장소-연결"&gt;&lt;a href="#32-%ec%a0%80%ec%9e%a5%ec%86%8c-%ec%97%b0%ea%b2%b0" class="header-anchor"&gt;&lt;/a&gt;3.2 저장소 연결
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;저장소&lt;/strong&gt; 섹션에 입력:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;0AndWild/0AndWild.github.io
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;아래에 성공 메시지가 표시되어야 함:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;✅ 성공! 이 저장소는 모든 조건을 만족합니다.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;만약 오류가 뜨면:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Discussions 활성화 확인&lt;/li&gt;
&lt;li&gt;Giscus App 설치 확인&lt;/li&gt;
&lt;li&gt;저장소가 Public인지 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="33-페이지--discussion-연결-방식"&gt;&lt;a href="#33-%ed%8e%98%ec%9d%b4%ec%a7%80--discussion-%ec%97%b0%ea%b2%b0-%eb%b0%a9%ec%8b%9d" class="header-anchor"&gt;&lt;/a&gt;3.3 페이지 ↔️ Discussion 연결 방식
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Discussion 카테고리&lt;/strong&gt; 섹션에서 선택:&lt;/p&gt;
&lt;h4 id="권장-pathname-경로명"&gt;&lt;a href="#%ea%b6%8c%ec%9e%a5-pathname-%ea%b2%bd%eb%a1%9c%eb%aa%85" class="header-anchor"&gt;&lt;/a&gt;권장: &lt;code&gt;pathname&lt;/code&gt; (경로명)
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;매핑: pathname 선택
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;각 블로그 포스트의 경로가 Discussion 제목이 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;포스트: &lt;code&gt;/posts/giscus-guide/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Discussion 제목: &lt;code&gt;posts/giscus-guide&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="대안들"&gt;&lt;a href="#%eb%8c%80%ec%95%88%eb%93%a4" class="header-anchor"&gt;&lt;/a&gt;대안들:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;URL&lt;/code&gt;: 전체 URL 사용 (도메인 변경 시 문제)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt;: 포스트 제목 사용 (제목 변경 시 문제)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;og:title&lt;/code&gt;: OpenGraph 제목&lt;/li&gt;
&lt;li&gt;&lt;code&gt;specific term&lt;/code&gt;: 직접 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;추천&lt;/strong&gt;: &lt;code&gt;pathname&lt;/code&gt; 사용&lt;/p&gt;
&lt;h3 id="34-discussion-카테고리-선택"&gt;&lt;a href="#34-discussion-%ec%b9%b4%ed%85%8c%ea%b3%a0%eb%a6%ac-%ec%84%a0%ed%83%9d" class="header-anchor"&gt;&lt;/a&gt;3.4 Discussion 카테고리 선택
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Discussion 카테고리&lt;/strong&gt; 드롭다운에서 선택:&lt;/p&gt;
&lt;h4 id="권장-announcements"&gt;&lt;a href="#%ea%b6%8c%ec%9e%a5-announcements" class="header-anchor"&gt;&lt;/a&gt;권장: &lt;code&gt;Announcements&lt;/code&gt;
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;카테고리: Announcements 선택
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;관리자만 새 Discussion 생성 가능&lt;/li&gt;
&lt;li&gt;댓글은 누구나 가능&lt;/li&gt;
&lt;li&gt;블로그 포스트용으로 최적&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="대안-general"&gt;&lt;a href="#%eb%8c%80%ec%95%88-general" class="header-anchor"&gt;&lt;/a&gt;대안: &lt;code&gt;General&lt;/code&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;누구나 Discussion 생성 가능&lt;/li&gt;
&lt;li&gt;더 개방적&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;추천&lt;/strong&gt;: &lt;code&gt;Announcements&lt;/code&gt; (블로그에 적합)&lt;/p&gt;
&lt;h3 id="35-기능-선택"&gt;&lt;a href="#35-%ea%b8%b0%eb%8a%a5-%ec%84%a0%ed%83%9d" class="header-anchor"&gt;&lt;/a&gt;3.5 기능 선택
&lt;/h3&gt;&lt;h4 id="반응-활성화"&gt;&lt;a href="#%eb%b0%98%ec%9d%91-%ed%99%9c%ec%84%b1%ed%99%94" class="header-anchor"&gt;&lt;/a&gt;반응 활성화
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;✅ 반응 활성화
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;사용자가 👍, ❤️, 😄 등으로 반응 가능&lt;/p&gt;
&lt;h4 id="메타데이터-보내기"&gt;&lt;a href="#%eb%a9%94%ed%83%80%eb%8d%b0%ec%9d%b4%ed%84%b0-%eb%b3%b4%eb%82%b4%ea%b8%b0" class="header-anchor"&gt;&lt;/a&gt;메타데이터 보내기
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;□ 메타데이터 보내기 (체크 해제 권장)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;불필요한 기능, 꺼두는 것이 좋음&lt;/p&gt;
&lt;h4 id="댓글-입력란-위치"&gt;&lt;a href="#%eb%8c%93%ea%b8%80-%ec%9e%85%eb%a0%a5%eb%9e%80-%ec%9c%84%ec%b9%98" class="header-anchor"&gt;&lt;/a&gt;댓글 입력란 위치
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;⚪ 댓글 위에
⚪ 댓글 아래 (권장)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;권장&lt;/strong&gt;: 댓글 아래&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기존 댓글을 먼저 읽고 작성하도록 유도&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="느긋한-로딩"&gt;&lt;a href="#%eb%8a%90%ea%b8%8b%ed%95%9c-%eb%a1%9c%eb%94%a9" class="header-anchor"&gt;&lt;/a&gt;느긋한 로딩
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;✅ 느긋한 로딩
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;페이지 로딩 속도 향상 (권장)&lt;/p&gt;
&lt;h3 id="36-테마-선택"&gt;&lt;a href="#36-%ed%85%8c%eb%a7%88-%ec%84%a0%ed%83%9d" class="header-anchor"&gt;&lt;/a&gt;3.6 테마 선택
&lt;/h3&gt;&lt;h4 id="권장-preferred_color_scheme"&gt;&lt;a href="#%ea%b6%8c%ec%9e%a5-preferred_color_scheme" class="header-anchor"&gt;&lt;/a&gt;권장: &lt;code&gt;preferred_color_scheme&lt;/code&gt;
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;테마: preferred_color_scheme
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;동작&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사용자의 시스템 설정에 따라 자동 전환&lt;/li&gt;
&lt;li&gt;다크모드 ↔️ 라이트모드 자동&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="대안"&gt;&lt;a href="#%eb%8c%80%ec%95%88" class="header-anchor"&gt;&lt;/a&gt;대안:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;light&lt;/code&gt;: 항상 밝은 테마&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dark&lt;/code&gt;: 항상 어두운 테마&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transparent_dark&lt;/code&gt;: 투명 다크&lt;/li&gt;
&lt;li&gt;기타 GitHub 테마들&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;추천&lt;/strong&gt;: &lt;code&gt;preferred_color_scheme&lt;/code&gt; (자동 전환)&lt;/p&gt;
&lt;h3 id="37-언어-설정"&gt;&lt;a href="#37-%ec%96%b8%ec%96%b4-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;3.7 언어 설정
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;언어: ko (한국어)
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="4단계-생성된-코드-복사"&gt;&lt;a href="#4%eb%8b%a8%ea%b3%84-%ec%83%9d%ec%84%b1%eb%90%9c-%ec%bd%94%eb%93%9c-%eb%b3%b5%ec%82%ac" class="header-anchor"&gt;&lt;/a&gt;4단계: 생성된 코드 복사
&lt;/h2&gt;&lt;h3 id="41-스크립트-복사"&gt;&lt;a href="#41-%ec%8a%a4%ed%81%ac%eb%a6%bd%ed%8a%b8-%eb%b3%b5%ec%82%ac" class="header-anchor"&gt;&lt;/a&gt;4.1 스크립트 복사
&lt;/h3&gt;&lt;p&gt;페이지 하단에 &lt;strong&gt;Enable giscus&lt;/strong&gt; 섹션에서 생성된 코드 복사:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://giscus.app/client.js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0AndWild/0AndWild.github.io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;R_kgDOxxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Announcements&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;DIC_kwDOxxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pathname&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-strict&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-reactions-enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-emit-metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-input-position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;preferred_color_scheme&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ko&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-loading&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;lazy&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;anonymous&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="42-중요한-값들"&gt;&lt;a href="#42-%ec%a4%91%ec%9a%94%ed%95%9c-%ea%b0%92%eb%93%a4" class="header-anchor"&gt;&lt;/a&gt;4.2 중요한 값들
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;data-repo-id&lt;/code&gt;: 저장소 고유 ID (자동 생성)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;data-category-id&lt;/code&gt;: 카테고리 고유 ID (자동 생성)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 값들은 본인의 저장소마다 다르므로, 반드시 Giscus 웹사이트에서 생성된 코드를 사용해야 합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="5단계-blowfish-테마에-통합"&gt;&lt;a href="#5%eb%8b%a8%ea%b3%84-blowfish-%ed%85%8c%eb%a7%88%ec%97%90-%ed%86%b5%ed%95%a9" class="header-anchor"&gt;&lt;/a&gt;5단계: Blowfish 테마에 통합
&lt;/h2&gt;&lt;h3 id="51-디렉토리-생성"&gt;&lt;a href="#51-%eb%94%94%eb%a0%89%ed%86%a0%eb%a6%ac-%ec%83%9d%ec%84%b1" class="header-anchor"&gt;&lt;/a&gt;5.1 디렉토리 생성
&lt;/h3&gt;&lt;p&gt;터미널에서 블로그 루트 디렉토리로 이동 후:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p layouts/partials
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="52-commentshtml-파일-생성"&gt;&lt;a href="#52-commentshtml-%ed%8c%8c%ec%9d%bc-%ec%83%9d%ec%84%b1" class="header-anchor"&gt;&lt;/a&gt;5.2 comments.html 파일 생성
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch layouts/partials/comments.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;또는 IDE/에디터에서 직접 생성:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;layouts/
 └── partials/
 └── comments.html ← 새로 생성
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="53-giscus-코드-삽입"&gt;&lt;a href="#53-giscus-%ec%bd%94%eb%93%9c-%ec%82%bd%ec%9e%85" class="header-anchor"&gt;&lt;/a&gt;5.3 Giscus 코드 삽입
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;layouts/partials/comments.html&lt;/code&gt; 파일에 다음 내용 추가:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- Giscus 댓글 시스템 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://giscus.app/client.js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0AndWild/0AndWild.github.io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;R_kgDOxxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Announcements&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;DIC_kwDOxxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pathname&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-strict&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-reactions-enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-emit-metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-input-position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;preferred_color_scheme&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ko&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-loading&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;lazy&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;anonymous&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;⚠️ &lt;strong&gt;주의&lt;/strong&gt;: 위의 &lt;code&gt;data-repo-id&lt;/code&gt;와 &lt;code&gt;data-category-id&lt;/code&gt; 값을 &lt;strong&gt;본인의 값으로 교체&lt;/strong&gt;해야 합니다!&lt;/p&gt;
&lt;h3 id="54-paramstoml-설정"&gt;&lt;a href="#54-paramstoml-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;5.4 params.toml 설정
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;config/_default/params.toml&lt;/code&gt; 파일을 열고 &lt;code&gt;[article]&lt;/code&gt; 섹션에 추가:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;showComments&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c"&gt;# 이 줄 추가 또는 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;# ... 기타 설정들&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;이미 &lt;code&gt;showComments&lt;/code&gt; 항목이 있다면 &lt;code&gt;true&lt;/code&gt;로 설정되어 있는지 확인하세요.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="6단계-로컬-테스트"&gt;&lt;a href="#6%eb%8b%a8%ea%b3%84-%eb%a1%9c%ec%bb%ac-%ed%85%8c%ec%8a%a4%ed%8a%b8" class="header-anchor"&gt;&lt;/a&gt;6단계: 로컬 테스트
&lt;/h2&gt;&lt;h3 id="61-hugo-서버-실행"&gt;&lt;a href="#61-hugo-%ec%84%9c%eb%b2%84-%ec%8b%a4%ed%96%89" class="header-anchor"&gt;&lt;/a&gt;6.1 Hugo 서버 실행
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server -D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="62-브라우저에서-확인"&gt;&lt;a href="#62-%eb%b8%8c%eb%9d%bc%ec%9a%b0%ec%a0%80%ec%97%90%ec%84%9c-%ed%99%95%ec%9d%b8" class="header-anchor"&gt;&lt;/a&gt;6.2 브라우저에서 확인
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;http://localhost:1313
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;포스트 페이지 하단에 Giscus 댓글 위젯이 표시되어야 합니다.&lt;/p&gt;
&lt;h3 id="63-테스트-댓글-작성"&gt;&lt;a href="#63-%ed%85%8c%ec%8a%a4%ed%8a%b8-%eb%8c%93%ea%b8%80-%ec%9e%91%ec%84%b1" class="header-anchor"&gt;&lt;/a&gt;6.3 테스트 댓글 작성
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GitHub으로 로그인&lt;/strong&gt; 버튼 클릭&lt;/li&gt;
&lt;li&gt;GitHub OAuth 인증&lt;/li&gt;
&lt;li&gt;테스트 댓글 작성&lt;/li&gt;
&lt;li&gt;댓글이 표시되는지 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="64-github-discussions-확인"&gt;&lt;a href="#64-github-discussions-%ed%99%95%ec%9d%b8" class="header-anchor"&gt;&lt;/a&gt;6.4 GitHub Discussions 확인
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;GitHub 저장소 → &lt;strong&gt;Discussions&lt;/strong&gt; 탭&lt;/li&gt;
&lt;li&gt;Announcements 카테고리에 새 Discussion 생성되었는지 확인&lt;/li&gt;
&lt;li&gt;Discussion 제목이 포스트 경로인지 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="7단계-배포"&gt;&lt;a href="#7%eb%8b%a8%ea%b3%84-%eb%b0%b0%ed%8f%ac" class="header-anchor"&gt;&lt;/a&gt;7단계: 배포
&lt;/h2&gt;&lt;h3 id="71-git에-커밋"&gt;&lt;a href="#71-git%ec%97%90-%ec%bb%a4%eb%b0%8b" class="header-anchor"&gt;&lt;/a&gt;7.1 Git에 커밋
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add layouts/partials/comments.html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add config/_default/params.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Add Giscus comments system&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="72-github에-푸시"&gt;&lt;a href="#72-github%ec%97%90-%ed%91%b8%ec%8b%9c" class="header-anchor"&gt;&lt;/a&gt;7.2 GitHub에 푸시
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push origin main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="73-github-actions-확인"&gt;&lt;a href="#73-github-actions-%ed%99%95%ec%9d%b8" class="header-anchor"&gt;&lt;/a&gt;7.3 GitHub Actions 확인
&lt;/h3&gt;&lt;p&gt;GitHub Actions가 자동으로 빌드 및 배포를 진행합니다.&lt;/p&gt;
&lt;p&gt;배포 상태 확인:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GitHub 저장소 → Actions 탭
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="74-배포된-사이트-확인"&gt;&lt;a href="#74-%eb%b0%b0%ed%8f%ac%eb%90%9c-%ec%82%ac%ec%9d%b4%ed%8a%b8-%ed%99%95%ec%9d%b8" class="header-anchor"&gt;&lt;/a&gt;7.4 배포된 사이트 확인
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;https://0andwild.github.io
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;포스트 페이지에 댓글 위젯이 정상적으로 표시되는지 확인하세요.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="고급-설정"&gt;&lt;a href="#%ea%b3%a0%ea%b8%89-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;고급 설정
&lt;/h2&gt;&lt;h3 id="다크모드-및-언어-동적-설정-권장"&gt;&lt;a href="#%eb%8b%a4%ed%81%ac%eb%aa%a8%eb%93%9c-%eb%b0%8f-%ec%96%b8%ec%96%b4-%eb%8f%99%ec%a0%81-%ec%84%a4%ec%a0%95-%ea%b6%8c%ec%9e%a5" class="header-anchor"&gt;&lt;/a&gt;다크모드 및 언어 동적 설정 (권장)
&lt;/h3&gt;&lt;p&gt;Blowfish 테마의 다크모드 토글과 언어 전환에 따라 Giscus가 자동으로 변경되도록 설정하는 완전한 방법입니다.&lt;/p&gt;
&lt;h4 id="완전한-동적-설정"&gt;&lt;a href="#%ec%99%84%ec%a0%84%ed%95%9c-%eb%8f%99%ec%a0%81-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;완전한 동적 설정
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;layouts/partials/comments.html&lt;/code&gt; 전체 코드:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- Giscus Comments with Dynamic Theme and Language --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ $lang := .Site.Language.Lang }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ $translationKey := .File.TranslationBaseName }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Get current theme (dark/light)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getGiscusTheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dark_tritanopia&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light_tritanopia&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Get language from Hugo template
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentLang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{{ $lang }}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Use file directory path for unified comments across languages
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Example: &amp;#34;posts/subscription_alert&amp;#34; for both index.ko.md and index.en.md
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;discussionId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{{ .File.Dir | replaceRE &amp;#34;^content/&amp;#34; &amp;#34;&amp;#34; | replaceRE &amp;#34;/$&amp;#34; &amp;#34;&amp;#34; }}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Wait for DOM to be ready
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readyState&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;loading&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;DOMContentLoaded&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initGiscus&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;initGiscus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;initGiscus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Create and insert Giscus script with dynamic settings
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;script&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://giscus.app/client.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-repo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0AndWild/0AndWild.github.io&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-repo-id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;R_kgDOQAqZFA&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-category&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;General&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-category-id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;DIC_kwDOQAqZFM4CwwRg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-mapping&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;specific&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-term&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discussionId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-strict&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-reactions-enabled&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-emit-metadata&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-input-position&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-theme&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getGiscusTheme&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-lang&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;currentLang&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-loading&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lazy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;crossorigin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;anonymous&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kr"&gt;async&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Find giscus container or create one
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.giscus-container&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentScript&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parentElement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Monitor theme changes and update Giscus
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;updateGiscusTheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;iframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;iframe.giscus-frame&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;iframe&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getGiscusTheme&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;iframe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;giscus&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;setConfig&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;https://giscus.app&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Giscus theme update delayed, will retry...&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Watch for theme changes using MutationObserver
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;MutationObserver&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;mutations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;mutations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;mutation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mutation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attributeName&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Delay update to ensure iframe is ready
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updateGiscusTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Start observing after a short delay
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;attributes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;attributeFilter&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Update theme when Giscus iframe loads
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://giscus.app&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;giscus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Giscus is ready, update theme
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updateGiscusTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;/* Ensure Giscus iframe has proper height and displays all content */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;giscus-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;min-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;giscus-container&lt;/span&gt; &lt;span class="nt"&gt;iframe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;giscus-frame&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;min-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;/* Make sure comment actions are visible */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;giscus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;visible&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;giscus-container&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="동작-방식-설명"&gt;&lt;a href="#%eb%8f%99%ec%9e%91-%eb%b0%a9%ec%8b%9d-%ec%84%a4%eb%aa%85" class="header-anchor"&gt;&lt;/a&gt;동작 방식 설명
&lt;/h4&gt;&lt;h5 id="1-언어-동적-설정"&gt;&lt;a href="#1-%ec%96%b8%ec%96%b4-%eb%8f%99%ec%a0%81-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;1. &lt;strong&gt;언어 동적 설정&lt;/strong&gt;
&lt;/h5&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nx"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Language&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;currentLang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nx"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Hugo 템플릿에서 현재 페이지 언어 가져오기&lt;/li&gt;
&lt;li&gt;한국어 페이지: &lt;code&gt;ko&lt;/code&gt;, 영어 페이지: &lt;code&gt;en&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Giscus에 해당 언어로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;결과&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;한국어 페이지 → Giscus UI가 한국어로 표시&lt;/li&gt;
&lt;li&gt;영어 페이지 → Giscus UI가 영어로 표시&lt;/li&gt;
&lt;li&gt;언어 전환 시 페이지 리로드되면서 자동으로 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="2-다크모드-동적-설정"&gt;&lt;a href="#2-%eb%8b%a4%ed%81%ac%eb%aa%a8%eb%93%9c-%eb%8f%99%ec%a0%81-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;2. &lt;strong&gt;다크모드 동적 설정&lt;/strong&gt;
&lt;/h5&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getGiscusTheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dark_tritanopia&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light_tritanopia&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Blowfish 테마는 다크모드 시 &lt;code&gt;&amp;lt;html class=&amp;quot;dark&amp;quot;&amp;gt;&lt;/code&gt; 추가&lt;/li&gt;
&lt;li&gt;이를 감지하여 테마 결정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dark_tritanopia&lt;/code&gt; / &lt;code&gt;light_tritanopia&lt;/code&gt; 테마 사용 (색맹 친화적)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;결과&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;페이지 로드 시: 현재 테마 상태로 Giscus 로드&lt;/li&gt;
&lt;li&gt;다크모드 토글 클릭 시: 실시간으로 Giscus 테마 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="3-언어별-댓글-통합"&gt;&lt;a href="#3-%ec%96%b8%ec%96%b4%eb%b3%84-%eb%8c%93%ea%b8%80-%ed%86%b5%ed%95%a9" class="header-anchor"&gt;&lt;/a&gt;3. &lt;strong&gt;언어별 댓글 통합&lt;/strong&gt;
&lt;/h5&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;discussionId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;replaceRE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;^content/&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;replaceRE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/$&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;파일 디렉토리 경로를 Discussion ID로 사용&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content/posts/subscription_alert/index.ko.md&lt;/code&gt; → &lt;code&gt;posts/subscription_alert&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content/posts/subscription_alert/index.en.md&lt;/code&gt; → &lt;code&gt;posts/subscription_alert&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;같은 ID이므로 한국어/영어 버전이 같은 댓글 공유&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;결과&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;한국어 포스트에서 작성한 댓글&lt;/li&gt;
&lt;li&gt;영어 포스트에서도 동일하게 표시&lt;/li&gt;
&lt;li&gt;포스트별로는 별도 Discussion 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="4-실시간-테마-변경-감지"&gt;&lt;a href="#4-%ec%8b%a4%ec%8b%9c%ea%b0%84-%ed%85%8c%eb%a7%88-%eb%b3%80%ea%b2%bd-%ea%b0%90%ec%a7%80" class="header-anchor"&gt;&lt;/a&gt;4. &lt;strong&gt;실시간 테마 변경 감지&lt;/strong&gt;
&lt;/h5&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;MutationObserver&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;mutations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;mutations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;mutation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mutation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attributeName&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updateGiscusTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MutationObserver&lt;/code&gt;로 HTML 클래스 변경 감지&lt;/li&gt;
&lt;li&gt;다크모드 토글 클릭 시 즉시 감지&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postMessage&lt;/code&gt;로 Giscus iframe에 테마 변경 명령 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="테스트-방법"&gt;&lt;a href="#%ed%85%8c%ec%8a%a4%ed%8a%b8-%eb%b0%a9%eb%b2%95" class="header-anchor"&gt;&lt;/a&gt;테스트 방법
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 로컬 서버 실행&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server -D
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 브라우저에서 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://localhost:1313/posts/subscription_alert/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;테스트 항목&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;✅ 페이지 로드 시 현재 테마(라이트/다크)로 Giscus 표시&lt;/li&gt;
&lt;li&gt;✅ 다크모드 토글 클릭 시 Giscus 테마 즉시 변경&lt;/li&gt;
&lt;li&gt;✅ 언어 전환 (ko → en) 시 Giscus 언어 변경&lt;/li&gt;
&lt;li&gt;✅ 한국어/영어 페이지에서 같은 댓글 표시&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="테마-옵션-변경"&gt;&lt;a href="#%ed%85%8c%eb%a7%88-%ec%98%b5%ec%85%98-%eb%b3%80%ea%b2%bd" class="header-anchor"&gt;&lt;/a&gt;테마 옵션 변경
&lt;/h4&gt;&lt;p&gt;다른 테마를 사용하려면 &lt;code&gt;getGiscusTheme()&lt;/code&gt; 함수 수정:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 기본 테마
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getGiscusTheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 고대비 테마
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getGiscusTheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dark_high_contrast&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light_high_contrast&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// GitHub 스타일 테마
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getGiscusTheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dark_dimmed&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;사용 가능한 테마&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;light&lt;/code&gt; / &lt;code&gt;dark&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;light_high_contrast&lt;/code&gt; / &lt;code&gt;dark_high_contrast&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;light_tritanopia&lt;/code&gt; / &lt;code&gt;dark_tritanopia&lt;/code&gt; (색맹 친화적)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dark_dimmed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transparent_dark&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preferred_color_scheme&lt;/code&gt; (시스템 설정 따름)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="정적-테마-설정-간단한-방법"&gt;&lt;a href="#%ec%a0%95%ec%a0%81-%ed%85%8c%eb%a7%88-%ec%84%a4%ec%a0%95-%ea%b0%84%eb%8b%a8%ed%95%9c-%eb%b0%a9%eb%b2%95" class="header-anchor"&gt;&lt;/a&gt;정적 테마 설정 (간단한 방법)
&lt;/h4&gt;&lt;p&gt;동적 변경이 필요 없다면 정적으로 설정 가능:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://giscus.app/client.js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0AndWild/0AndWild.github.io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;R_kgDOxxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;General&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;DIC_kwDOxxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pathname&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;preferred_color_scheme&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ko&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;anonymous&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;: 간단함
&lt;strong&gt;단점&lt;/strong&gt;: 실시간 테마 변경 불가, 언어별 댓글 분리됨&lt;/p&gt;
&lt;h3 id="포스트별-댓글-숨기기"&gt;&lt;a href="#%ed%8f%ac%ec%8a%a4%ed%8a%b8%eb%b3%84-%eb%8c%93%ea%b8%80-%ec%88%a8%ea%b8%b0%ea%b8%b0" class="header-anchor"&gt;&lt;/a&gt;포스트별 댓글 숨기기
&lt;/h3&gt;&lt;p&gt;특정 포스트에서만 댓글을 숨기려면, 해당 포스트의 front matter에:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;댓글 없는 포스트&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;showComments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 이 포스트만 댓글 숨김&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="카테고리별-댓글-분리"&gt;&lt;a href="#%ec%b9%b4%ed%85%8c%ea%b3%a0%eb%a6%ac%eb%b3%84-%eb%8c%93%ea%b8%80-%eb%b6%84%eb%a6%ac" class="header-anchor"&gt;&lt;/a&gt;카테고리별 댓글 분리
&lt;/h3&gt;&lt;p&gt;다른 카테고리의 포스트에 다른 Discussion 카테고리를 사용하려면:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 조건부 카테고리 설정 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Tutorial&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;DIC_kwDOxxxxTutorial&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;DIC_kwDOxxxxGeneral&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://giscus.app/client.js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ category }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="문제-해결"&gt;&lt;a href="#%eb%ac%b8%ec%a0%9c-%ed%95%b4%ea%b2%b0" class="header-anchor"&gt;&lt;/a&gt;문제 해결
&lt;/h2&gt;&lt;h3 id="댓글-위젯이-표시되지-않음"&gt;&lt;a href="#%eb%8c%93%ea%b8%80-%ec%9c%84%ec%a0%af%ec%9d%b4-%ed%91%9c%ec%8b%9c%eb%90%98%ec%a7%80-%ec%95%8a%ec%9d%8c" class="header-anchor"&gt;&lt;/a&gt;댓글 위젯이 표시되지 않음
&lt;/h3&gt;&lt;h4 id="원인-1-discussions-미활성화"&gt;&lt;a href="#%ec%9b%90%ec%9d%b8-1-discussions-%eb%af%b8%ed%99%9c%ec%84%b1%ed%99%94" class="header-anchor"&gt;&lt;/a&gt;원인 1: Discussions 미활성화
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;해결: GitHub 저장소 → Settings → Discussions 체크
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="원인-2-giscus-app-미설치"&gt;&lt;a href="#%ec%9b%90%ec%9d%b8-2-giscus-app-%eb%af%b8%ec%84%a4%ec%b9%98" class="header-anchor"&gt;&lt;/a&gt;원인 2: Giscus App 미설치
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;해결: https://github.com/apps/giscus 에서 Install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="원인-3-저장소-id-오류"&gt;&lt;a href="#%ec%9b%90%ec%9d%b8-3-%ec%a0%80%ec%9e%a5%ec%86%8c-id-%ec%98%a4%eb%a5%98" class="header-anchor"&gt;&lt;/a&gt;원인 3: 저장소 ID 오류
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;해결: giscus.app에서 코드 재생성
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="원인-4-showcomments-설정-누락"&gt;&lt;a href="#%ec%9b%90%ec%9d%b8-4-showcomments-%ec%84%a4%ec%a0%95-%eb%88%84%eb%9d%bd" class="header-anchor"&gt;&lt;/a&gt;원인 4: showComments 설정 누락
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# config/_default/params.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;showComments&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c"&gt;# 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="로그인-버튼만-보이고-댓글-못-씀"&gt;&lt;a href="#%eb%a1%9c%ea%b7%b8%ec%9d%b8-%eb%b2%84%ed%8a%bc%eb%a7%8c-%eb%b3%b4%ec%9d%b4%ea%b3%a0-%eb%8c%93%ea%b8%80-%eb%aa%bb-%ec%94%80" class="header-anchor"&gt;&lt;/a&gt;로그인 버튼만 보이고 댓글 못 씀
&lt;/h3&gt;&lt;h4 id="원인-github-oauth-승인-필요"&gt;&lt;a href="#%ec%9b%90%ec%9d%b8-github-oauth-%ec%8a%b9%ec%9d%b8-%ed%95%84%ec%9a%94" class="header-anchor"&gt;&lt;/a&gt;원인: GitHub OAuth 승인 필요
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. &lt;span class="s2"&gt;&amp;#34;GitHub으로 로그인&amp;#34;&lt;/span&gt; 클릭
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. OAuth 권한 승인
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 저장소로 리다이렉트
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 댓글 작성 가능
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="댓글이-저장되지-않음"&gt;&lt;a href="#%eb%8c%93%ea%b8%80%ec%9d%b4-%ec%a0%80%ec%9e%a5%eb%90%98%ec%a7%80-%ec%95%8a%ec%9d%8c" class="header-anchor"&gt;&lt;/a&gt;댓글이 저장되지 않음
&lt;/h3&gt;&lt;h4 id="원인-저장소-권한-문제"&gt;&lt;a href="#%ec%9b%90%ec%9d%b8-%ec%a0%80%ec%9e%a5%ec%86%8c-%ea%b6%8c%ed%95%9c-%eb%ac%b8%ec%a0%9c" class="header-anchor"&gt;&lt;/a&gt;원인: 저장소 권한 문제
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;확인 사항:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 저장소가 Public인지
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. Giscus App 권한에 저장소 포함되어 있는지
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. Discussion 카테고리가 존재하는지
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="다크모드가-동기화-안-됨"&gt;&lt;a href="#%eb%8b%a4%ed%81%ac%eb%aa%a8%eb%93%9c%ea%b0%80-%eb%8f%99%ea%b8%b0%ed%99%94-%ec%95%88-%eb%90%a8" class="header-anchor"&gt;&lt;/a&gt;다크모드가 동기화 안 됨
&lt;/h3&gt;&lt;h4 id="해결-javascript-동기화-코드-추가"&gt;&lt;a href="#%ed%95%b4%ea%b2%b0-javascript-%eb%8f%99%ea%b8%b0%ed%99%94-%ec%bd%94%eb%93%9c-%ec%b6%94%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;해결: JavaScript 동기화 코드 추가
&lt;/h4&gt;&lt;p&gt;위의 &amp;ldquo;고급 설정 &amp;gt; 다크모드 자동 전환&amp;rdquo; 참고&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="giscus-관리"&gt;&lt;a href="#giscus-%ea%b4%80%eb%a6%ac" class="header-anchor"&gt;&lt;/a&gt;Giscus 관리
&lt;/h2&gt;&lt;h3 id="댓글-관리"&gt;&lt;a href="#%eb%8c%93%ea%b8%80-%ea%b4%80%eb%a6%ac" class="header-anchor"&gt;&lt;/a&gt;댓글 관리
&lt;/h3&gt;&lt;h4 id="github-discussions에서-관리"&gt;&lt;a href="#github-discussions%ec%97%90%ec%84%9c-%ea%b4%80%eb%a6%ac" class="header-anchor"&gt;&lt;/a&gt;GitHub Discussions에서 관리
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. GitHub 저장소 → Discussions 탭
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 해당 Discussion 클릭
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 관리 작업:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 댓글 수정 &lt;span class="o"&gt;(&lt;/span&gt;본인 댓글만&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 댓글 삭제 &lt;span class="o"&gt;(&lt;/span&gt;관리자&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 사용자 차단 &lt;span class="o"&gt;(&lt;/span&gt;관리자&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Discussion 잠금 &lt;span class="o"&gt;(&lt;/span&gt;관리자&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="스팸-댓글-처리"&gt;&lt;a href="#%ec%8a%a4%ed%8c%b8-%eb%8c%93%ea%b8%80-%ec%b2%98%eb%a6%ac" class="header-anchor"&gt;&lt;/a&gt;스팸 댓글 처리
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. GitHub Discussions에서 스팸 댓글 찾기
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 댓글 옆 ... 메뉴 → &lt;span class="s2"&gt;&amp;#34;Delete&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 사용자 차단: 프로필 → Block user
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="알림-설정"&gt;&lt;a href="#%ec%95%8c%eb%a6%bc-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;알림 설정
&lt;/h3&gt;&lt;h4 id="github-알림으로-댓글-알림-받기"&gt;&lt;a href="#github-%ec%95%8c%eb%a6%bc%ec%9c%bc%eb%a1%9c-%eb%8c%93%ea%b8%80-%ec%95%8c%eb%a6%bc-%eb%b0%9b%ea%b8%b0" class="header-anchor"&gt;&lt;/a&gt;GitHub 알림으로 댓글 알림 받기
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. GitHub → Settings → Notifications
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. Watching에 저장소 추가
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 이메일로 알림 받기 설정
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="특정-discussion만-알림-받기"&gt;&lt;a href="#%ed%8a%b9%ec%a0%95-discussion%eb%a7%8c-%ec%95%8c%eb%a6%bc-%eb%b0%9b%ea%b8%b0" class="header-anchor"&gt;&lt;/a&gt;특정 Discussion만 알림 받기
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. Discussions 탭 → 해당 Discussion
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 오른쪽 &lt;span class="s2"&gt;&amp;#34;Subscribe&amp;#34;&lt;/span&gt; 버튼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. &lt;span class="s2"&gt;&amp;#34;Notify me&amp;#34;&lt;/span&gt; 선택
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="통계-및-분석"&gt;&lt;a href="#%ed%86%b5%ea%b3%84-%eb%b0%8f-%eb%b6%84%ec%84%9d" class="header-anchor"&gt;&lt;/a&gt;통계 및 분석
&lt;/h2&gt;&lt;h3 id="댓글-통계-보기"&gt;&lt;a href="#%eb%8c%93%ea%b8%80-%ed%86%b5%ea%b3%84-%eb%b3%b4%ea%b8%b0" class="header-anchor"&gt;&lt;/a&gt;댓글 통계 보기
&lt;/h3&gt;&lt;p&gt;GitHub Discussions에서:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. Discussions 탭
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 카테고리별 Discussion 수 확인
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 각 Discussion의 댓글 수 확인
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="github-insights-활용"&gt;&lt;a href="#github-insights-%ed%99%9c%ec%9a%a9" class="header-anchor"&gt;&lt;/a&gt;GitHub Insights 활용
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GitHub 저장소 → Insights → Community
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;→ Discussions 활동 확인
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="비용-및-제한사항"&gt;&lt;a href="#%eb%b9%84%ec%9a%a9-%eb%b0%8f-%ec%a0%9c%ed%95%9c%ec%82%ac%ed%95%ad" class="header-anchor"&gt;&lt;/a&gt;비용 및 제한사항
&lt;/h2&gt;&lt;h3 id="비용"&gt;&lt;a href="#%eb%b9%84%ec%9a%a9" class="header-anchor"&gt;&lt;/a&gt;비용
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;완전 무료&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub 계정만 있으면 사용 가능&lt;/li&gt;
&lt;li&gt;저장소 크기 제한 내에서 무제한 댓글&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="제한사항"&gt;&lt;a href="#%ec%a0%9c%ed%95%9c%ec%82%ac%ed%95%ad" class="header-anchor"&gt;&lt;/a&gt;제한사항
&lt;/h3&gt;&lt;h4 id="github-api-rate-limit"&gt;&lt;a href="#github-api-rate-limit" class="header-anchor"&gt;&lt;/a&gt;GitHub API Rate Limit
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;시간당 60회 (미인증)&lt;/li&gt;
&lt;li&gt;시간당 5,000회 (인증)&lt;/li&gt;
&lt;li&gt;Giscus는 캐싱으로 최적화되어 있어 문제 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="저장소-크기"&gt;&lt;a href="#%ec%a0%80%ec%9e%a5%ec%86%8c-%ed%81%ac%ea%b8%b0" class="header-anchor"&gt;&lt;/a&gt;저장소 크기
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;GitHub Free: 저장소당 1GB&lt;/li&gt;
&lt;li&gt;텍스트 댓글만으로는 제한 도달 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="discussions-제한"&gt;&lt;a href="#discussions-%ec%a0%9c%ed%95%9c" class="header-anchor"&gt;&lt;/a&gt;Discussions 제한
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;없음 (무제한)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="대안-비교"&gt;&lt;a href="#%eb%8c%80%ec%95%88-%eb%b9%84%ea%b5%90" class="header-anchor"&gt;&lt;/a&gt;대안 비교
&lt;/h2&gt;&lt;h3 id="giscus-vs-utterances"&gt;&lt;a href="#giscus-vs-utterances" class="header-anchor"&gt;&lt;/a&gt;Giscus vs Utterances
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;항목&lt;/th&gt;
					&lt;th&gt;Giscus&lt;/th&gt;
					&lt;th&gt;Utterances&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;백엔드&lt;/td&gt;
					&lt;td&gt;Discussions&lt;/td&gt;
					&lt;td&gt;Issues&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;반응&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;대댓글&lt;/td&gt;
					&lt;td&gt;중첩 지원&lt;/td&gt;
					&lt;td&gt;Flat&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;추천&lt;/td&gt;
					&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
					&lt;td&gt;⭐⭐⭐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;결론&lt;/strong&gt;: Giscus 사용 권장&lt;/p&gt;
&lt;h3 id="giscus-vs-disqus"&gt;&lt;a href="#giscus-vs-disqus" class="header-anchor"&gt;&lt;/a&gt;Giscus vs Disqus
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;항목&lt;/th&gt;
					&lt;th&gt;Giscus&lt;/th&gt;
					&lt;th&gt;Disqus&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;비용&lt;/td&gt;
					&lt;td&gt;무료&lt;/td&gt;
					&lt;td&gt;무료 (광고)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;광고&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;익명 댓글&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;✅ (Guest)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Markdown&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⚠️&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;데이터 소유&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;추천&lt;/td&gt;
					&lt;td&gt;개발자 블로그&lt;/td&gt;
					&lt;td&gt;일반 블로그&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="마이그레이션-가이드"&gt;&lt;a href="#%eb%a7%88%ec%9d%b4%ea%b7%b8%eb%a0%88%ec%9d%b4%ec%85%98-%ea%b0%80%ec%9d%b4%eb%93%9c" class="header-anchor"&gt;&lt;/a&gt;마이그레이션 가이드
&lt;/h2&gt;&lt;h3 id="utterances--giscus"&gt;&lt;a href="#utterances--giscus" class="header-anchor"&gt;&lt;/a&gt;Utterances → Giscus
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. GitHub Issues를 Discussions로 변환
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 수동 작업 필요 &lt;span class="o"&gt;(&lt;/span&gt;자동화 없음&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 또는 Issues 그대로 두고 Giscus 새로 시작
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. comments.html 파일 교체
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Utterances 코드 삭제
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Giscus 코드 추가
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 배포
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="disqus--giscus"&gt;&lt;a href="#disqus--giscus" class="header-anchor"&gt;&lt;/a&gt;Disqus → Giscus
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. Disqus 데이터 Export &lt;span class="o"&gt;(&lt;/span&gt;XML&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. GitHub Discussions로 수동 이전
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 자동화 도구 없음
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 스크립트 직접 작성 필요
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 또는 새로 시작 권장
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="추가-리소스"&gt;&lt;a href="#%ec%b6%94%ea%b0%80-%eb%a6%ac%ec%86%8c%ec%8a%a4" class="header-anchor"&gt;&lt;/a&gt;추가 리소스
&lt;/h2&gt;&lt;h3 id="공식-문서"&gt;&lt;a href="#%ea%b3%b5%ec%8b%9d-%eb%ac%b8%ec%84%9c" class="header-anchor"&gt;&lt;/a&gt;공식 문서
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://giscus.app/ko" target="_blank" rel="noopener"
 &gt;Giscus 공식 사이트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/giscus/giscus" target="_blank" rel="noopener"
 &gt;Giscus GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="커뮤니티"&gt;&lt;a href="#%ec%bb%a4%eb%ae%a4%eb%8b%88%ed%8b%b0" class="header-anchor"&gt;&lt;/a&gt;커뮤니티
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/giscus/giscus/discussions" target="_blank" rel="noopener"
 &gt;Giscus Discussions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blowfish.page/docs/" target="_blank" rel="noopener"
 &gt;Blowfish 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="체크리스트"&gt;&lt;a href="#%ec%b2%b4%ed%81%ac%eb%a6%ac%ec%8a%a4%ed%8a%b8" class="header-anchor"&gt;&lt;/a&gt;체크리스트
&lt;/h2&gt;&lt;p&gt;설치 완료 확인:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; GitHub Discussions 활성화&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Giscus App 설치&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;layouts/partials/comments.html&lt;/code&gt; 생성&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Giscus 코드 삽입 (본인의 ID로)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;params.toml&lt;/code&gt;에 &lt;code&gt;showComments = true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 로컬 테스트 완료&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; GitHub에 푸시&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 배포된 사이트에서 확인&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 테스트 댓글 작성&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; GitHub Discussions에 생성 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="결론"&gt;&lt;a href="#%ea%b2%b0%eb%a1%a0" class="header-anchor"&gt;&lt;/a&gt;결론
&lt;/h2&gt;&lt;p&gt;Giscus는 Hugo/GitHub Pages 블로그에 가장 적합한 댓글 시스템입니다:&lt;/p&gt;
&lt;h3 id="장점-정리"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-%ec%a0%95%eb%a6%ac" class="header-anchor"&gt;&lt;/a&gt;장점 정리
&lt;/h3&gt;&lt;p&gt;✅ 완전 무료
✅ 설정 간단 (10분)
✅ 서버 불필요
✅ Markdown 완벽 지원
✅ GitHub 통합
✅ 데이터 소유&lt;/p&gt;
&lt;h3 id="단점"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;p&gt;❌ GitHub 계정 필수 (익명 불가)
❌ 기술 블로그에 적합 (일반 사용자는 허들 있음)&lt;/p&gt;
&lt;h3 id="추천-대상"&gt;&lt;a href="#%ec%b6%94%ec%b2%9c-%eb%8c%80%ec%83%81" class="header-anchor"&gt;&lt;/a&gt;추천 대상
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ 개발자 블로그&lt;/li&gt;
&lt;li&gt;✅ 기술 문서&lt;/li&gt;
&lt;li&gt;✅ 오픈소스 프로젝트&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Hugo &amp; GithubPages 블로그 댓글 시스템 구현 가이드</title><link>https://0andwild.com/posts/251017_comments_guide/</link><pubDate>Fri, 17 Oct 2025 11:00:00 +0900</pubDate><guid>https://0andwild.com/posts/251017_comments_guide/</guid><description>&lt;img src="https://0andwild.com/" alt="Featured image of post Hugo &amp; GithubPages 블로그 댓글 시스템 구현 가이드" /&gt;&lt;h2 id="개요"&gt;&lt;a href="#%ea%b0%9c%ec%9a%94" class="header-anchor"&gt;&lt;/a&gt;개요
&lt;/h2&gt;&lt;p&gt;정적 사이트 생성기(Hugo)로 만든 블로그에 댓글 기능을 추가하는 모든 방법을 비교 분석합니다. &lt;strong&gt;익명 댓글&lt;/strong&gt;, &lt;strong&gt;GitHub 로그인&lt;/strong&gt;, &lt;strong&gt;소셜 로그인&lt;/strong&gt; 등 다양한 요구사항에 맞는 솔루션을 제시합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="댓글-시스템-분류"&gt;&lt;a href="#%eb%8c%93%ea%b8%80-%ec%8b%9c%ec%8a%a4%ed%85%9c-%eb%b6%84%eb%a5%98" class="header-anchor"&gt;&lt;/a&gt;댓글 시스템 분류
&lt;/h2&gt;&lt;h3 id="인증-방식에-따른-분류"&gt;&lt;a href="#%ec%9d%b8%ec%a6%9d-%eb%b0%a9%ec%8b%9d%ec%97%90-%eb%94%b0%eb%a5%b8-%eb%b6%84%eb%a5%98" class="header-anchor"&gt;&lt;/a&gt;인증 방식에 따른 분류
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;인증 방식&lt;/th&gt;
					&lt;th&gt;시스템&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;GitHub 전용&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Giscus, Utterances&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;익명 가능&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Remark42, Commento, Comentario, HashOver&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;익명 + 소셜 로그인&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Remark42, Commento, Disqus&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;소셜 로그인만&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Disqus, Hyvor Talk&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="호스팅-방식에-따른-분류"&gt;&lt;a href="#%ed%98%b8%ec%8a%a4%ed%8c%85-%eb%b0%a9%ec%8b%9d%ec%97%90-%eb%94%b0%eb%a5%b8-%eb%b6%84%eb%a5%98" class="header-anchor"&gt;&lt;/a&gt;호스팅 방식에 따른 분류
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;호스팅&lt;/th&gt;
					&lt;th&gt;시스템&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;SaaS (관리 불필요)&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Giscus, Utterances, Disqus, Hyvor Talk&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;셀프 호스팅&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Remark42, Commento, Comentario, HashOver&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;하이브리드&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Cusdis (Vercel 무료 배포)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="1-giscus-최고-추천---github-사용자용"&gt;&lt;a href="#1-giscus-%ec%b5%9c%ea%b3%a0-%ec%b6%94%ec%b2%9c---github-%ec%82%ac%ec%9a%a9%ec%9e%90%ec%9a%a9" class="header-anchor"&gt;&lt;/a&gt;1. Giscus (최고 추천 - GitHub 사용자용)
&lt;/h2&gt;&lt;h3 id="개념"&gt;&lt;a href="#%ea%b0%9c%eb%85%90" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;GitHub Discussions를 백엔드로 사용하는 댓글 시스템&lt;/p&gt;
&lt;h3 id="동작-방식"&gt;&lt;a href="#%eb%8f%99%ec%9e%91-%eb%b0%a9%ec%8b%9d" class="header-anchor"&gt;&lt;/a&gt;동작 방식
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. 사용자가 블로그 방문
 ↓
2. Giscus 위젯 로드
 ↓
3. GitHub OAuth로 로그인
 ↓
4. 댓글 작성
 ↓
5. GitHub Discussions에 자동 저장
 ↓
6. 블로그에 실시간 표시
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="장점"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;완전 무료&lt;/strong&gt; (GitHub 기능 활용)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;서버 불필요&lt;/strong&gt; (GitHub이 백엔드)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;데이터 소유&lt;/strong&gt; (본인 저장소에 저장)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Markdown 지원&lt;/strong&gt; (코드 블록, 이미지 등)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;반응(Reactions) 지원&lt;/strong&gt; (👍, ❤️ 등)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;알림&lt;/strong&gt; (GitHub 알림으로 댓글 알림)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;다크 모드&lt;/strong&gt; (블로그 테마와 동기화)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;스팸 방지&lt;/strong&gt; (GitHub 계정 필요)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;관리 간편&lt;/strong&gt; (GitHub Discussions에서 관리)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;검색 가능&lt;/strong&gt; (GitHub 검색으로 댓글 검색)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;익명 댓글 불가&lt;/strong&gt; (GitHub 계정 필수)&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;기술 블로그에 적합&lt;/strong&gt; (일반 사용자는 GitHub 계정 없을 수 있음)&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;GitHub 의존성&lt;/strong&gt; (GitHub 장애 시 댓글 불가)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="구현-난이도"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h3&gt;&lt;p&gt;⭐⭐ (2/5)&lt;/p&gt;
&lt;h3 id="설정-방법"&gt;&lt;a href="#%ec%84%a4%ec%a0%95-%eb%b0%a9%eb%b2%95" class="header-anchor"&gt;&lt;/a&gt;설정 방법
&lt;/h3&gt;&lt;h4 id="1단계-github-discussions-활성화"&gt;&lt;a href="#1%eb%8b%a8%ea%b3%84-github-discussions-%ed%99%9c%ec%84%b1%ed%99%94" class="header-anchor"&gt;&lt;/a&gt;1단계: GitHub Discussions 활성화
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. GitHub 저장소 → Settings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. Features 섹션 → Discussions 체크
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2단계-giscus-설정"&gt;&lt;a href="#2%eb%8b%a8%ea%b3%84-giscus-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;2단계: Giscus 설정
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="https://giscus.app/ko" target="_blank" rel="noopener"
 &gt;giscus.app&lt;/a&gt; 방문&lt;/li&gt;
&lt;li&gt;저장소 입력: &lt;code&gt;username/repository&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;설정 선택:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;페이지 ↔️ Discussion 연결&lt;/strong&gt;: &lt;code&gt;pathname&lt;/code&gt; (권장)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion 카테고리&lt;/strong&gt;: &lt;code&gt;Announcements&lt;/code&gt; 또는 &lt;code&gt;General&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;기능&lt;/strong&gt;: 반응, 댓글 위로&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;테마&lt;/strong&gt;: 블로그에 맞게 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="3단계-blowfish에-추가"&gt;&lt;a href="#3%eb%8b%a8%ea%b3%84-blowfish%ec%97%90-%ec%b6%94%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;3단계: Blowfish에 추가
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- layouts/partials/comments.html --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://giscus.app/client.js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0AndWild/0AndWild.github.io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;YOUR_REPO_ID&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Announcements&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;YOUR_CATEGORY_ID&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pathname&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-strict&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-reactions-enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-emit-metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-input-position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;preferred_color_scheme&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ko&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;anonymous&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="4단계-paramstoml-설정"&gt;&lt;a href="#4%eb%8b%a8%ea%b3%84-paramstoml-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;4단계: params.toml 설정
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;showComments&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="테마-동기화-다크모드"&gt;&lt;a href="#%ed%85%8c%eb%a7%88-%eb%8f%99%ea%b8%b0%ed%99%94-%eb%8b%a4%ed%81%ac%eb%aa%a8%eb%93%9c" class="header-anchor"&gt;&lt;/a&gt;테마 동기화 (다크모드)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 블로그 테마 변경 시 Giscus 테마도 변경
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;giscusTheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;iframe.giscus-frame&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;giscusTheme&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-theme&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;giscusTheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;giscus&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;setConfig&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://giscus.app&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="비용"&gt;&lt;a href="#%eb%b9%84%ec%9a%a9" class="header-anchor"&gt;&lt;/a&gt;비용
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;완전 무료&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="추천-대상"&gt;&lt;a href="#%ec%b6%94%ec%b2%9c-%eb%8c%80%ec%83%81" class="header-anchor"&gt;&lt;/a&gt;추천 대상
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ 개발자 블로그&lt;/li&gt;
&lt;li&gt;✅ 기술 문서&lt;/li&gt;
&lt;li&gt;✅ 오픈소스 프로젝트 블로그&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-utterances"&gt;&lt;a href="#2-utterances" class="header-anchor"&gt;&lt;/a&gt;2. Utterances
&lt;/h2&gt;&lt;h3 id="개념-1"&gt;&lt;a href="#%ea%b0%9c%eb%85%90-1" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;GitHub Issues를 백엔드로 사용하는 댓글 시스템 (Giscus의 전신)&lt;/p&gt;
&lt;h3 id="동작-방식-1"&gt;&lt;a href="#%eb%8f%99%ec%9e%91-%eb%b0%a9%ec%8b%9d-1" class="header-anchor"&gt;&lt;/a&gt;동작 방식
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. GitHub OAuth 로그인
 ↓
2. 댓글 작성
 ↓
3. GitHub Issues에 저장 (각 포스트 = 1개 Issue)
 ↓
4. 블로그에 표시
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="장점-1"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-1" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ 완전 무료&lt;/li&gt;
&lt;li&gt;✅ 가벼움 (TypeScript)&lt;/li&gt;
&lt;li&gt;✅ 간단한 설정&lt;/li&gt;
&lt;li&gt;✅ Markdown 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점-1"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-1" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Issues 사용&lt;/strong&gt; (Discussions보다 덜 적합)&lt;/li&gt;
&lt;li&gt;❌ Giscus보다 기능 적음&lt;/li&gt;
&lt;li&gt;❌ 익명 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="giscus-vs-utterances"&gt;&lt;a href="#giscus-vs-utterances" class="header-anchor"&gt;&lt;/a&gt;Giscus vs Utterances
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;기능&lt;/th&gt;
					&lt;th&gt;Giscus&lt;/th&gt;
					&lt;th&gt;Utterances&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;백엔드&lt;/td&gt;
					&lt;td&gt;Discussions&lt;/td&gt;
					&lt;td&gt;Issues&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;반응&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;댓글에 댓글&lt;/td&gt;
					&lt;td&gt;✅ (nested)&lt;/td&gt;
					&lt;td&gt;⚠️ (flat)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;적합성&lt;/td&gt;
					&lt;td&gt;댓글 전용&lt;/td&gt;
					&lt;td&gt;이슈 트래킹용&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;결론&lt;/strong&gt;: Giscus가 Utterances의 상위 호환&lt;/p&gt;
&lt;h3 id="구현-난이도-1"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84-1" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h3&gt;&lt;p&gt;⭐⭐ (2/5)&lt;/p&gt;
&lt;h3 id="설정-방법-1"&gt;&lt;a href="#%ec%84%a4%ec%a0%95-%eb%b0%a9%eb%b2%95-1" class="header-anchor"&gt;&lt;/a&gt;설정 방법
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- layouts/partials/comments.html --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://utteranc.es/client.js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;username/repository&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;issue-term&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pathname&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;github-light&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;anonymous&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="추천-대상-1"&gt;&lt;a href="#%ec%b6%94%ec%b2%9c-%eb%8c%80%ec%83%81-1" class="header-anchor"&gt;&lt;/a&gt;추천 대상
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;특별한 이유가 없다면 &lt;strong&gt;Giscus 사용 권장&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="3-remark42-최고-추천---익명--소셜-로그인"&gt;&lt;a href="#3-remark42-%ec%b5%9c%ea%b3%a0-%ec%b6%94%ec%b2%9c---%ec%9d%b5%eb%aa%85--%ec%86%8c%ec%85%9c-%eb%a1%9c%ea%b7%b8%ec%9d%b8" class="header-anchor"&gt;&lt;/a&gt;3. Remark42 (최고 추천 - 익명 + 소셜 로그인)
&lt;/h2&gt;&lt;h3 id="개념-2"&gt;&lt;a href="#%ea%b0%9c%eb%85%90-2" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;오픈소스 셀프 호스팅 댓글 시스템으로, 익명 및 다양한 소셜 로그인 지원&lt;/p&gt;
&lt;h3 id="동작-방식-2"&gt;&lt;a href="#%eb%8f%99%ec%9e%91-%eb%b0%a9%ec%8b%9d-2" class="header-anchor"&gt;&lt;/a&gt;동작 방식
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. Remark42 서버 배포 (Docker)
 ↓
2. 블로그에 Remark42 스크립트 삽입
 ↓
3. 사용자 선택:
 - 익명 댓글 작성
 - GitHub/Google/Twitter 로그인 후 작성
 ↓
4. Remark42 DB에 저장
 ↓
5. 블로그에 표시
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="장점-2"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-2" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;익명 댓글 가능&lt;/strong&gt; (설정으로 켜고 끌 수 있음)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;다양한 소셜 로그인&lt;/strong&gt; (GitHub, Google, Facebook, Twitter, Email)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;완전 무료&lt;/strong&gt; (오픈소스)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;광고 없음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;데이터 소유&lt;/strong&gt; (본인 서버)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Markdown 지원&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;댓글 수정/삭제&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;관리자 모드&lt;/strong&gt; (댓글 승인/차단/삭제)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;알림&lt;/strong&gt; (이메일/Telegram)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Import/Export&lt;/strong&gt; (다른 시스템에서 마이그레이션)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;투표&lt;/strong&gt; (찬성/반대)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;스팸 필터&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점-2"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-2" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;셀프 호스팅 필요&lt;/strong&gt; (Docker 서버)&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;유지보수 책임&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;호스팅 비용&lt;/strong&gt; (월 $5~, 무료 티어 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="구현-난이도-2"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84-2" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h3&gt;&lt;p&gt;⭐⭐⭐⭐ (4/5)&lt;/p&gt;
&lt;h3 id="호스팅-옵션"&gt;&lt;a href="#%ed%98%b8%ec%8a%a4%ed%8c%85-%ec%98%b5%ec%85%98" class="header-anchor"&gt;&lt;/a&gt;호스팅 옵션
&lt;/h3&gt;&lt;h4 id="옵션-1-railway-추천"&gt;&lt;a href="#%ec%98%b5%ec%85%98-1-railway-%ec%b6%94%ec%b2%9c" class="header-anchor"&gt;&lt;/a&gt;옵션 1: Railway (추천)
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. Railway.app 회원가입
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. &lt;span class="s2"&gt;&amp;#34;New Project&amp;#34;&lt;/span&gt; → &lt;span class="s2"&gt;&amp;#34;Deploy from GitHub&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. Remark42 Docker 이미지 선택
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 환경변수 설정:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;REMARK_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://your-remark42.railway.app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-random-secret
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;AUTH_ANON&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;# 익명 댓글 허용&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;AUTH_GITHUB_CID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_client_id
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;AUTH_GITHUB_CSEC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_client_secret
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Railway 무료 티어&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;월 $5 크레딧&lt;/li&gt;
&lt;li&gt;소규모 블로그 충분&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="옵션-2-flyio"&gt;&lt;a href="#%ec%98%b5%ec%85%98-2-flyio" class="header-anchor"&gt;&lt;/a&gt;옵션 2: Fly.io
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# fly.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;my-remark42&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;build&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;umputun/remark42:latest&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;env&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;REMARK_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://my-remark42.fly.dev&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;AUTH_ANON&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;AUTH_GITHUB_CID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;AUTH_GITHUB_CSEC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fly launch
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fly deploy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Fly.io 무료 티어&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3개 앱&lt;/li&gt;
&lt;li&gt;소규모 블로그 충분&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="옵션-3-docker-compose-vps"&gt;&lt;a href="#%ec%98%b5%ec%85%98-3-docker-compose-vps" class="header-anchor"&gt;&lt;/a&gt;옵션 3: Docker Compose (VPS)
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# docker-compose.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;remark42&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;umputun/remark42:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;REMARK_URL=https://remark.your-blog.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SECRET=your-secret-key-change-this&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;AUTH_ANON=true &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 익명 허용&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;AUTH_GITHUB_CID=xxx &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# GitHub 로그인&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;AUTH_GITHUB_CSEC=xxx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;AUTH_GOOGLE_CID=xxx &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Google 로그인&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;AUTH_GOOGLE_CSEC=xxx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ADMIN_SHARED_ID=github_username &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 관리자&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./data:/srv/var&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;8080:8080&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="블로그-삽입-코드"&gt;&lt;a href="#%eb%b8%94%eb%a1%9c%ea%b7%b8-%ec%82%bd%ec%9e%85-%ec%bd%94%eb%93%9c" class="header-anchor"&gt;&lt;/a&gt;블로그 삽입 코드
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- layouts/partials/comments.html --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;remark42&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;remark_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://your-remark42.railway.app&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;site_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0andwild-blog&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;embed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ko&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;max_shown_comments&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;simple_view&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;no_footer&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;script&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;remark_config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/web/&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})(&lt;/span&gt;&lt;span class="nx"&gt;remark_config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;components&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;embed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="익명--github-동시-사용-설정"&gt;&lt;a href="#%ec%9d%b5%eb%aa%85--github-%eb%8f%99%ec%8b%9c-%ec%82%ac%ec%9a%a9-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;익명 + GitHub 동시 사용 설정
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 환경변수&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AUTH_ANON&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;# 익명 허용&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AUTH_GITHUB_CID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xxx &lt;span class="c1"&gt;# GitHub OAuth App ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AUTH_GITHUB_CSEC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xxx &lt;span class="c1"&gt;# GitHub OAuth App Secret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ANON_VOTE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="c1"&gt;# 익명 사용자 투표 불가 (스팸 방지)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;사용자는 선택 가능:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;익명으로 댓글 달기&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;GitHub으로 로그인&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="관리자-기능"&gt;&lt;a href="#%ea%b4%80%eb%a6%ac%ec%9e%90-%ea%b8%b0%eb%8a%a5" class="header-anchor"&gt;&lt;/a&gt;관리자 기능
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 관리자 지정&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ADMIN_SHARED_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;github_yourusername
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 또는 이메일&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ADMIN_SHARED_EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;you@example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;관리자 가능 작업:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;댓글 삭제&lt;/li&gt;
&lt;li&gt;사용자 차단&lt;/li&gt;
&lt;li&gt;댓글 고정&lt;/li&gt;
&lt;li&gt;읽기 전용 모드&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="비용-1"&gt;&lt;a href="#%eb%b9%84%ec%9a%a9-1" class="header-anchor"&gt;&lt;/a&gt;비용
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Railway&lt;/strong&gt;: 무료 또는 월 $5&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fly.io&lt;/strong&gt;: 무료 티어 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPS (DigitalOcean 등)&lt;/strong&gt;: 월 $5~&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="추천-대상-2"&gt;&lt;a href="#%ec%b6%94%ec%b2%9c-%eb%8c%80%ec%83%81-2" class="header-anchor"&gt;&lt;/a&gt;추천 대상
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;익명 + 소셜 로그인 모두 원하는 경우&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ 기술적으로 Docker 다룰 수 있는 사용자&lt;/li&gt;
&lt;li&gt;✅ 데이터 완전 통제 원하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="4-commento--comentario"&gt;&lt;a href="#4-commento--comentario" class="header-anchor"&gt;&lt;/a&gt;4. Commento / Comentario
&lt;/h2&gt;&lt;h3 id="개념-3"&gt;&lt;a href="#%ea%b0%9c%eb%85%90-3" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;프라이버시 중심의 경량 댓글 시스템&lt;/p&gt;
&lt;h3 id="commento-vs-comentario"&gt;&lt;a href="#commento-vs-comentario" class="header-anchor"&gt;&lt;/a&gt;Commento vs Comentario
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;항목&lt;/th&gt;
					&lt;th&gt;Commento&lt;/th&gt;
					&lt;th&gt;Comentario&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;상태&lt;/td&gt;
					&lt;td&gt;개발 중단&lt;/td&gt;
					&lt;td&gt;활발히 개발 중 (Commento 포크)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;라이선스&lt;/td&gt;
					&lt;td&gt;MIT&lt;/td&gt;
					&lt;td&gt;MIT&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;언어&lt;/td&gt;
					&lt;td&gt;Go&lt;/td&gt;
					&lt;td&gt;Go&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;추천&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;결론&lt;/strong&gt;: Comentario 사용 권장&lt;/p&gt;
&lt;h3 id="comentario-장점"&gt;&lt;a href="#comentario-%ec%9e%a5%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;Comentario 장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ 익명 댓글 가능&lt;/li&gt;
&lt;li&gt;✅ 소셜 로그인 (GitHub, Google, GitLab, SSO)&lt;/li&gt;
&lt;li&gt;✅ 가벼움 (Go 기반)&lt;/li&gt;
&lt;li&gt;✅ 프라이버시 중심&lt;/li&gt;
&lt;li&gt;✅ Markdown 지원&lt;/li&gt;
&lt;li&gt;✅ 투표 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점-3"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-3" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ 셀프 호스팅 필요&lt;/li&gt;
&lt;li&gt;❌ Remark42보다 기능 적음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="구현-난이도-3"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84-3" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h3&gt;&lt;p&gt;⭐⭐⭐⭐ (4/5)&lt;/p&gt;
&lt;h3 id="docker-배포"&gt;&lt;a href="#docker-%eb%b0%b0%ed%8f%ac" class="header-anchor"&gt;&lt;/a&gt;Docker 배포
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;comentario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;registry.gitlab.com/comentario/comentario&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;8080:8080&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;COMENTARIO_ORIGIN=https://comments.your-blog.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;COMENTARIO_BIND=0.0.0.0:8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;COMENTARIO_POSTGRES=postgres://user:pass@db/comentario&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;db&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;postgres:15&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;POSTGRES_DB=comentario&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;POSTGRES_USER=comentario&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;POSTGRES_PASSWORD=change-this&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postgres_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="블로그-삽입"&gt;&lt;a href="#%eb%b8%94%eb%a1%9c%ea%b7%b8-%ec%82%bd%ec%9e%85" class="header-anchor"&gt;&lt;/a&gt;블로그 삽입
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://comments.your-blog.com/js/commento.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;commento&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="추천-대상-3"&gt;&lt;a href="#%ec%b6%94%ec%b2%9c-%eb%8c%80%ec%83%81-3" class="header-anchor"&gt;&lt;/a&gt;추천 대상
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Remark42 대안&lt;/li&gt;
&lt;li&gt;더 간단한 시스템 원하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="5-disqus-전통적-saas"&gt;&lt;a href="#5-disqus-%ec%a0%84%ed%86%b5%ec%a0%81-saas" class="header-anchor"&gt;&lt;/a&gt;5. Disqus (전통적 SaaS)
&lt;/h2&gt;&lt;h3 id="개념-4"&gt;&lt;a href="#%ea%b0%9c%eb%85%90-4" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;가장 오래되고 널리 사용되는 클라우드 댓글 시스템&lt;/p&gt;
&lt;h3 id="동작-방식-3"&gt;&lt;a href="#%eb%8f%99%ec%9e%91-%eb%b0%a9%ec%8b%9d-3" class="header-anchor"&gt;&lt;/a&gt;동작 방식
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. Disqus 계정 생성 및 사이트 등록
 ↓
2. 블로그에 Disqus 스크립트 삽입
 ↓
3. 사용자 선택:
 - Guest (익명 - 이메일 필요)
 - Disqus 계정
 - Facebook/Twitter/Google 로그인
 ↓
4. Disqus 서버에 저장
 ↓
5. 블로그에 표시
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="장점-3"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-3" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;설정 초간단&lt;/strong&gt; (5분)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;서버 불필요&lt;/strong&gt; (SaaS)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Guest 모드&lt;/strong&gt; (이메일만으로 댓글)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;소셜 로그인&lt;/strong&gt; (Facebook, Twitter, Google)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;강력한 관리자 도구&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;스팸 필터&lt;/strong&gt; (Akismet 통합)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;모바일 앱&lt;/strong&gt; (iOS/Android)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;분석/통계&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점-4"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-4" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;광고 표시&lt;/strong&gt; (무료 플랜)&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;무거움&lt;/strong&gt; (스크립트 크기)&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;프라이버시 우려&lt;/strong&gt; (데이터 추적)&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;데이터 소유권 없음&lt;/strong&gt; (Disqus 서버)&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;GitHub 로그인 없음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;광고 제거 비용&lt;/strong&gt; (월 $11.99~)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="구현-난이도-4"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84-4" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h3&gt;&lt;p&gt;⭐ (1/5) - 가장 쉬움&lt;/p&gt;
&lt;h3 id="설정-방법-2"&gt;&lt;a href="#%ec%84%a4%ec%a0%95-%eb%b0%a9%eb%b2%95-2" class="header-anchor"&gt;&lt;/a&gt;설정 방법
&lt;/h3&gt;&lt;h4 id="1단계-disqus-사이트-등록"&gt;&lt;a href="#1%eb%8b%a8%ea%b3%84-disqus-%ec%82%ac%ec%9d%b4%ed%8a%b8-%eb%93%b1%eb%a1%9d" class="header-anchor"&gt;&lt;/a&gt;1단계: Disqus 사이트 등록
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. disqus.com 가입
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. &lt;span class="s2"&gt;&amp;#34;I want to install Disqus on my site&amp;#34;&lt;/span&gt; 선택
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. Website Name 입력 &lt;span class="o"&gt;(&lt;/span&gt;예: andwild-blog&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. Category 선택
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. Plan 선택 &lt;span class="o"&gt;(&lt;/span&gt;Basic - Free&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2단계-blowfish-설정"&gt;&lt;a href="#2%eb%8b%a8%ea%b3%84-blowfish-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;2단계: Blowfish 설정
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# config/_default/config.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disqus&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;shortname&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;andwild-blog&amp;#34;&lt;/span&gt; &lt;span class="c"&gt;# 1단계에서 생성한 이름&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# config/_default/params.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;showComments&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hugo는 Disqus를 기본 지원하므로 자동으로 댓글 표시됨!&lt;/p&gt;
&lt;h4 id="3단계-guest-댓글-허용"&gt;&lt;a href="#3%eb%8b%a8%ea%b3%84-guest-%eb%8c%93%ea%b8%80-%ed%97%88%ec%9a%a9" class="header-anchor"&gt;&lt;/a&gt;3단계: Guest 댓글 허용
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Disqus Dashboard → Settings → Community
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;→ Guest Commenting: Allow guests to comment &lt;span class="o"&gt;(&lt;/span&gt;체크&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="광고-제거-방법"&gt;&lt;a href="#%ea%b4%91%ea%b3%a0-%ec%a0%9c%ea%b1%b0-%eb%b0%a9%eb%b2%95" class="header-anchor"&gt;&lt;/a&gt;광고 제거 방법
&lt;/h3&gt;&lt;h4 id="방법-1-유료-플랜-1199월"&gt;&lt;a href="#%eb%b0%a9%eb%b2%95-1-%ec%9c%a0%eb%a3%8c-%ed%94%8c%eb%9e%9c-1199%ec%9b%94" class="header-anchor"&gt;&lt;/a&gt;방법 1: 유료 플랜 ($11.99/월~)
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Plus Plan: 광고 없음&lt;/li&gt;
&lt;li&gt;Pro Plan: 광고 없음 + 고급 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="방법-2-css로-숨기기-비추천---약관-위반-가능"&gt;&lt;a href="#%eb%b0%a9%eb%b2%95-2-css%eb%a1%9c-%ec%88%a8%ea%b8%b0%ea%b8%b0-%eb%b9%84%ec%b6%94%ec%b2%9c---%ec%95%bd%ea%b4%80-%ec%9c%84%eb%b0%98-%ea%b0%80%eb%8a%a5" class="header-anchor"&gt;&lt;/a&gt;방법 2: CSS로 숨기기 (비추천 - 약관 위반 가능)
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* 비추천: Disqus 약관 위반 가능 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="nt"&gt;iframe&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;src&lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ads&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;none&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="비용-2"&gt;&lt;a href="#%eb%b9%84%ec%9a%a9-2" class="header-anchor"&gt;&lt;/a&gt;비용
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;무료&lt;/strong&gt;: 광고 있음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plus&lt;/strong&gt;: $11.99/월 (광고 없음)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pro&lt;/strong&gt;: $89/월 (고급 기능)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="추천-대상-4"&gt;&lt;a href="#%ec%b6%94%ec%b2%9c-%eb%8c%80%ec%83%81-4" class="header-anchor"&gt;&lt;/a&gt;추천 대상
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ 빠르게 댓글 추가하고 싶은 경우&lt;/li&gt;
&lt;li&gt;✅ 비기술적 블로거&lt;/li&gt;
&lt;li&gt;✅ 광고 신경 안 쓰는 경우&lt;/li&gt;
&lt;li&gt;❌ 프라이버시 중시하는 경우는 비추천&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="6-cusdis-vercel-무료-배포"&gt;&lt;a href="#6-cusdis-vercel-%eb%ac%b4%eb%a3%8c-%eb%b0%b0%ed%8f%ac" class="header-anchor"&gt;&lt;/a&gt;6. Cusdis (Vercel 무료 배포)
&lt;/h2&gt;&lt;h3 id="개념-5"&gt;&lt;a href="#%ea%b0%9c%eb%85%90-5" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;경량 오픈소스 댓글 시스템, Vercel에 무료 배포 가능&lt;/p&gt;
&lt;h3 id="동작-방식-4"&gt;&lt;a href="#%eb%8f%99%ec%9e%91-%eb%b0%a9%ec%8b%9d-4" class="header-anchor"&gt;&lt;/a&gt;동작 방식
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. Cusdis를 Vercel에 배포 (1-Click)
 ↓
2. PostgreSQL 연결 (Vercel 무료)
 ↓
3. 대시보드에서 사이트 추가
 ↓
4. 블로그에 스크립트 삽입
 ↓
5. 사용자가 이메일 + 이름으로 댓글
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="장점-4"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-4" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;완전 무료&lt;/strong&gt; (Vercel 무료 티어)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;익명 댓글&lt;/strong&gt; (이메일 + 이름만)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;가벼움&lt;/strong&gt; (50KB)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;설정 간단&lt;/strong&gt; (Vercel 1-Click 배포)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;프라이버시 중심&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;오픈소스&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점-5"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-5" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ Markdown 미지원&lt;/li&gt;
&lt;li&gt;❌ 소셜 로그인 없음&lt;/li&gt;
&lt;li&gt;❌ 기능 단순&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="구현-난이도-5"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84-5" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h3&gt;&lt;p&gt;⭐⭐⭐ (3/5)&lt;/p&gt;
&lt;h3 id="설정-방법-3"&gt;&lt;a href="#%ec%84%a4%ec%a0%95-%eb%b0%a9%eb%b2%95-3" class="header-anchor"&gt;&lt;/a&gt;설정 방법
&lt;/h3&gt;&lt;h4 id="1단계-vercel-배포"&gt;&lt;a href="#1%eb%8b%a8%ea%b3%84-vercel-%eb%b0%b0%ed%8f%ac" class="header-anchor"&gt;&lt;/a&gt;1단계: Vercel 배포
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. https://cusdis.com/ 방문
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. &lt;span class="s2"&gt;&amp;#34;Deploy with Vercel&amp;#34;&lt;/span&gt; 클릭
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. GitHub 연결
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. PostgreSQL 추가 &lt;span class="o"&gt;(&lt;/span&gt;Vercel Storage&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 배포 완료
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2단계-사이트-추가"&gt;&lt;a href="#2%eb%8b%a8%ea%b3%84-%ec%82%ac%ec%9d%b4%ed%8a%b8-%ec%b6%94%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;2단계: 사이트 추가
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 배포된 Cusdis 대시보드 접속
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. &lt;span class="s2"&gt;&amp;#34;Add Website&amp;#34;&lt;/span&gt; 클릭
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. Domain 입력: 0andwild.github.io
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. App ID 복사
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="3단계-블로그-삽입"&gt;&lt;a href="#3%eb%8b%a8%ea%b3%84-%eb%b8%94%eb%a1%9c%ea%b7%b8-%ec%82%bd%ec%9e%85" class="header-anchor"&gt;&lt;/a&gt;3단계: 블로그 삽입
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- layouts/partials/comments.html --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;cusdis_thread&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://your-cusdis.vercel.app&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-app-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;YOUR_APP_ID&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-page-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ .File.UniqueID }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-page-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ .Permalink }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-page-title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ .Title }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://your-cusdis.vercel.app/js/cusdis.es.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="비용-3"&gt;&lt;a href="#%eb%b9%84%ec%9a%a9-3" class="header-anchor"&gt;&lt;/a&gt;비용
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;완전 무료&lt;/strong&gt; (Vercel 무료 티어)&lt;/p&gt;
&lt;h3 id="추천-대상-5"&gt;&lt;a href="#%ec%b6%94%ec%b2%9c-%eb%8c%80%ec%83%81-5" class="header-anchor"&gt;&lt;/a&gt;추천 대상
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ 간단한 익명 댓글만 필요한 경우&lt;/li&gt;
&lt;li&gt;✅ 완전 무료 원하는 경우&lt;/li&gt;
&lt;li&gt;✅ Vercel 사용 경험 있는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="7-hashover"&gt;&lt;a href="#7-hashover" class="header-anchor"&gt;&lt;/a&gt;7. HashOver
&lt;/h2&gt;&lt;h3 id="개념-6"&gt;&lt;a href="#%ea%b0%9c%eb%85%90-6" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;PHP 기반의 완전 익명 댓글 시스템&lt;/p&gt;
&lt;h3 id="장점-5"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-5" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ 완전 익명 (아무 정보도 필요 없음)&lt;/li&gt;
&lt;li&gt;✅ PHP + flat file (DB 불필요)&lt;/li&gt;
&lt;li&gt;✅ 오픈소스&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점-6"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-6" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ PHP 필요 (정적 사이트에 부적합)&lt;/li&gt;
&lt;li&gt;❌ GitHub 로그인 없음&lt;/li&gt;
&lt;li&gt;❌ 오래된 프로젝트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="구현-난이도-6"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84-6" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h3&gt;&lt;p&gt;⭐⭐⭐⭐ (4/5)&lt;/p&gt;
&lt;h3 id="추천-대상-6"&gt;&lt;a href="#%ec%b6%94%ec%b2%9c-%eb%8c%80%ec%83%81-6" class="header-anchor"&gt;&lt;/a&gt;추천 대상
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;정적 블로그에는 비추천&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PHP 서버 있을 때만 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="8-hyvor-talk-프리미엄-saas"&gt;&lt;a href="#8-hyvor-talk-%ed%94%84%eb%a6%ac%eb%af%b8%ec%97%84-saas" class="header-anchor"&gt;&lt;/a&gt;8. Hyvor Talk (프리미엄 SaaS)
&lt;/h2&gt;&lt;h3 id="개념-7"&gt;&lt;a href="#%ea%b0%9c%eb%85%90-7" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;광고 없는 프리미엄 댓글 시스템&lt;/p&gt;
&lt;h3 id="장점-6"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-6" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ 광고 없음&lt;/li&gt;
&lt;li&gt;✅ 익명 댓글 가능&lt;/li&gt;
&lt;li&gt;✅ 소셜 로그인&lt;/li&gt;
&lt;li&gt;✅ 강력한 스팸 필터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점-7"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-7" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;유료&lt;/strong&gt; (월 $5~)&lt;/li&gt;
&lt;li&gt;❌ GitHub 로그인 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="비용-4"&gt;&lt;a href="#%eb%b9%84%ec%9a%a9-4" class="header-anchor"&gt;&lt;/a&gt;비용
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Starter&lt;/strong&gt;: $5/월 (1 사이트)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pro&lt;/strong&gt;: $15/월 (3 사이트)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="추천-대상-7"&gt;&lt;a href="#%ec%b6%94%ec%b2%9c-%eb%8c%80%ec%83%81-7" class="header-anchor"&gt;&lt;/a&gt;추천 대상
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Disqus 유료 대안&lt;/li&gt;
&lt;li&gt;광고 없는 SaaS 원하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="비교표"&gt;&lt;a href="#%eb%b9%84%ea%b5%90%ed%91%9c" class="header-anchor"&gt;&lt;/a&gt;비교표
&lt;/h2&gt;&lt;h3 id="인증-방식별"&gt;&lt;a href="#%ec%9d%b8%ec%a6%9d-%eb%b0%a9%ec%8b%9d%eb%b3%84" class="header-anchor"&gt;&lt;/a&gt;인증 방식별
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;시스템&lt;/th&gt;
					&lt;th&gt;익명&lt;/th&gt;
					&lt;th&gt;GitHub&lt;/th&gt;
					&lt;th&gt;Google&lt;/th&gt;
					&lt;th&gt;기타 소셜&lt;/th&gt;
					&lt;th&gt;난이도&lt;/th&gt;
					&lt;th&gt;비용&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Giscus&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;⭐⭐&lt;/td&gt;
					&lt;td&gt;무료&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Utterances&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;⭐⭐&lt;/td&gt;
					&lt;td&gt;무료&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Remark42&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
					&lt;td&gt;$5/월&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Comentario&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
					&lt;td&gt;$5/월&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Disqus&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;⚠️&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⭐&lt;/td&gt;
					&lt;td&gt;무료 (광고)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cusdis&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;⭐⭐⭐&lt;/td&gt;
					&lt;td&gt;무료&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Hyvor Talk&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⭐&lt;/td&gt;
					&lt;td&gt;$5/월&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="기능별"&gt;&lt;a href="#%ea%b8%b0%eb%8a%a5%eb%b3%84" class="header-anchor"&gt;&lt;/a&gt;기능별
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;시스템&lt;/th&gt;
					&lt;th&gt;Markdown&lt;/th&gt;
					&lt;th&gt;반응&lt;/th&gt;
					&lt;th&gt;투표&lt;/th&gt;
					&lt;th&gt;알림&lt;/th&gt;
					&lt;th&gt;관리자&lt;/th&gt;
					&lt;th&gt;스팸필터&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Giscus&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⚠️&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Remark42&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Disqus&lt;/td&gt;
					&lt;td&gt;⚠️&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cusdis&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;⚠️&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⚠️&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="호스팅별"&gt;&lt;a href="#%ed%98%b8%ec%8a%a4%ed%8c%85%eb%b3%84" class="header-anchor"&gt;&lt;/a&gt;호스팅별
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;시스템&lt;/th&gt;
					&lt;th&gt;호스팅&lt;/th&gt;
					&lt;th&gt;데이터 위치&lt;/th&gt;
					&lt;th&gt;의존성&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Giscus&lt;/td&gt;
					&lt;td&gt;GitHub&lt;/td&gt;
					&lt;td&gt;GitHub Discussions&lt;/td&gt;
					&lt;td&gt;GitHub&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Remark42&lt;/td&gt;
					&lt;td&gt;셀프&lt;/td&gt;
					&lt;td&gt;본인 서버&lt;/td&gt;
					&lt;td&gt;Docker&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Disqus&lt;/td&gt;
					&lt;td&gt;Disqus&lt;/td&gt;
					&lt;td&gt;Disqus 서버&lt;/td&gt;
					&lt;td&gt;Disqus&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cusdis&lt;/td&gt;
					&lt;td&gt;Vercel&lt;/td&gt;
					&lt;td&gt;Vercel DB&lt;/td&gt;
					&lt;td&gt;Vercel&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="선택-가이드"&gt;&lt;a href="#%ec%84%a0%ed%83%9d-%ea%b0%80%ec%9d%b4%eb%93%9c" class="header-anchor"&gt;&lt;/a&gt;선택 가이드
&lt;/h2&gt;&lt;h3 id="시나리오별-추천"&gt;&lt;a href="#%ec%8b%9c%eb%82%98%eb%a6%ac%ec%98%a4%eb%b3%84-%ec%b6%94%ec%b2%9c" class="header-anchor"&gt;&lt;/a&gt;시나리오별 추천
&lt;/h3&gt;&lt;h4 id="1-개발자-블로그-github-사용자-대상"&gt;&lt;a href="#1-%ea%b0%9c%eb%b0%9c%ec%9e%90-%eb%b8%94%eb%a1%9c%ea%b7%b8-github-%ec%82%ac%ec%9a%a9%ec%9e%90-%eb%8c%80%ec%83%81" class="header-anchor"&gt;&lt;/a&gt;1. &amp;ldquo;개발자 블로그, GitHub 사용자 대상&amp;rdquo;
&lt;/h4&gt;&lt;p&gt;→ &lt;strong&gt;Giscus&lt;/strong&gt; ⭐⭐⭐⭐⭐&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;무료, 간단, Markdown 지원&lt;/li&gt;
&lt;li&gt;GitHub 통합으로 알림도 편함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-일반-블로그-익명-댓글-필수"&gt;&lt;a href="#2-%ec%9d%bc%eb%b0%98-%eb%b8%94%eb%a1%9c%ea%b7%b8-%ec%9d%b5%eb%aa%85-%eb%8c%93%ea%b8%80-%ed%95%84%ec%88%98" class="header-anchor"&gt;&lt;/a&gt;2. &amp;ldquo;일반 블로그, 익명 댓글 필수&amp;rdquo;
&lt;/h4&gt;&lt;p&gt;→ &lt;strong&gt;Cusdis&lt;/strong&gt; (간단) 또는 &lt;strong&gt;Remark42&lt;/strong&gt; (고급)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cusdis: 5분 설정, 완전 무료&lt;/li&gt;
&lt;li&gt;Remark42: 더 많은 기능, 소셜 로그인 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-익명--github-로그인-둘-다"&gt;&lt;a href="#3-%ec%9d%b5%eb%aa%85--github-%eb%a1%9c%ea%b7%b8%ec%9d%b8-%eb%91%98-%eb%8b%a4" class="header-anchor"&gt;&lt;/a&gt;3. &amp;ldquo;익명 + GitHub 로그인 둘 다&amp;rdquo;
&lt;/h4&gt;&lt;p&gt;→ &lt;strong&gt;Remark42&lt;/strong&gt; ⭐⭐⭐⭐⭐&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;유일하게 둘 다 지원&lt;/li&gt;
&lt;li&gt;관리자 기능 강력&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-기술-없음-빠르게-설정"&gt;&lt;a href="#4-%ea%b8%b0%ec%88%a0-%ec%97%86%ec%9d%8c-%eb%b9%a0%eb%a5%b4%ea%b2%8c-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;4. &amp;ldquo;기술 없음, 빠르게 설정&amp;rdquo;
&lt;/h4&gt;&lt;p&gt;→ &lt;strong&gt;Disqus&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5분 설정&lt;/li&gt;
&lt;li&gt;광고는 감수&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-완전-무료--서버-관리-싫음"&gt;&lt;a href="#5-%ec%99%84%ec%a0%84-%eb%ac%b4%eb%a3%8c--%ec%84%9c%eb%b2%84-%ea%b4%80%eb%a6%ac-%ec%8b%ab%ec%9d%8c" class="header-anchor"&gt;&lt;/a&gt;5. &amp;ldquo;완전 무료 + 서버 관리 싫음&amp;rdquo;
&lt;/h4&gt;&lt;p&gt;→ &lt;strong&gt;Giscus&lt;/strong&gt; (GitHub) 또는 &lt;strong&gt;Cusdis&lt;/strong&gt; (익명)&lt;/p&gt;
&lt;h4 id="6-프라이버시-최우선"&gt;&lt;a href="#6-%ed%94%84%eb%9d%bc%ec%9d%b4%eb%b2%84%ec%8b%9c-%ec%b5%9c%ec%9a%b0%ec%84%a0" class="header-anchor"&gt;&lt;/a&gt;6. &amp;ldquo;프라이버시 최우선&amp;rdquo;
&lt;/h4&gt;&lt;p&gt;→ &lt;strong&gt;Remark42&lt;/strong&gt; 또는 &lt;strong&gt;Comentario&lt;/strong&gt; (셀프 호스팅)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;데이터 완전 통제&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="실전-구현-blowfish--giscus"&gt;&lt;a href="#%ec%8b%a4%ec%a0%84-%ea%b5%ac%ed%98%84-blowfish--giscus" class="header-anchor"&gt;&lt;/a&gt;실전 구현: Blowfish + Giscus
&lt;/h2&gt;&lt;h3 id="전체-설정-과정"&gt;&lt;a href="#%ec%a0%84%ec%b2%b4-%ec%84%a4%ec%a0%95-%ea%b3%bc%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;전체 설정 과정
&lt;/h3&gt;&lt;h4 id="1-github-discussions-활성화"&gt;&lt;a href="#1-github-discussions-%ed%99%9c%ec%84%b1%ed%99%94" class="header-anchor"&gt;&lt;/a&gt;1. GitHub Discussions 활성화
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GitHub 저장소 → Settings → Features → Discussions 체크
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-giscus-app-설치"&gt;&lt;a href="#2-giscus-app-%ec%84%a4%ec%b9%98" class="header-anchor"&gt;&lt;/a&gt;2. Giscus App 설치
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/apps/giscus 방문 → Install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;→ 저장소 선택
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="3-giscus-설정-생성"&gt;&lt;a href="#3-giscus-%ec%84%a4%ec%a0%95-%ec%83%9d%ec%84%b1" class="header-anchor"&gt;&lt;/a&gt;3. Giscus 설정 생성
&lt;/h4&gt;&lt;p&gt;&lt;a class="link" href="https://giscus.app/ko" target="_blank" rel="noopener"
 &gt;giscus.app/ko&lt;/a&gt;에서:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;저장소: 0AndWild/0AndWild.github.io
매핑: pathname
카테고리: Announcements
테마: preferred_color_scheme
언어: ko
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;생성된 코드 복사&lt;/p&gt;
&lt;h4 id="4-파일-생성"&gt;&lt;a href="#4-%ed%8c%8c%ec%9d%bc-%ec%83%9d%ec%84%b1" class="header-anchor"&gt;&lt;/a&gt;4. 파일 생성
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 디렉토리 생성 (없으면)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p layouts/partials
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 파일 생성&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch layouts/partials/comments.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="5-코드-삽입"&gt;&lt;a href="#5-%ec%bd%94%eb%93%9c-%ec%82%bd%ec%9e%85" class="header-anchor"&gt;&lt;/a&gt;5. 코드 삽입
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- layouts/partials/comments.html --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://giscus.app/client.js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0AndWild/0AndWild.github.io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;R_xxxxxxxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Announcements&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;DIC_xxxxxxxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pathname&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-strict&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-reactions-enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-emit-metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-input-position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;preferred_color_scheme&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ko&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;anonymous&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="6-paramstoml-수정"&gt;&lt;a href="#6-paramstoml-%ec%88%98%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;6. params.toml 수정
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;showComments&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="7-로컬-테스트"&gt;&lt;a href="#7-%eb%a1%9c%ec%bb%ac-%ed%85%8c%ec%8a%a4%ed%8a%b8" class="header-anchor"&gt;&lt;/a&gt;7. 로컬 테스트
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server -D
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# http://localhost:1313 에서 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="8-배포"&gt;&lt;a href="#8-%eb%b0%b0%ed%8f%ac" class="header-anchor"&gt;&lt;/a&gt;8. 배포
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Add Giscus comments&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="실전-구현-blowfish--remark42-railway"&gt;&lt;a href="#%ec%8b%a4%ec%a0%84-%ea%b5%ac%ed%98%84-blowfish--remark42-railway" class="header-anchor"&gt;&lt;/a&gt;실전 구현: Blowfish + Remark42 (Railway)
&lt;/h2&gt;&lt;h3 id="전체-설정-과정-1"&gt;&lt;a href="#%ec%a0%84%ec%b2%b4-%ec%84%a4%ec%a0%95-%ea%b3%bc%ec%a0%95-1" class="header-anchor"&gt;&lt;/a&gt;전체 설정 과정
&lt;/h3&gt;&lt;h4 id="1-github-oauth-app-생성"&gt;&lt;a href="#1-github-oauth-app-%ec%83%9d%ec%84%b1" class="header-anchor"&gt;&lt;/a&gt;1. GitHub OAuth App 생성
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GitHub → Settings → Developer settings → OAuth Apps → New OAuth App
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Application name: AndWild Blog Comments
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Homepage URL: https://0andwild.github.io
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Authorization callback URL: https://your-remark42.railway.app/auth/github/callback
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;생성 후:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client ID 복사
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client Secret 생성 및 복사
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-railway-배포"&gt;&lt;a href="#2-railway-%eb%b0%b0%ed%8f%ac" class="header-anchor"&gt;&lt;/a&gt;2. Railway 배포
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. railway.app 가입
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. &lt;span class="s2"&gt;&amp;#34;New Project&amp;#34;&lt;/span&gt; → &lt;span class="s2"&gt;&amp;#34;Deploy Docker Image&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. Image: umputun/remark42:latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 환경변수 추가:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;REMARK_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://your-project.railway.app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;randomly-generated-secret-key-change-this
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0andwild-blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AUTH_ANON&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AUTH_GITHUB_CID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_github_client_id
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AUTH_GITHUB_CSEC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_github_client_secret
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ADMIN_SHARED_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;github_yourusername
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="3-배포-확인"&gt;&lt;a href="#3-%eb%b0%b0%ed%8f%ac-%ed%99%95%ec%9d%b8" class="header-anchor"&gt;&lt;/a&gt;3. 배포 확인
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Railway가 자동으로 URL 생성:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://your-project.railway.app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;브라우저에서 접속하여 Remark42 UI 확인
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="4-blowfish-설정"&gt;&lt;a href="#4-blowfish-%ec%84%a4%ec%a0%95" class="header-anchor"&gt;&lt;/a&gt;4. Blowfish 설정
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p layouts/partials
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch layouts/partials/comments.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- layouts/partials/comments.html --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;remark42&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;remark_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://your-project.railway.app&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;site_id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0andwild-blog&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;embed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ko&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;script&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;remark_config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/web/&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})(&lt;/span&gt;&lt;span class="nx"&gt;remark_config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;components&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;embed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="5-paramstoml"&gt;&lt;a href="#5-paramstoml" class="header-anchor"&gt;&lt;/a&gt;5. params.toml
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;showComments&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="6-테스트-및-배포"&gt;&lt;a href="#6-%ed%85%8c%ec%8a%a4%ed%8a%b8-%eb%b0%8f-%eb%b0%b0%ed%8f%ac" class="header-anchor"&gt;&lt;/a&gt;6. 테스트 및 배포
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server -D
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 확인 후&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Add Remark42 comments&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="마이그레이션-가이드"&gt;&lt;a href="#%eb%a7%88%ec%9d%b4%ea%b7%b8%eb%a0%88%ec%9d%b4%ec%85%98-%ea%b0%80%ec%9d%b4%eb%93%9c" class="header-anchor"&gt;&lt;/a&gt;마이그레이션 가이드
&lt;/h2&gt;&lt;h3 id="disqus--giscus"&gt;&lt;a href="#disqus--giscus" class="header-anchor"&gt;&lt;/a&gt;Disqus → Giscus
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. Disqus에서 데이터 Export &lt;span class="o"&gt;(&lt;/span&gt;XML&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. GitHub Discussions로 수동 이전
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;자동화 스크립트 없음, 수동 작업 필요&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="disqus--remark42"&gt;&lt;a href="#disqus--remark42" class="header-anchor"&gt;&lt;/a&gt;Disqus → Remark42
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. Disqus XML Export
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. Remark42 Admin → Import → Disqus 선택
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. XML 파일 업로드
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="결론"&gt;&lt;a href="#%ea%b2%b0%eb%a1%a0" class="header-anchor"&gt;&lt;/a&gt;결론
&lt;/h2&gt;&lt;h3 id="최종-추천"&gt;&lt;a href="#%ec%b5%9c%ec%a2%85-%ec%b6%94%ec%b2%9c" class="header-anchor"&gt;&lt;/a&gt;최종 추천
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;상황&lt;/th&gt;
					&lt;th&gt;추천 시스템&lt;/th&gt;
					&lt;th&gt;이유&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;개발자 블로그&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Giscus&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;무료, GitHub 통합, Markdown&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;일반 블로그 (익명 필요)&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Cusdis&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;무료, 간단, 익명&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;익명 + 소셜 둘 다&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Remark42&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;유연함, 모든 기능&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;빠른 설정&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Disqus&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;5분 완료 (광고 감수)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;완전 통제&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Remark42&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;셀프 호스팅, 커스터마이징&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="개인-추천-0andwild-블로그"&gt;&lt;a href="#%ea%b0%9c%ec%9d%b8-%ec%b6%94%ec%b2%9c-0andwild-%eb%b8%94%eb%a1%9c%ea%b7%b8" class="header-anchor"&gt;&lt;/a&gt;개인 추천 (0AndWild 블로그)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Giscus&lt;/strong&gt; 사용 권장&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Pages 블로그에 완벽히 어울림&lt;/li&gt;
&lt;li&gt;기술 블로그는 GitHub 사용자가 주 독자&lt;/li&gt;
&lt;li&gt;무료, 간단, 유지보수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;대안&lt;/strong&gt;: Remark42 (익명 댓글 원할 때)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="빠른시작"&gt;&lt;a href="#%eb%b9%a0%eb%a5%b8%ec%8b%9c%ec%9e%91" class="header-anchor"&gt;&lt;/a&gt;빠른시작
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Giscus로 시작&lt;/strong&gt; (10분)&lt;/li&gt;
&lt;li&gt;사용자 피드백 수집&lt;/li&gt;
&lt;li&gt;익명 댓글 요청 많으면 &lt;strong&gt;Remark42로 전환&lt;/strong&gt; 고려&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;댓글 시스템은 나중에도 바꿀 수 있으니, 일단 Giscus로 시작하는 것을 강력히 권장합니다!&lt;/p&gt;</description></item><item><title>Hugo &amp; GithubPages 블로그 구독 및 이메일 알림 시스템 구현 가이드</title><link>https://0andwild.com/posts/251017_subscription_alert/</link><pubDate>Fri, 17 Oct 2025 10:00:00 +0900</pubDate><guid>https://0andwild.com/posts/251017_subscription_alert/</guid><description>&lt;img src="https://0andwild.com/" alt="Featured image of post Hugo &amp; GithubPages 블로그 구독 및 이메일 알림 시스템 구현 가이드" /&gt;&lt;h2 id="개요"&gt;&lt;a href="#%ea%b0%9c%ec%9a%94" class="header-anchor"&gt;&lt;/a&gt;개요
&lt;/h2&gt;&lt;p&gt;정적 사이트 생성기(Hugo)로 만든 블로그에 구독 및 이메일 알림 기능을 추가하는 방법을 분석합니다. 특히 &lt;strong&gt;키워드 기반 선택적 알림&lt;/strong&gt; 기능 구현까지 다룹니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-rss-feed--이메일-서비스"&gt;&lt;a href="#1-rss-feed--%ec%9d%b4%eb%a9%94%ec%9d%bc-%ec%84%9c%eb%b9%84%ec%8a%a4" class="header-anchor"&gt;&lt;/a&gt;1. RSS Feed + 이메일 서비스
&lt;/h2&gt;&lt;h3 id="개념"&gt;&lt;a href="#%ea%b0%9c%eb%85%90" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;Hugo의 기본 RSS Feed를 이메일로 변환하는 서비스를 활용하는 방식입니다.&lt;/p&gt;
&lt;h3 id="방법-a-blogtrottr"&gt;&lt;a href="#%eb%b0%a9%eb%b2%95-a-blogtrottr" class="header-anchor"&gt;&lt;/a&gt;방법 A: Blogtrottr
&lt;/h3&gt;&lt;h4 id="동작-방식"&gt;&lt;a href="#%eb%8f%99%ec%9e%91-%eb%b0%a9%ec%8b%9d" class="header-anchor"&gt;&lt;/a&gt;동작 방식
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. Hugo가 자동 생성한 RSS Feed (index.xml)
 ↓
2. 사용자가 Blogtrottr에 RSS URL 등록
 ↓
3. Blogtrottr가 주기적으로 RSS 확인
 ↓
4. 새 글 감지 시 이메일 발송
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="장점"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;✅ 개발자 작업 없음 (링크만 제공)&lt;/li&gt;
&lt;li&gt;✅ 완전 무료&lt;/li&gt;
&lt;li&gt;✅ 즉시 사용 가능&lt;/li&gt;
&lt;li&gt;✅ 서버 없이 동작&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="단점"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;❌ 구독자 관리 불가&lt;/li&gt;
&lt;li&gt;❌ 이메일 디자인 커스텀 불가&lt;/li&gt;
&lt;li&gt;❌ 통계 없음&lt;/li&gt;
&lt;li&gt;❌ 키워드 필터링 불가&lt;/li&gt;
&lt;li&gt;❌ 사용자가 직접 외부 사이트에서 등록해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="구현-난이도"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h4&gt;&lt;p&gt;⭐ (1/5) - 가장 쉬움&lt;/p&gt;
&lt;h4 id="사용-예시"&gt;&lt;a href="#%ec%82%ac%ec%9a%a9-%ec%98%88%ec%8b%9c" class="header-anchor"&gt;&lt;/a&gt;사용 예시
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;블로그에 링크 추가:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&lt;span class="nt"&gt;이메일로 구독하기&lt;/span&gt;](&lt;span class="na"&gt;https://blogtrottr.com&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(사이트에서 https://0andwild.github.io/index.xml 입력)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="방법-b-feedburner-google"&gt;&lt;a href="#%eb%b0%a9%eb%b2%95-b-feedburner-google" class="header-anchor"&gt;&lt;/a&gt;방법 B: FeedBurner (Google)
&lt;/h3&gt;&lt;h4 id="동작-방식-1"&gt;&lt;a href="#%eb%8f%99%ec%9e%91-%eb%b0%a9%ec%8b%9d-1" class="header-anchor"&gt;&lt;/a&gt;동작 방식
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. FeedBurner에 RSS Feed 등록
 ↓
2. FeedBurner가 RSS를 프록시/관리
 ↓
3. 구독 폼을 블로그에 삽입
 ↓
4. 사용자가 블로그에서 직접 구독
 ↓
5. 새 글 발행 시 자동 이메일 발송
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="장점-1"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-1" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;✅ 기본 통계 제공&lt;/li&gt;
&lt;li&gt;✅ 구독 폼 제공&lt;/li&gt;
&lt;li&gt;✅ 무료&lt;/li&gt;
&lt;li&gt;✅ RSS 관리 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="단점-1"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-1" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;❌ Google의 지원 중단 가능성 (업데이트 중단됨)&lt;/li&gt;
&lt;li&gt;❌ 키워드 필터링 불가&lt;/li&gt;
&lt;li&gt;❌ 커스텀 제한적&lt;/li&gt;
&lt;li&gt;❌ 오래된 UI&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="구현-난이도-1"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84-1" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h4&gt;&lt;p&gt;⭐⭐ (2/5)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-mailchimp--rss-campaign-추천"&gt;&lt;a href="#2-mailchimp--rss-campaign-%ec%b6%94%ec%b2%9c" class="header-anchor"&gt;&lt;/a&gt;2. Mailchimp + RSS Campaign (추천)
&lt;/h2&gt;&lt;h3 id="개념-1"&gt;&lt;a href="#%ea%b0%9c%eb%85%90-1" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;전문 이메일 마케팅 플랫폼을 활용하여 RSS Feed를 자동으로 이메일로 변환&lt;/p&gt;
&lt;h3 id="동작-방식-2"&gt;&lt;a href="#%eb%8f%99%ec%9e%91-%eb%b0%a9%ec%8b%9d-2" class="header-anchor"&gt;&lt;/a&gt;동작 방식
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. Mailchimp에 RSS Campaign 생성
 ↓
2. RSS URL 등록 및 체크 주기 설정 (일/주/월)
 ↓
3. 블로그에 Mailchimp 구독 폼 삽입
 ↓
4. 사용자가 이메일 입력하여 구독
 ↓
5. 새 글 감지 시 자동으로 이메일 템플릿 생성
 ↓
6. 전체 구독자에게 발송
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="장점-2"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-2" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;무료 티어&lt;/strong&gt;: 2,000명 구독자까지&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;전문적인 이메일 디자인&lt;/strong&gt; (드래그 앤 드롭 에디터)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;구독자 관리&lt;/strong&gt; (추가/삭제/세그먼트)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;상세한 통계&lt;/strong&gt; (오픈율, 클릭율, 구독 해지율)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;구독 폼 자동 생성&lt;/strong&gt; (임베드 코드 제공)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;자동화&lt;/strong&gt; (새 글만 발송)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;모바일 최적화&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;스팸 필터 회피&lt;/strong&gt; (전문 발송 서버)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점-2"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-2" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ 키워드 필터링 기본 미지원 (Pro 플랜에서 태그별 세그먼트 가능)&lt;/li&gt;
&lt;li&gt;❌ 무료 티어에서 Mailchimp 로고 표시&lt;/li&gt;
&lt;li&gt;❌ 2,000명 초과 시 유료 ($13/월~)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="구현-난이도-2"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84-2" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h3&gt;&lt;p&gt;⭐⭐ (2/5)&lt;/p&gt;
&lt;h3 id="설정-단계"&gt;&lt;a href="#%ec%84%a4%ec%a0%95-%eb%8b%a8%ea%b3%84" class="header-anchor"&gt;&lt;/a&gt;설정 단계
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. Mailchimp 계정 생성
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. Audience 생성
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. Campaign → Create → Email → RSS Campaign
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. RSS URL 입력: https://your-blog.com/index.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 발송 주기 설정 &lt;span class="o"&gt;(&lt;/span&gt;Daily/Weekly&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6. 이메일 템플릿 디자인
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7. 구독 폼 코드 복사
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8. Hugo에 삽입 &lt;span class="o"&gt;(&lt;/span&gt;layouts/partials/subscribe.html&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="블로그-삽입-코드-예시"&gt;&lt;a href="#%eb%b8%94%eb%a1%9c%ea%b7%b8-%ec%82%bd%ec%9e%85-%ec%bd%94%eb%93%9c-%ec%98%88%ec%8b%9c" class="header-anchor"&gt;&lt;/a&gt;블로그 삽입 코드 예시
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- Mailchimp 구독 폼 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mc_embed_signup&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://your-mailchimp-url.com/subscribe&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;post&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EMAIL&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;이메일 주소&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;submit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;구독하기&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="3-buttondown-개발자-친화적-추천"&gt;&lt;a href="#3-buttondown-%ea%b0%9c%eb%b0%9c%ec%9e%90-%ec%b9%9c%ed%99%94%ec%a0%81-%ec%b6%94%ec%b2%9c" class="header-anchor"&gt;&lt;/a&gt;3. Buttondown (개발자 친화적, 추천)
&lt;/h2&gt;&lt;h3 id="개념-2"&gt;&lt;a href="#%ea%b0%9c%eb%85%90-2" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;Markdown 기반의 뉴스레터 플랫폼으로, API를 통한 커스터마이징이 가능&lt;/p&gt;
&lt;h3 id="동작-방식-3"&gt;&lt;a href="#%eb%8f%99%ec%9e%91-%eb%b0%a9%ec%8b%9d-3" class="header-anchor"&gt;&lt;/a&gt;동작 방식
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. Buttondown에 RSS Feed 연동
 ↓
2. 자동으로 RSS 항목을 Markdown 이메일로 변환
 ↓
3. 구독자가 태그/키워드 선택 가능
 ↓
4. API를 통해 특정 태그 구독자만 필터링 가능
 ↓
5. 매칭되는 구독자에게만 발송
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="장점-3"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-3" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;무료 티어&lt;/strong&gt;: 1,000명까지&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Markdown 기반&lt;/strong&gt; (개발자 친화적)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;강력한 API&lt;/strong&gt; (커스텀 가능)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;태그 기반 구독&lt;/strong&gt; (키워드 필터링 구현 가능)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;광고 없음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;깔끔한 UI&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;RSS import 자동화&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;프라이버시 중심&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점-3"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-3" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ 이메일 디자인이 단순 (Markdown만)&lt;/li&gt;
&lt;li&gt;❌ 통계 기능이 Mailchimp보다 약함&lt;/li&gt;
&lt;li&gt;❌ 한국어 지원 부족&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="구현-난이도-3"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84-3" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h3&gt;&lt;p&gt;⭐⭐⭐ (3/5) - API 사용 시 난이도 증가&lt;/p&gt;
&lt;h3 id="키워드-알림-구현-예시"&gt;&lt;a href="#%ed%82%a4%ec%9b%8c%eb%93%9c-%ec%95%8c%eb%a6%bc-%ea%b5%ac%ed%98%84-%ec%98%88%ec%8b%9c" class="header-anchor"&gt;&lt;/a&gt;키워드 알림 구현 예시
&lt;/h3&gt;&lt;h4 id="1단계-구독-폼에-태그-선택-추가"&gt;&lt;a href="#1%eb%8b%a8%ea%b3%84-%ea%b5%ac%eb%8f%85-%ed%8f%bc%ec%97%90-%ed%83%9c%ea%b7%b8-%ec%84%a0%ed%83%9d-%ec%b6%94%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;1단계: 구독 폼에 태그 선택 추가
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://buttondown.email/api/emails/embed-subscribe/YOUR_ID&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;post&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;이메일&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;관심 주제 선택:&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tags&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;kubernetes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Kubernetes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tags&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;docker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tags&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;golang&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Go
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;submit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;구독하기&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2단계-github-actions로-선택적-발송"&gt;&lt;a href="#2%eb%8b%a8%ea%b3%84-github-actions%eb%a1%9c-%ec%84%a0%ed%83%9d%ec%a0%81-%eb%b0%9c%ec%86%a1" class="header-anchor"&gt;&lt;/a&gt;2단계: GitHub Actions로 선택적 발송
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Send Newsletter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;push&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;content/posts/**&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;send&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Extract tags from post&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; TAGS=$(grep &amp;#34;^tags = &amp;#34; content/posts/*/index.md | cut -d&amp;#39;&amp;#34;&amp;#39; -f2)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;POST_TAGS=$TAGS&amp;#34; &amp;gt;&amp;gt; $GITHUB_ENV&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Send to matching subscribers&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; curl -X POST https://api.buttondown.email/v1/emails \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -H &amp;#34;Authorization: Token ${{ secrets.BUTTONDOWN_API_KEY }}&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -d &amp;#34;subject=New Post&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -d &amp;#34;body=...&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -d &amp;#34;tag=$POST_TAGS&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="4-sendgrid--github-actions-완전-커스텀"&gt;&lt;a href="#4-sendgrid--github-actions-%ec%99%84%ec%a0%84-%ec%bb%a4%ec%8a%a4%ed%85%80" class="header-anchor"&gt;&lt;/a&gt;4. SendGrid + GitHub Actions (완전 커스텀)
&lt;/h2&gt;&lt;h3 id="개념-3"&gt;&lt;a href="#%ea%b0%9c%eb%85%90-3" class="header-anchor"&gt;&lt;/a&gt;개념
&lt;/h3&gt;&lt;p&gt;이메일 발송 API와 CI/CD를 결합하여 완전히 커스터마이징된 알림 시스템 구축&lt;/p&gt;
&lt;h3 id="동작-방식-4"&gt;&lt;a href="#%eb%8f%99%ec%9e%91-%eb%b0%a9%ec%8b%9d-4" class="header-anchor"&gt;&lt;/a&gt;동작 방식
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. 새 글 작성 후 Git Push
 ↓
2. GitHub Actions 트리거
 ↓
3. Action에서 Front Matter 파싱
 - 글 제목, 요약, 태그 추출
 ↓
4. 구독자 DB 조회 (Supabase/JSON 파일)
 - 각 구독자의 관심 키워드와 매칭
 ↓
5. 매칭되는 구독자만 필터링
 ↓
6. SendGrid API로 개별 이메일 발송
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="장점-4"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-4" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;완전한 통제&lt;/strong&gt; (모든 로직 커스터마이징)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;키워드 알림 완벽 구현&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;무료 티어&lt;/strong&gt;: SendGrid 월 100통&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;자동화&lt;/strong&gt; (Git push만 하면 됨)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;확장 가능&lt;/strong&gt; (DB, 로직 자유롭게)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;구독자 데이터 소유&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점-4"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-4" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;❌ 개발 작업 필요&lt;/li&gt;
&lt;li&gt;❌ 유지보수 부담&lt;/li&gt;
&lt;li&gt;❌ SendGrid 무료 티어 제한적 (월 100통)&lt;/li&gt;
&lt;li&gt;❌ 구독 폼, DB 직접 구현 필요&lt;/li&gt;
&lt;li&gt;❌ 스팸 필터 회피 설정 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="구현-난이도-4"&gt;&lt;a href="#%ea%b5%ac%ed%98%84-%eb%82%9c%ec%9d%b4%eb%8f%84-4" class="header-anchor"&gt;&lt;/a&gt;구현 난이도
&lt;/h3&gt;&lt;p&gt;⭐⭐⭐⭐⭐ (5/5) - 가장 복잡&lt;/p&gt;
&lt;h3 id="아키텍처"&gt;&lt;a href="#%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98" class="header-anchor"&gt;&lt;/a&gt;아키텍처
&lt;/h3&gt;&lt;h4 id="구독자-데이터베이스-옵션"&gt;&lt;a href="#%ea%b5%ac%eb%8f%85%ec%9e%90-%eb%8d%b0%ec%9d%b4%ed%84%b0%eb%b2%a0%ec%9d%b4%ec%8a%a4-%ec%98%b5%ec%85%98" class="header-anchor"&gt;&lt;/a&gt;구독자 데이터베이스 옵션
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;옵션 A: JSON 파일 (간단)&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// subscribers.json (GitHub 저장소에 암호화하여 저장)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;user@example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;kubernetes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;docker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;active&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;dev@example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;golang&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;rust&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;active&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;옵션 B: Supabase (권장)&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- subscribers 테이블
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subscribers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UUID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;PRIMARY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UNIQUE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;keywords&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- 배열 형태
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;BOOLEAN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DEFAULT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DEFAULT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="github-actions-워크플로우"&gt;&lt;a href="#github-actions-%ec%9b%8c%ed%81%ac%ed%94%8c%eb%a1%9c%ec%9a%b0" class="header-anchor"&gt;&lt;/a&gt;GitHub Actions 워크플로우
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Email Notification&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;push&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;branches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;main]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;content/posts/**&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/checkout@v3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Setup Node.js&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/setup-node@v3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;node-version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;18&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Extract Post Metadata&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;metadata&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; # 가장 최근 수정된 포스트 찾기
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; POST_FILE=$(git diff-tree --no-commit-id --name-only -r ${{ github.sha }} | grep &amp;#39;content/posts&amp;#39; | head -1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; # Front Matter 파싱
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; TITLE=$(grep &amp;#34;^title = &amp;#34; $POST_FILE | cut -d&amp;#39;&amp;#34;&amp;#39; -f2)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; TAGS=$(grep &amp;#34;^tags = &amp;#34; $POST_FILE | sed &amp;#39;s/tags = \[//;s/\]//;s/&amp;#34;//g&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; SUMMARY=$(grep &amp;#34;^summary = &amp;#34; $POST_FILE | cut -d&amp;#39;&amp;#34;&amp;#39; -f2)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; URL=&amp;#34;https://0andwild.github.io/$(dirname $POST_FILE | sed &amp;#39;s/content\///&amp;#39;)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;title=$TITLE&amp;#34; &amp;gt;&amp;gt; $GITHUB_OUTPUT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;tags=$TAGS&amp;#34; &amp;gt;&amp;gt; $GITHUB_OUTPUT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;summary=$SUMMARY&amp;#34; &amp;gt;&amp;gt; $GITHUB_OUTPUT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;url=$URL&amp;#34; &amp;gt;&amp;gt; $GITHUB_OUTPUT&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Query Matching Subscribers&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;subscribers&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; # Supabase에서 매칭되는 구독자 조회
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; curl -X POST https://YOUR_PROJECT.supabase.co/rest/v1/rpc/get_matching_subscribers \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -H &amp;#34;apikey: ${{ secrets.SUPABASE_KEY }}&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -H &amp;#34;Content-Type: application/json&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -d &amp;#34;{\&amp;#34;post_tags\&amp;#34;: \&amp;#34;${{ steps.metadata.outputs.tags }}\&amp;#34;}&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;gt; subscribers.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Send Emails via SendGrid&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; # Node.js 스크립트 실행
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; cat &amp;gt; send-emails.js &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; const sgMail = require(&amp;#39;@sendgrid/mail&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; const fs = require(&amp;#39;fs&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; sgMail.setApiKey(process.env.SENDGRID_API_KEY);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; const subscribers = JSON.parse(fs.readFileSync(&amp;#39;subscribers.json&amp;#39;));
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; const title = process.env.POST_TITLE;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; const summary = process.env.POST_SUMMARY;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; const url = process.env.POST_URL;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; subscribers.forEach(async (subscriber) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; const msg = {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; to: subscriber.email,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; from: &amp;#39;noreply@0andwild.github.io&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; subject: `새 글: ${title}`,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; html: `
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;lt;h2&amp;gt;${title}&amp;lt;/h2&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;lt;p&amp;gt;${summary}&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;lt;p&amp;gt;관심 키워드와 일치: ${subscriber.matched_keywords.join(&amp;#39;, &amp;#39;)}&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;lt;a href=&amp;#34;${url}&amp;#34;&amp;gt;글 읽기&amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;lt;hr&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;lt;small&amp;gt;&amp;lt;a href=&amp;#34;https://0andwild.github.io/unsubscribe?token=${subscriber.token}&amp;#34;&amp;gt;구독 취소&amp;lt;/a&amp;gt;&amp;lt;/small&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; `
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; await sgMail.send(msg);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; console.log(`Email sent to ${subscriber.email}`);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; npm install @sendgrid/mail
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; node send-emails.js&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;SENDGRID_API_KEY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ secrets.SENDGRID_API_KEY }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;POST_TITLE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ steps.metadata.outputs.title }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;POST_SUMMARY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ steps.metadata.outputs.summary }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;POST_URL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ steps.metadata.outputs.url }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="구독-폼-구현-hugo-shortcode"&gt;&lt;a href="#%ea%b5%ac%eb%8f%85-%ed%8f%bc-%ea%b5%ac%ed%98%84-hugo-shortcode" class="header-anchor"&gt;&lt;/a&gt;구독 폼 구현 (Hugo Shortcode)
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- layouts/shortcodes/subscribe.html --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;subscription-form&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;블로그 구독하기&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;subscribe-form&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;이메일 주소&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;fieldset&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;관심 주제 선택 (선택한 주제의 글만 알림)&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;kubernetes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Kubernetes&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;docker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Docker&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;golang&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Go&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;rust&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Rust&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;devops&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; DevOps&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;fieldset&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;submit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;구독하기&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;subscribe-form&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;submit&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;keywords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;input[name=&amp;#34;keywords&amp;#34;]:checked&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cb&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Supabase에 저장
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://YOUR_PROJECT.supabase.co/rest/v1/subscribers&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;apikey&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;YOUR_ANON_KEY&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;keywords&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;구독이 완료되었습니다!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;오류가 발생했습니다.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="supabase-함수-키워드-매칭"&gt;&lt;a href="#supabase-%ed%95%a8%ec%88%98-%ed%82%a4%ec%9b%8c%eb%93%9c-%eb%a7%a4%ec%b9%ad" class="header-anchor"&gt;&lt;/a&gt;Supabase 함수 (키워드 매칭)
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 매칭되는 구독자를 찾는 함수
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;OR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;REPLACE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FUNCTION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;get_matching_subscribers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_tags&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RETURNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;matched_keywords&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;RETURN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;QUERY&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ARRAY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;unnest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keywords&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTERSECT&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;unnest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string_to_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_tags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;matched_keywords&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unsubscribe_token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subscribers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keywords&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;string_to_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_tags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- 배열 겹침 연산자
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;LANGUAGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;plpgsql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="비용-분석"&gt;&lt;a href="#%eb%b9%84%ec%9a%a9-%eb%b6%84%ec%84%9d" class="header-anchor"&gt;&lt;/a&gt;비용 분석
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SendGrid&lt;/strong&gt;: 월 100통 무료 (이후 $19.95/월)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supabase&lt;/strong&gt;: 월 500MB DB, 2GB 전송 무료&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Actions&lt;/strong&gt;: 월 2,000분 무료&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;총 비용&lt;/strong&gt;: 완전 무료 (소규모 블로그)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="5-완전-커스텀-supabase--github-actions--resend"&gt;&lt;a href="#5-%ec%99%84%ec%a0%84-%ec%bb%a4%ec%8a%a4%ed%85%80-supabase--github-actions--resend" class="header-anchor"&gt;&lt;/a&gt;5. 완전 커스텀 (Supabase + GitHub Actions + Resend)
&lt;/h2&gt;&lt;h3 id="sendgrid-대안-resend"&gt;&lt;a href="#sendgrid-%eb%8c%80%ec%95%88-resend" class="header-anchor"&gt;&lt;/a&gt;SendGrid 대안: Resend
&lt;/h3&gt;&lt;p&gt;SendGrid보다 개발자 친화적인 최신 이메일 API&lt;/p&gt;
&lt;h3 id="장점-5"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-5" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;무료 티어&lt;/strong&gt;: 월 3,000통 (SendGrid의 30배!)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;더 간단한 API&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;React Email 지원&lt;/strong&gt; (JSX로 이메일 작성)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;더 나은 개발자 경험&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resend-사용-예시"&gt;&lt;a href="#resend-%ec%82%ac%ec%9a%a9-%ec%98%88%ec%8b%9c" class="header-anchor"&gt;&lt;/a&gt;Resend 사용 예시
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Resend&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;resend&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Resend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RESEND_API_KEY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;resend&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;from&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;blog@0andwild.github.io&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;subscriber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="sb"&gt;`새 글: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="sb"&gt;`&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;&amp;lt;/p&amp;gt;&amp;lt;a href=&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;&amp;#34;&amp;gt;읽기&amp;lt;/a&amp;gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="비교표"&gt;&lt;a href="#%eb%b9%84%ea%b5%90%ed%91%9c" class="header-anchor"&gt;&lt;/a&gt;비교표
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;방법&lt;/th&gt;
					&lt;th&gt;무료 한도&lt;/th&gt;
					&lt;th&gt;키워드 알림&lt;/th&gt;
					&lt;th&gt;난이도&lt;/th&gt;
					&lt;th&gt;구독자 관리&lt;/th&gt;
					&lt;th&gt;커스텀&lt;/th&gt;
					&lt;th&gt;추천&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Blogtrottr&lt;/td&gt;
					&lt;td&gt;무제한&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;⭐&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;테스트용&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;FeedBurner&lt;/td&gt;
					&lt;td&gt;무제한&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;⭐⭐&lt;/td&gt;
					&lt;td&gt;⚠️&lt;/td&gt;
					&lt;td&gt;⚠️&lt;/td&gt;
					&lt;td&gt;비추천 (지원 중단)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Mailchimp&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2,000명&lt;/td&gt;
					&lt;td&gt;⚠️ (Pro)&lt;/td&gt;
					&lt;td&gt;⭐⭐&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⚠️&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;일반 구독용&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Buttondown&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;1,000명&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⭐⭐⭐&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;개발자용&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SendGrid + Actions&lt;/td&gt;
					&lt;td&gt;100통/월&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅✅&lt;/td&gt;
					&lt;td&gt;고급 사용자&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Resend + Actions&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;3,000통/월&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅✅&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;완벽한 통제&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="추천-로드맵"&gt;&lt;a href="#%ec%b6%94%ec%b2%9c-%eb%a1%9c%eb%93%9c%eb%a7%b5" class="header-anchor"&gt;&lt;/a&gt;추천 로드맵
&lt;/h2&gt;&lt;h3 id="단계-1-빠른-시작-즉시"&gt;&lt;a href="#%eb%8b%a8%ea%b3%84-1-%eb%b9%a0%eb%a5%b8-%ec%8b%9c%ec%9e%91-%ec%a6%89%ec%8b%9c" class="header-anchor"&gt;&lt;/a&gt;단계 1: 빠른 시작 (즉시)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Mailchimp RSS Campaign&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10분 설정&lt;/li&gt;
&lt;li&gt;전체 구독자에게 모든 글 알림&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단계-2-개선-1주-후"&gt;&lt;a href="#%eb%8b%a8%ea%b3%84-2-%ea%b0%9c%ec%84%a0-1%ec%a3%bc-%ed%9b%84" class="header-anchor"&gt;&lt;/a&gt;단계 2: 개선 (1주 후)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Buttondown&lt;/strong&gt;으로 마이그레이션&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;더 깔끔한 경험&lt;/li&gt;
&lt;li&gt;기본 태그 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단계-3-고급-기능-필요-시"&gt;&lt;a href="#%eb%8b%a8%ea%b3%84-3-%ea%b3%a0%ea%b8%89-%ea%b8%b0%eb%8a%a5-%ed%95%84%ec%9a%94-%ec%8b%9c" class="header-anchor"&gt;&lt;/a&gt;단계 3: 고급 기능 (필요 시)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Resend + GitHub Actions + Supabase&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;키워드 기반 선택적 알림&lt;/li&gt;
&lt;li&gt;완전한 통제&lt;/li&gt;
&lt;li&gt;확장 가능성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="결론"&gt;&lt;a href="#%ea%b2%b0%eb%a1%a0" class="header-anchor"&gt;&lt;/a&gt;결론
&lt;/h2&gt;&lt;h3 id="일반-블로거라면"&gt;&lt;a href="#%ec%9d%bc%eb%b0%98-%eb%b8%94%eb%a1%9c%ea%b1%b0%eb%9d%bc%eb%a9%b4" class="header-anchor"&gt;&lt;/a&gt;일반 블로거라면:
&lt;/h3&gt;&lt;p&gt;→ &lt;strong&gt;Mailchimp&lt;/strong&gt; (가장 쉽고 전문적)&lt;/p&gt;
&lt;h3 id="개발자-블로그라면"&gt;&lt;a href="#%ea%b0%9c%eb%b0%9c%ec%9e%90-%eb%b8%94%eb%a1%9c%ea%b7%b8%eb%9d%bc%eb%a9%b4" class="header-anchor"&gt;&lt;/a&gt;개발자 블로그라면:
&lt;/h3&gt;&lt;p&gt;→ &lt;strong&gt;Buttondown&lt;/strong&gt; (개발자 친화적, API 제공)&lt;/p&gt;
&lt;h3 id="키워드-알림이-필수라면"&gt;&lt;a href="#%ed%82%a4%ec%9b%8c%eb%93%9c-%ec%95%8c%eb%a6%bc%ec%9d%b4-%ed%95%84%ec%88%98%eb%9d%bc%eb%a9%b4" class="header-anchor"&gt;&lt;/a&gt;키워드 알림이 필수라면:
&lt;/h3&gt;&lt;p&gt;→ &lt;strong&gt;Resend + GitHub Actions + Supabase&lt;/strong&gt; (완전 커스텀)&lt;/p&gt;
&lt;h3 id="돈-안-쓰고-테스트하려면"&gt;&lt;a href="#%eb%8f%88-%ec%95%88-%ec%93%b0%ea%b3%a0-%ed%85%8c%ec%8a%a4%ed%8a%b8%ed%95%98%eb%a0%a4%eb%a9%b4" class="header-anchor"&gt;&lt;/a&gt;돈 안 쓰고 테스트하려면:
&lt;/h3&gt;&lt;p&gt;→ &lt;strong&gt;Blogtrottr&lt;/strong&gt; (30초 설정)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="빠른시작"&gt;&lt;a href="#%eb%b9%a0%eb%a5%b8%ec%8b%9c%ec%9e%91" class="header-anchor"&gt;&lt;/a&gt;빠른시작
&lt;/h2&gt;&lt;p&gt;실제 구현을 원하신다면:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mailchimp로 시작 (학습 곡선 낮음)&lt;/li&gt;
&lt;li&gt;트래픽 증가 시 Buttondown 고려&lt;/li&gt;
&lt;li&gt;고급 기능 필요 시 커스텀 솔루션 구축&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;키워드 알림은 초기엔 과한 기능일 수 있으니, 기본 구독부터 시작하는 것을 권장합니다.&lt;/p&gt;</description></item><item><title>Hugo markdown 설명서</title><link>https://0andwild.com/posts/251016_blowfish_markdown/</link><pubDate>Thu, 16 Oct 2025 18:36:52 +0900</pubDate><guid>https://0andwild.com/posts/251016_blowfish_markdown/</guid><description>&lt;img src="https://0andwild.com/" alt="Featured image of post Hugo markdown 설명서" /&gt;&lt;!-- 본문 작성 가이드 --&gt;
&lt;h2 id="제목-h2"&gt;&lt;a href="#%ec%a0%9c%eb%aa%a9-h2" class="header-anchor"&gt;&lt;/a&gt;제목 (H2)
&lt;/h2&gt;&lt;h3 id="소제목-h3"&gt;&lt;a href="#%ec%86%8c%ec%a0%9c%eb%aa%a9-h3" class="header-anchor"&gt;&lt;/a&gt;소제목 (H3)
&lt;/h3&gt;&lt;p&gt;일반 텍스트입니다. &lt;strong&gt;굵게&lt;/strong&gt;, &lt;em&gt;기울임&lt;/em&gt;, &lt;del&gt;취소선&lt;/del&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="이미지-삽입"&gt;&lt;a href="#%ec%9d%b4%eb%af%b8%ec%a7%80-%ec%82%bd%ec%9e%85" class="header-anchor"&gt;&lt;/a&gt;이미지 삽입
&lt;/h2&gt;&lt;h3 id="방법-1-로컬-이미지"&gt;&lt;a href="#%eb%b0%a9%eb%b2%95-1-%eb%a1%9c%ec%bb%ac-%ec%9d%b4%eb%af%b8%ec%a7%80" class="header-anchor"&gt;&lt;/a&gt;방법 1: 로컬 이미지
&lt;/h3&gt;&lt;p&gt;포스트 폴더 내에 이미지 파일을 넣고 사용:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;![&lt;span class="nt"&gt;이미지 설명&lt;/span&gt;](&lt;span class="na"&gt;image.jpg&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="방법-2-외부-이미지-url"&gt;&lt;a href="#%eb%b0%a9%eb%b2%95-2-%ec%99%b8%eb%b6%80-%ec%9d%b4%eb%af%b8%ec%a7%80-url" class="header-anchor"&gt;&lt;/a&gt;방법 2: 외부 이미지 URL
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;![&lt;span class="nt"&gt;이미지 설명&lt;/span&gt;](&lt;span class="na"&gt;https://example.com/image.jpg&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="방법-3-html-태그-크기-조정-가능"&gt;&lt;a href="#%eb%b0%a9%eb%b2%95-3-html-%ed%83%9c%ea%b7%b8-%ed%81%ac%ea%b8%b0-%ec%a1%b0%ec%a0%95-%ea%b0%80%eb%8a%a5" class="header-anchor"&gt;&lt;/a&gt;방법 3: HTML 태그 (크기 조정 가능)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;image.jpg&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;이미지 설명&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;500&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="캐러셀-이미지-슬라이드-효과"&gt;&lt;a href="#%ec%ba%90%eb%9f%ac%ec%85%80-%ec%9d%b4%eb%af%b8%ec%a7%80-%ec%8a%ac%eb%9d%bc%ec%9d%b4%eb%93%9c-%ed%9a%a8%ea%b3%bc" class="header-anchor"&gt;&lt;/a&gt;캐러셀 이미지 (슬라이드 효과)
&lt;/h3&gt;&lt;h3 id="169"&gt;&lt;a href="#169" class="header-anchor"&gt;&lt;/a&gt;16:9
&lt;/h3&gt;&lt;div class="stack-carousel" style="--stack-carousel-ratio: ZgotmplZ;"&gt;&lt;img src="https://0andwild.com/posts/251016_blowfish_markdown/img/test1.jpeg" alt="img/test1.jpeg" loading="lazy"&gt;&lt;img src="https://0andwild.com/posts/251016_blowfish_markdown/img/test2.jpeg" alt="img/test2.jpeg" loading="lazy"&gt;&lt;img src="https://0andwild.com/posts/251016_blowfish_markdown/img/test3.jpeg" alt="img/test3.jpeg" loading="lazy"&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="hahahugoshortcode67s1hbhb"&gt;&lt;a href="#hahahugoshortcode67s1hbhb" class="header-anchor"&gt;&lt;/a&gt;21:9
&lt;div class="stack-carousel" style="--stack-carousel-ratio: ZgotmplZ;"&gt;&lt;img src="https://0andwild.com/posts/251016_blowfish_markdown/img/test1.jpeg" alt="img/test1.jpeg" loading="lazy"&gt;&lt;img src="https://0andwild.com/posts/251016_blowfish_markdown/img/test2.jpeg" alt="img/test2.jpeg" loading="lazy"&gt;&lt;img src="https://0andwild.com/posts/251016_blowfish_markdown/img/test3.jpeg" alt="img/test3.jpeg" loading="lazy"&gt;&lt;/div&gt;

&lt;/h2&gt;&lt;h2 id="코드-삽입"&gt;&lt;a href="#%ec%bd%94%eb%93%9c-%ec%82%bd%ec%9e%85" class="header-anchor"&gt;&lt;/a&gt;코드 삽입
&lt;/h2&gt;&lt;h3 id="인라인-코드"&gt;&lt;a href="#%ec%9d%b8%eb%9d%bc%ec%9d%b8-%ec%bd%94%eb%93%9c" class="header-anchor"&gt;&lt;/a&gt;인라인 코드
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;inline code&lt;/code&gt; 형식으로 작성&lt;/p&gt;
&lt;h3 id="코드-블록"&gt;&lt;a href="#%ec%bd%94%eb%93%9c-%eb%b8%94%eb%a1%9d" class="header-anchor"&gt;&lt;/a&gt;코드 블록
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -p 8080:80 nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="링크"&gt;&lt;a href="#%eb%a7%81%ed%81%ac" class="header-anchor"&gt;&lt;/a&gt;링크
&lt;/h2&gt;&lt;h3 id="기본-링크"&gt;&lt;a href="#%ea%b8%b0%eb%b3%b8-%eb%a7%81%ed%81%ac" class="header-anchor"&gt;&lt;/a&gt;기본 링크
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://example.com" target="_blank" rel="noopener"
 &gt;링크 텍스트&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="참조-스타일-링크"&gt;&lt;a href="#%ec%b0%b8%ec%a1%b0-%ec%8a%a4%ed%83%80%ec%9d%bc-%eb%a7%81%ed%81%ac" class="header-anchor"&gt;&lt;/a&gt;참조 스타일 링크
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://example.com" title="링크 설명"
 target="_blank" rel="noopener"
 &gt;링크 텍스트&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="article-참조"&gt;&lt;a href="#article-%ec%b0%b8%ec%a1%b0" class="header-anchor"&gt;&lt;/a&gt;article 참조
&lt;/h3&gt;&lt;a class="stack-article-card" href="https://0andwild.com/docs/welcome/"&gt;
 &lt;span class="stack-article-card__title"&gt;/docs/welcome/&lt;/span&gt;&lt;span&gt;Open linked article&lt;/span&gt;&lt;/a&gt;

&lt;hr&gt;
&lt;h2 id="리스트"&gt;&lt;a href="#%eb%a6%ac%ec%8a%a4%ed%8a%b8" class="header-anchor"&gt;&lt;/a&gt;리스트
&lt;/h2&gt;&lt;h3 id="순서-없는-리스트"&gt;&lt;a href="#%ec%88%9c%ec%84%9c-%ec%97%86%eb%8a%94-%eb%a6%ac%ec%8a%a4%ed%8a%b8" class="header-anchor"&gt;&lt;/a&gt;순서 없는 리스트
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;항목 1&lt;/li&gt;
&lt;li&gt;항목 2
&lt;ul&gt;
&lt;li&gt;하위 항목 2-1&lt;/li&gt;
&lt;li&gt;하위 항목 2-2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;항목 3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="순서-있는-리스트"&gt;&lt;a href="#%ec%88%9c%ec%84%9c-%ec%9e%88%eb%8a%94-%eb%a6%ac%ec%8a%a4%ed%8a%b8" class="header-anchor"&gt;&lt;/a&gt;순서 있는 리스트
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;첫 번째&lt;/li&gt;
&lt;li&gt;두 번째&lt;/li&gt;
&lt;li&gt;세 번째&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="체크리스트"&gt;&lt;a href="#%ec%b2%b4%ed%81%ac%eb%a6%ac%ec%8a%a4%ed%8a%b8" class="header-anchor"&gt;&lt;/a&gt;체크리스트
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 할 일 1&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 완료된 일&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 할 일 2&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="인용문"&gt;&lt;a href="#%ec%9d%b8%ec%9a%a9%eb%ac%b8" class="header-anchor"&gt;&lt;/a&gt;인용문
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;인용문 내용입니다.
여러 줄도 가능합니다.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="표-table"&gt;&lt;a href="#%ed%91%9c-table" class="header-anchor"&gt;&lt;/a&gt;표 (Table)
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;항목&lt;/th&gt;
					&lt;th&gt;설명&lt;/th&gt;
					&lt;th&gt;비고&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;A&lt;/td&gt;
					&lt;td&gt;설명 A&lt;/td&gt;
					&lt;td&gt;비고 A&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B&lt;/td&gt;
					&lt;td&gt;설명 B&lt;/td&gt;
					&lt;td&gt;비고 B&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="링크-임베드-shortcodes"&gt;&lt;a href="#%eb%a7%81%ed%81%ac-%ec%9e%84%eb%b2%a0%eb%93%9c-shortcodes" class="header-anchor"&gt;&lt;/a&gt;링크 임베드 (Shortcodes)
&lt;/h2&gt;&lt;h3 id="youtube-영상"&gt;&lt;a href="#youtube-%ec%98%81%ec%83%81" class="header-anchor"&gt;&lt;/a&gt;YouTube 영상
&lt;/h3&gt;&lt;p&gt;{{&amp;lt; youtube VIDEO_ID &amp;gt;}}&lt;/p&gt;
&lt;h3 id="twitterx"&gt;&lt;a href="#twitterx" class="header-anchor"&gt;&lt;/a&gt;Twitter/X
&lt;/h3&gt;&lt;p&gt;{{&amp;lt; twitter user=&amp;ldquo;username&amp;rdquo; id=&amp;ldquo;tweet_id&amp;rdquo; &amp;gt;}}&lt;/p&gt;
&lt;h3 id="github-gist"&gt;&lt;a href="#github-gist" class="header-anchor"&gt;&lt;/a&gt;GitHub Gist
&lt;/h3&gt;&lt;p&gt;{{&amp;lt; gist username gist_id &amp;gt;}}&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="알림-박스-blowfish-alert"&gt;&lt;a href="#%ec%95%8c%eb%a6%bc-%eb%b0%95%ec%8a%a4-blowfish-alert" class="header-anchor"&gt;&lt;/a&gt;알림 박스 (Blowfish Alert)
&lt;/h2&gt;&lt;p&gt;{{&amp;lt; alert &amp;ldquo;circle-info&amp;rdquo; &amp;gt;}}
정보 알림입니다.
{{&amp;lt; /alert &amp;gt;}}&lt;/p&gt;
&lt;p&gt;{{&amp;lt; alert &amp;ldquo;lightbulb&amp;rdquo; &amp;gt;}}
팁이나 아이디어입니다.
{{&amp;lt; /alert &amp;gt;}}&lt;/p&gt;
&lt;p&gt;{{&amp;lt; alert &amp;ldquo;triangle-exclamation&amp;rdquo; &amp;gt;}}
경고 메시지입니다.
{{&amp;lt; /alert &amp;gt;}}&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="접기펼치기-details"&gt;&lt;a href="#%ec%a0%91%ea%b8%b0%ed%8e%bc%ec%b9%98%ea%b8%b0-details" class="header-anchor"&gt;&lt;/a&gt;접기/펼치기 (Details)
&lt;/h2&gt;&lt;details&gt;
&lt;summary&gt;클릭하여 펼치기&lt;/summary&gt;
&lt;p&gt;숨겨진 내용이 여기에 표시됩니다.&lt;/p&gt;
&lt;/details&gt;
&lt;hr&gt;
&lt;h2 id="주석"&gt;&lt;a href="#%ec%a3%bc%ec%84%9d" class="header-anchor"&gt;&lt;/a&gt;주석
&lt;/h2&gt;&lt;!-- 이 부분은 화면에 표시되지 않습니다 --&gt;
&lt;hr&gt;
&lt;h2 id="수평선"&gt;&lt;a href="#%ec%88%98%ed%8f%89%ec%84%a0" class="header-anchor"&gt;&lt;/a&gt;수평선
&lt;/h2&gt;&lt;p&gt;위아래로 구분선을 만들 때 사용:&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="각주"&gt;&lt;a href="#%ea%b0%81%ec%a3%bc" class="header-anchor"&gt;&lt;/a&gt;각주
&lt;/h2&gt;&lt;p&gt;텍스트에 각주&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;를 추가할 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="그래프-차트"&gt;&lt;a href="#%ea%b7%b8%eb%9e%98%ed%94%84-%ec%b0%a8%ed%8a%b8" class="header-anchor"&gt;&lt;/a&gt;그래프 차트
&lt;/h3&gt;&lt;div class="stack-chart"&gt;
 &lt;canvas id="stack-chart-3"&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/chart.js"&gt;&lt;/script&gt;
&lt;script&gt;
 (function () {
 const ctx = document.getElementById("stack-chart-3");
 if (!ctx || typeof Chart === "undefined") return;
 new Chart(ctx, { 
type: 'bar',
data: {
 labels: ['Tomato', 'Blueberry', 'Banana', 'Lime', 'Orange'],
 datasets: [{
 label: '# of votes',
 data: [12, 19, 3, 5, 3],
 }]
}
 });
 })();
&lt;/script&gt;

&lt;hr&gt;
&lt;h3 id="mermaid-차트"&gt;&lt;a href="#mermaid-%ec%b0%a8%ed%8a%b8" class="header-anchor"&gt;&lt;/a&gt;Mermaid 차트
&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;
graph LR;
A[Lemons]--&gt;B[Lemonade];
B--&gt;C[Profit]
&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id="swatched-color-showcase"&gt;&lt;a href="#swatched-color-showcase" class="header-anchor"&gt;&lt;/a&gt;Swatched (color showcase)
&lt;/h3&gt;&lt;div class="stack-swatch-grid"&gt;&lt;div class="stack-swatch" style="background: #64748b;"&gt;
 &lt;span&gt;#64748b&lt;/span&gt;
 &lt;/div&gt;&lt;div class="stack-swatch" style="background: #3b82f6;"&gt;
 &lt;span&gt;#3b82f6&lt;/span&gt;
 &lt;/div&gt;&lt;div class="stack-swatch" style="background: #06b6d4;"&gt;
 &lt;span&gt;#06b6d4&lt;/span&gt;
 &lt;/div&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="typelt"&gt;&lt;a href="#typelt" class="header-anchor"&gt;&lt;/a&gt;TypeLt
&lt;/h3&gt;&lt;p&gt;(Ex1)&lt;/p&gt;
&amp;lt;p id="stack-typeit-6" class="stack-typeit stack-typeit-cursor"&gt;&amp;lt;/p&gt;
&lt;script&gt;
 (function () {
 const target = document.getElementById("stack-typeit-6");
 if (!target) return;

 const lines = "[\"Lorem ipsum dolor sit amet\"]";
 const speed = "65";
 const shouldLoop = false;
 let lineIndex = 0;
 let charIndex = 0;
 let deleting = false;

 function tick() {
 const line = lines[lineIndex] || "";
 if (!deleting) {
 target.textContent = line.slice(0, charIndex + 1);
 charIndex += 1;
 if (charIndex === line.length) {
 deleting = true;
 setTimeout(tick, 1200);
 return;
 }
 } else {
 target.textContent = line.slice(0, Math.max(charIndex - 1, 0));
 charIndex -= 1;
 if (charIndex &lt;= 0) {
 deleting = false;
 lineIndex = (lineIndex + 1) % lines.length;
 if (!shouldLoop &amp;&amp; lineIndex === 0) {
 target.textContent = lines[lines.length - 1] || "";
 target.classList.remove("stack-typeit-cursor");
 return;
 }
 }
 }
 setTimeout(tick, deleting ? speed / 2 : speed);
 }

 tick();
 })();
&lt;/script&gt;

&lt;p&gt;(Ex2)&lt;/p&gt;
&amp;lt;h1 id="stack-typeit-7" class="stack-typeit stack-typeit-cursor"&gt;&amp;lt;/h1&gt;
&lt;script&gt;
 (function () {
 const target = document.getElementById("stack-typeit-7");
 if (!target) return;

 const lines = "[\"Lorem ipsum dolor sit amet, \",\"consectetur adipiscing elit.\"]";
 const speed = "65";
 const shouldLoop = false;
 let lineIndex = 0;
 let charIndex = 0;
 let deleting = false;

 function tick() {
 const line = lines[lineIndex] || "";
 if (!deleting) {
 target.textContent = line.slice(0, charIndex + 1);
 charIndex += 1;
 if (charIndex === line.length) {
 deleting = true;
 setTimeout(tick, 1200);
 return;
 }
 } else {
 target.textContent = line.slice(0, Math.max(charIndex - 1, 0));
 charIndex -= 1;
 if (charIndex &lt;= 0) {
 deleting = false;
 lineIndex = (lineIndex + 1) % lines.length;
 if (!shouldLoop &amp;&amp; lineIndex === 0) {
 target.textContent = lines[lines.length - 1] || "";
 target.classList.remove("stack-typeit-cursor");
 return;
 }
 }
 }
 setTimeout(tick, deleting ? speed / 2 : speed);
 }

 tick();
 })();
&lt;/script&gt;

&lt;p&gt;(Ex3)&lt;/p&gt;
&amp;lt;h3 id="stack-typeit-8" class="stack-typeit stack-typeit-cursor"&gt;&amp;lt;/h3&gt;
&lt;script&gt;
 (function () {
 const target = document.getElementById("stack-typeit-8");
 if (!target) return;

 const lines = "[\"\\\"Frankly, my dear, I don't give a damn.\\\" Gone with the Wind (1939)\",\"\\\"I'm gonna make him an offer he can't refuse.\\\" The Godfather (1972)\",\"\\\"Toto, I've a feeling we're not in Kansas anymore.\\\" The Wizard of Oz (1939)\"]";
 const speed = 50 ;
 const shouldLoop = false;
 let lineIndex = 0;
 let charIndex = 0;
 let deleting = false;

 function tick() {
 const line = lines[lineIndex] || "";
 if (!deleting) {
 target.textContent = line.slice(0, charIndex + 1);
 charIndex += 1;
 if (charIndex === line.length) {
 deleting = true;
 setTimeout(tick, 1200);
 return;
 }
 } else {
 target.textContent = line.slice(0, Math.max(charIndex - 1, 0));
 charIndex -= 1;
 if (charIndex &lt;= 0) {
 deleting = false;
 lineIndex = (lineIndex + 1) % lines.length;
 if (!shouldLoop &amp;&amp; lineIndex === 0) {
 target.textContent = lines[lines.length - 1] || "";
 target.classList.remove("stack-typeit-cursor");
 return;
 }
 }
 }
 setTimeout(tick, deleting ? speed / 2 : speed);
 }

 tick();
 })();
&lt;/script&gt;

&lt;hr&gt;
&lt;h3 id="youtube-lite"&gt;&lt;a href="#youtube-lite" class="header-anchor"&gt;&lt;/a&gt;Youtube Lite
&lt;/h3&gt;&lt;div class="stack-youtube-lite"&gt;
 &lt;iframe
 src="https://www.youtube.com/embed/SgXhGb-7QbU"
 title="Blowfish-tools demo"
 loading="lazy"
 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
 referrerpolicy="strict-origin-when-cross-origin"
 allowfullscreen&gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;작성 팁:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Front matter의 &lt;code&gt;draft: true&lt;/code&gt;를 &lt;code&gt;false&lt;/code&gt;로 변경하면 배포됩니다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;description&lt;/code&gt;과 &lt;code&gt;summary&lt;/code&gt;를 작성하면 SEO에 도움이 됩니다&lt;/li&gt;
&lt;li&gt;이미지는 포스트 폴더에 함께 넣는 것을 권장합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;각주 내용입니다.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Hugo &amp; GithubPages 블로그로 넘어온 이유</title><link>https://0andwild.com/posts/251015_about_hugo/</link><pubDate>Wed, 15 Oct 2025 17:21:09 +0900</pubDate><guid>https://0andwild.com/posts/251015_about_hugo/</guid><description>&lt;img src="https://0andwild.com/" alt="Featured image of post Hugo &amp; GithubPages 블로그로 넘어온 이유" /&gt;&lt;h2 id="왜-hugo--github-pages로-넘어왔는가"&gt;&lt;a href="#%ec%99%9c-hugo--github-pages%eb%a1%9c-%eb%84%98%ec%96%b4%ec%99%94%eb%8a%94%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;왜 Hugo &amp;amp; GitHub Pages로 넘어왔는가?
&lt;/h2&gt;&lt;p&gt;기존 &lt;a class="link" href="https://0andwild.tistory.com/" target="_blank" rel="noopener"
 &gt;&lt;strong&gt;Tstory&lt;/strong&gt;&lt;/a&gt;로 운영하였던 기술 블로그를 &lt;strong&gt;Hugo &amp;amp; GitHub Pages&lt;/strong&gt;로 마이그레이션을 하기로 결심하게 되었다.&lt;/p&gt;
&lt;h3 id="1-흩어진-콘텐츠-관리의-어려움"&gt;&lt;a href="#1-%ed%9d%a9%ec%96%b4%ec%a7%84-%ec%bd%98%ed%85%90%ec%b8%a0-%ea%b4%80%eb%a6%ac%ec%9d%98-%ec%96%b4%eb%a0%a4%ec%9b%80" class="header-anchor"&gt;&lt;/a&gt;1. 흩어진 콘텐츠 관리의 어려움
&lt;/h3&gt;&lt;p&gt;여러가지 노트 툴을 사용하다보니 회사를 다니면서 또는 공부를 하면서 정리하는 글들이 중구난방하게 흩어지게 되었고 이걸 또 다시 블로그로 옮겨야 하는 번거로움이 생겨 블로그 관리를 소홀히 하게 되었다.&lt;/p&gt;
&lt;h3 id="2-마크다운-호환성-문제"&gt;&lt;a href="#2-%eb%a7%88%ed%81%ac%eb%8b%a4%ec%9a%b4-%ed%98%b8%ed%99%98%ec%84%b1-%eb%ac%b8%ec%a0%9c" class="header-anchor"&gt;&lt;/a&gt;2. 마크다운 호환성 문제
&lt;/h3&gt;&lt;p&gt;기존 노트 툴에서 사용하는 마크다운 문법이 Tstory에서 글을 올릴때 완벽히 호환되지 않아 수정을 해야하는 일들이 자주 발생했었고 이 또한 번거로움이 생기는 일이였다.&lt;/p&gt;
&lt;p&gt;특히 다음과 같은 문제들이 있었다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;코드 블록의 syntax highlighting 지원 부족&lt;/li&gt;
&lt;li&gt;테이블 렌더링 오류&lt;/li&gt;
&lt;li&gt;이미지 경로 처리 문제&lt;/li&gt;
&lt;li&gt;수식 표현의 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-tstory-open-api-지원-종료"&gt;&lt;a href="#3-tstory-open-api-%ec%a7%80%ec%9b%90-%ec%a2%85%eb%a3%8c" class="header-anchor"&gt;&lt;/a&gt;3. Tstory Open API 지원 종료
&lt;/h3&gt;&lt;p&gt;마지막으로는 최근에 다시 그동안 공부한 자료들을 다시 정리해서 Tstory에 올릴겸 블로그 스킨도 다시 이쁘게 꾸미고 &lt;strong&gt;Tstory 공식 Open API&lt;/strong&gt;를 활용하여 기존 노트 툴들과 연동하는 작업을 진행해보려 하였지만 Open API의 공식 지원이 종료 되어있었고 더이상 Tstory를 사용할 이유가 없어졌다.&lt;/p&gt;
&lt;h3 id="블로그-플랫폼-선택-기준"&gt;&lt;a href="#%eb%b8%94%eb%a1%9c%ea%b7%b8-%ed%94%8c%eb%9e%ab%ed%8f%bc-%ec%84%a0%ed%83%9d-%ea%b8%b0%ec%a4%80" class="header-anchor"&gt;&lt;/a&gt;블로그 플랫폼 선택 기준
&lt;/h3&gt;&lt;p&gt;여러 블로그를 참고하여 어떤 방식이 좋을지 고민을 많이 하였고 아래와 같이 기준점을 가지고 &lt;strong&gt;Hugo &amp;amp; GitHub Pages&lt;/strong&gt;로 확정을 하게 되었다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;블로그를 구축하는게 쉬운가?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;코드로 관리가 가능한가?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;내가 원하는 기능을 추가하는 자유도가 높은가?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Pages를 사용해서 빌드하고 배포할때 속도가 빠른가?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Obsidian과 같은 노트 툴들과 연동하기 편한가?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="hugo란"&gt;&lt;a href="#hugo%eb%9e%80" class="header-anchor"&gt;&lt;/a&gt;Hugo란?
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://gohugo.io/" target="_blank" rel="noopener"
 &gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;/a&gt;는 &lt;strong&gt;Go 언어&lt;/strong&gt;로 작성된 빠르고 유연한 &lt;strong&gt;정적 사이트 생성기&lt;/strong&gt;(Static Site Generator)이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주요 특징:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;빠른 빌드 속도&lt;/strong&gt;: 수천 개의 페이지도 몇 초 안에 빌드된다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;단순한 구조&lt;/strong&gt;: Markdown으로 콘텐츠를 작성하면 Hugo가 HTML로 변환해준다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;제로 의존성&lt;/strong&gt;: 단일 바이너리로 실행되며 별도의 런타임이나 데이터베이스가 필요없다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;풍부한 테마 생태계&lt;/strong&gt;: 다양한 용도의 테마를 쉽게 적용할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-pages와-함께-사용되는-정적-사이트-생성기-비교"&gt;&lt;a href="#github-pages%ec%99%80-%ed%95%a8%ea%bb%98-%ec%82%ac%ec%9a%a9%eb%90%98%eb%8a%94-%ec%a0%95%ec%a0%81-%ec%82%ac%ec%9d%b4%ed%8a%b8-%ec%83%9d%ec%84%b1%ea%b8%b0-%eb%b9%84%ea%b5%90" class="header-anchor"&gt;&lt;/a&gt;GitHub Pages와 함께 사용되는 정적 사이트 생성기 비교
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;특징&lt;/th&gt;
					&lt;th&gt;Hugo&lt;/th&gt;
					&lt;th&gt;Jekyll&lt;/th&gt;
					&lt;th&gt;Gatsby&lt;/th&gt;
					&lt;th&gt;Next.js (SSG)&lt;/th&gt;
					&lt;th&gt;VuePress&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;언어&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Go&lt;/td&gt;
					&lt;td&gt;Ruby&lt;/td&gt;
					&lt;td&gt;React (JavaScript)&lt;/td&gt;
					&lt;td&gt;React (JavaScript)&lt;/td&gt;
					&lt;td&gt;Vue.js&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;빌드 속도&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;⚡ 매우 빠름 (&amp;lt; 1ms/page)&lt;/td&gt;
					&lt;td&gt;🐢 느림&lt;/td&gt;
					&lt;td&gt;🚶 보통&lt;/td&gt;
					&lt;td&gt;🚶 보통&lt;/td&gt;
					&lt;td&gt;🚶 보통&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;설치 복잡도&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅ 단일 바이너리&lt;/td&gt;
					&lt;td&gt;⚠️ Ruby 환경 필요&lt;/td&gt;
					&lt;td&gt;⚠️ Node.js + 많은 의존성&lt;/td&gt;
					&lt;td&gt;⚠️ Node.js + 의존성&lt;/td&gt;
					&lt;td&gt;⚠️ Node.js + 의존성&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;GitHub Pages 기본 지원&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;❌ (Actions 필요)&lt;/td&gt;
					&lt;td&gt;✅ 네이티브 지원&lt;/td&gt;
					&lt;td&gt;❌ (Actions 필요)&lt;/td&gt;
					&lt;td&gt;❌ (Actions 필요)&lt;/td&gt;
					&lt;td&gt;❌ (Actions 필요)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;학습 곡선&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;낮음&lt;/td&gt;
					&lt;td&gt;낮음&lt;/td&gt;
					&lt;td&gt;높음&lt;/td&gt;
					&lt;td&gt;중간-높음&lt;/td&gt;
					&lt;td&gt;중간&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;테마/플러그인&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;풍부&lt;/td&gt;
					&lt;td&gt;매우 풍부&lt;/td&gt;
					&lt;td&gt;풍부 (React 생태계)&lt;/td&gt;
					&lt;td&gt;풍부 (React 생태계)&lt;/td&gt;
					&lt;td&gt;보통&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;적합한 용도&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;블로그, 문서, 포트폴리오&lt;/td&gt;
					&lt;td&gt;블로그, GitHub 기본&lt;/td&gt;
					&lt;td&gt;복잡한 웹앱, 블로그&lt;/td&gt;
					&lt;td&gt;복잡한 웹앱, 하이브리드&lt;/td&gt;
					&lt;td&gt;기술 문서&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;빌드 시간 (1000 페이지)&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;~1초&lt;/td&gt;
					&lt;td&gt;~2분&lt;/td&gt;
					&lt;td&gt;~30초&lt;/td&gt;
					&lt;td&gt;~30초&lt;/td&gt;
					&lt;td&gt;~20초&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Hugo를 선택한 이유:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;압도적인 빌드 속도&lt;/strong&gt;: 콘텐츠가 많아져도 빌드 시간이 거의 증가하지 않는다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;간단한 설정&lt;/strong&gt;: 복잡한 JavaScript 프레임워크 없이 Markdown에 집중할 수 있다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;제로 의존성&lt;/strong&gt;: 단일 실행 파일로 환경 설정 문제가 없다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;풍부한 테마&lt;/strong&gt;: Blowfish 같은 고품질 테마를 쉽게 적용할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="github-pages-배포"&gt;&lt;a href="#github-pages-%eb%b0%b0%ed%8f%ac" class="header-anchor"&gt;&lt;/a&gt;GitHub Pages 배포
&lt;/h2&gt;&lt;p&gt;Hugo로 작성한 블로그는 &lt;strong&gt;GitHub Actions&lt;/strong&gt;를 통해 자동으로 빌드되고 배포된다.&lt;/p&gt;
&lt;h3 id="배포-워크플로우"&gt;&lt;a href="#%eb%b0%b0%ed%8f%ac-%ec%9b%8c%ed%81%ac%ed%94%8c%eb%a1%9c%ec%9a%b0" class="header-anchor"&gt;&lt;/a&gt;배포 워크플로우
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt; 브랜치에 변경사항을 push한다&lt;/li&gt;
&lt;li&gt;GitHub Actions가 자동으로 트리거된다&lt;/li&gt;
&lt;li&gt;Hugo가 정적 사이트를 빌드한다&lt;/li&gt;
&lt;li&gt;빌드된 파일이 GitHub Pages로 자동 배포된다&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="장점"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;자동화된 배포&lt;/strong&gt;: 코드를 push하면 자동으로 배포가 진행된다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;버전 관리&lt;/strong&gt;: Git을 통해 모든 변경사항을 추적할 수 있다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;무료 호스팅&lt;/strong&gt;: GitHub Pages는 무료로 제공된다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;커스텀 도메인&lt;/strong&gt;: 원하는 도메인을 연결할 수 있다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTPS 지원&lt;/strong&gt;: 기본적으로 HTTPS가 제공된다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="obsidian-연동"&gt;&lt;a href="#obsidian-%ec%97%b0%eb%8f%99" class="header-anchor"&gt;&lt;/a&gt;Obsidian 연동
&lt;/h2&gt;&lt;p&gt;Hugo는 마크다운 기반이기 때문에 &lt;strong&gt;Obsidian&lt;/strong&gt;과 같은 노트 툴과 완벽하게 호환된다.&lt;/p&gt;
&lt;h3 id="연동-방법"&gt;&lt;a href="#%ec%97%b0%eb%8f%99-%eb%b0%a9%eb%b2%95" class="header-anchor"&gt;&lt;/a&gt;연동 방법
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Hugo 블로그의 &lt;code&gt;content/posts&lt;/code&gt; 디렉토리를 Obsidian vault로 설정한다&lt;/li&gt;
&lt;li&gt;Obsidian에서 글을 작성하고 편집한다&lt;/li&gt;
&lt;li&gt;작성이 완료되면 Git을 통해 commit &amp;amp; push한다&lt;/li&gt;
&lt;li&gt;GitHub Actions가 자동으로 빌드하고 배포한다&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="이점"&gt;&lt;a href="#%ec%9d%b4%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;이점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;일관된 작성 환경&lt;/strong&gt;: 모든 노트와 블로그 글을 같은 툴에서 관리한다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;완벽한 마크다운 호환&lt;/strong&gt;: 추가 변환 작업이 필요없다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;로컬 우선&lt;/strong&gt;: 인터넷 없이도 글을 작성할 수 있다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;강력한 링크 기능&lt;/strong&gt;: Obsidian의 백링크와 그래프 뷰를 활용할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="기본적인-hugo-terminal-명령어"&gt;&lt;a href="#%ea%b8%b0%eb%b3%b8%ec%a0%81%ec%9d%b8-hugo-terminal-%eb%aa%85%eb%a0%b9%ec%96%b4" class="header-anchor"&gt;&lt;/a&gt;기본적인 Hugo Terminal 명령어
&lt;/h2&gt;&lt;h3 id="개발-서버-실행"&gt;&lt;a href="#%ea%b0%9c%eb%b0%9c-%ec%84%9c%eb%b2%84-%ec%8b%a4%ed%96%89" class="header-anchor"&gt;&lt;/a&gt;개발 서버 실행
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;로컬 개발 서버를 시작한다. 기본적으로 &lt;code&gt;http://localhost:1313&lt;/code&gt;에서 사이트를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주요 옵션:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-D&lt;/code&gt; 또는 &lt;code&gt;--buildDrafts&lt;/code&gt;: 초안(draft) 콘텐츠도 함께 빌드한다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--bind 0.0.0.0&lt;/code&gt;: 모든 네트워크 인터페이스에서 접근 가능하도록 설정한다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--port 8080&lt;/code&gt;: 기본 포트(1313) 대신 다른 포트를 사용한다&lt;/li&gt;
&lt;li&gt;파일 변경 시 자동으로 브라우저가 새로고침된다 (Live Reload)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server -D
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server --bind 0.0.0.0 --port &lt;span class="m"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="프로덕션-빌드"&gt;&lt;a href="#%ed%94%84%eb%a1%9c%eb%8d%95%ec%85%98-%eb%b9%8c%eb%93%9c" class="header-anchor"&gt;&lt;/a&gt;프로덕션 빌드
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo --cleanDestinationDir
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;프로덕션용 정적 사이트를 빌드한다. &lt;code&gt;public/&lt;/code&gt; 디렉토리에 결과물이 생성된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주요 기능:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--cleanDestinationDir&lt;/code&gt;: 빌드 전에 대상 디렉토리(&lt;code&gt;public/&lt;/code&gt;)를 완전히 정리한다&lt;/li&gt;
&lt;li&gt;이전 빌드의 불필요한 파일을 제거하여 깨끗한 상태로 빌드를 수행한다&lt;/li&gt;
&lt;li&gt;파일명이 변경되거나 삭제된 경우에도 이전 버전의 파일이 남아있지 않도록 보장한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo --cleanDestinationDir
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo --cleanDestinationDir --minify &lt;span class="c1"&gt;# 파일 최소화 옵션 추가&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="테마-정보"&gt;&lt;a href="#%ed%85%8c%eb%a7%88-%ec%a0%95%eb%b3%b4" class="header-anchor"&gt;&lt;/a&gt;테마 정보
&lt;/h2&gt;&lt;h3 id="hugo-blowfish-theme"&gt;&lt;a href="#hugo-blowfish-theme" class="header-anchor"&gt;&lt;/a&gt;Hugo Blowfish Theme
&lt;/h3&gt;&lt;p&gt;이 블로그는 &lt;a class="link" href="https://blowfish.page/" target="_blank" rel="noopener"
 &gt;&lt;strong&gt;Blowfish&lt;/strong&gt;&lt;/a&gt; 테마를 사용하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;현대적이고 반응형 디자인을 제공한다&lt;/li&gt;
&lt;li&gt;다크 모드를 지원한다&lt;/li&gt;
&lt;li&gt;빠른 로딩 속도와 SEO 최적화가 되어있다&lt;/li&gt;
&lt;li&gt;다국어를 지원한다&lt;/li&gt;
&lt;li&gt;풍부한 커스터마이징 옵션을 제공한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;설정 파일:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;config/_default/hugo.toml&lt;/code&gt; - 기본 Hugo 설정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config/_default/params.toml&lt;/code&gt; - Blowfish 테마 파라미터&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config/_default/languages.en.toml&lt;/code&gt; - 언어별 설정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config/_default/menus.en.toml&lt;/code&gt; - 메뉴 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="마치며"&gt;&lt;a href="#%eb%a7%88%ec%b9%98%eb%a9%b0" class="header-anchor"&gt;&lt;/a&gt;마치며
&lt;/h2&gt;&lt;p&gt;Tstory에서 Hugo &amp;amp; GitHub Pages로의 마이그레이션은 개발자 친화적인 환경을 위한 선택이었다. 이제는 코드 버전 관리와 동일한 방식으로 블로그를 관리할 수 있게 되었고, Obsidian과의 완벽한 연동으로 노트 작성부터 블로그 포스팅까지 하나의 워크플로우로 통합할 수 있게 되었다.&lt;/p&gt;
&lt;p&gt;무엇보다 Hugo의 빠른 빌드 속도와 GitHub Actions의 자동화된 배포는 글 작성에만 집중할 수 있게 해주었고, 더 이상 플랫폼의 제약에 얽매이지 않고 자유롭게 커스터마이징할 수 있게 되었다.&lt;/p&gt;
&lt;p&gt;앞으로는 Tstory에 있던 기존 글들을 천천히 마이그레이션하면서 새로운 콘텐츠도 꾸준히 추가해 나갈 예정이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="참고-자료"&gt;&lt;a href="#%ec%b0%b8%ea%b3%a0-%ec%9e%90%eb%a3%8c" class="header-anchor"&gt;&lt;/a&gt;참고 자료
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hugo Official Site:&lt;/strong&gt; &lt;a class="link" href="https://gohugo.io/" target="_blank" rel="noopener"
 &gt;https://gohugo.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blowfish Theme:&lt;/strong&gt; &lt;a class="link" href="https://blowfish.page/" target="_blank" rel="noopener"
 &gt;https://blowfish.page/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blowfish Creator:&lt;/strong&gt; &lt;a class="link" href="https://github.com/nunocoracao" target="_blank" rel="noopener"
 &gt;@nunocoracao&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Creator Blog:&lt;/strong&gt; &lt;a class="link" href="https://n9o.xyz/" target="_blank" rel="noopener"
 &gt;https://n9o.xyz/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Official Docs:&lt;/strong&gt; &lt;a class="link" href="https://blowfish.page/docs/" target="_blank" rel="noopener"
 &gt;https://blowfish.page/docs/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>