<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://polar-sn.github.io/blog</id>
    <title>polar.blog Blog</title>
    <updated>2025-02-08T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://polar-sn.github.io/blog"/>
    <subtitle>polar.blog Blog</subtitle>
    <icon>https://polar-sn.github.io/img/penguin.png</icon>
    <entry>
        <title type="html"><![CDATA[Docusaurus 블로그에 댓글 기능 추가하기 - giscus]]></title>
        <id>https://polar-sn.github.io/blog/giscus</id>
        <link href="https://polar-sn.github.io/blog/giscus"/>
        <updated>2025-02-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Docusaurus 블로그 커스터마이징 첫 번째 포스트입니다.]]></summary>
        <content type="html"><![CDATA[<p>Docusaurus 블로그 커스터마이징 첫 번째 포스트입니다.
이번 글에서는 giscus를 이용해 Docusaurus 블로그에 댓글 기능을 추가하는 방법을 알아보겠습니다.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="giscus란">Giscus란<a href="https://polar-sn.github.io/blog/giscus#giscus%EB%9E%80" class="hash-link" aria-label="Giscus란에 대한 직접 링크" title="Giscus란에 대한 직접 링크">​</a></h2>
<p><a href="https://giscus.app/" target="_blank" rel="noopener noreferrer">Giscus</a>는 GitHub의 Discussions 기능을 활용하여 댓글을 남기고
관리할 수 있는 오픈소스 댓글 시스템으로, 아래와 같은 특징이 있습니다.</p>
<ul>
<li>GitHub 계정 기반: 댓글을 남기려면 GitHub 계정이 필요하며, 이는 스팸을 줄이는 효과가 있습니다.</li>
<li>GitHub Discussions 활용: 블로그 포스트마다 자동으로 Discussion 스레드가 생성되며, 댓글이 Discussions에 저장됩니다.</li>
<li>완전 무료: GitHub에서 제공하는 기능을 활용하기 때문에 추가적인 비용이 들지 않습니다.</li>
<li>Markdown 지원: GitHub Discussions와 동일하게 Markdown을 사용하여 댓글을 작성할 수 있습니다.</li>
<li>반응(Reaction) 기능 제공: 단순한 댓글뿐만 아니라, 이모지 반응(👍, 👎 등)도 가능합니다.</li>
<li>다크 모드 지원: 웹사이트의 테마에 맞춰 자동으로 다크 모드를 적용할 수 있습니다.</li>
</ul>
<p>이제 Docusaurus 블로그에 Giscus를 적용하는 방법을 살펴보겠습니다.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="docusaurus에-giscus-적용하기">Docusaurus에 Giscus 적용하기<a href="https://polar-sn.github.io/blog/giscus#docusaurus%EC%97%90-giscus-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0" class="hash-link" aria-label="Docusaurus에 Giscus 적용하기에 대한 직접 링크" title="Docusaurus에 Giscus 적용하기에 대한 직접 링크">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-github-discussion-활성화">1. GitHub Discussion 활성화<a href="https://polar-sn.github.io/blog/giscus#1-github-discussion-%ED%99%9C%EC%84%B1%ED%99%94" class="hash-link" aria-label="1. GitHub Discussion 활성화에 대한 직접 링크" title="1. GitHub Discussion 활성화에 대한 직접 링크">​</a></h3>
<p>Giscus를 사용하려면 댓글을 저장할 공간이 필요합니다. GitHub Discussions 기능을 활성화하면,
블로그 포스트마다 자동으로 Discussion 스레드가 생성되어 댓글이 저장됩니다.
이를 위해 GitHub Pages로 사용하고 있는 <code>[username].github.io</code> 레포지토리로 이동한 뒤,
Settings - General에서 Features의 Discussions를 체크해 줍니다.</p>
<p><img decoding="async" loading="lazy" src="https://polar-sn.github.io/assets/images/discussion_setting-3df996c2208851612237314e36e3195a.png" width="4250" height="6138" class="img_ev3q"></p>
<p>설정 후, 레포지토리 상단에 <code>Discussions</code> 탭이 생성된 것을 확인할 수 있습니다.
<img decoding="async" loading="lazy" src="https://polar-sn.github.io/assets/images/discussion_tab-fc5d892683fcaf10c6b5e84eff87b9c4.png" width="4250" height="2555" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-giscus-앱-설치">2. Giscus 앱 설치<a href="https://polar-sn.github.io/blog/giscus#2-giscus-%EC%95%B1-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="2. Giscus 앱 설치에 대한 직접 링크" title="2. Giscus 앱 설치에 대한 직접 링크">​</a></h3>
<p>Giscus가 GitHub Discussions을 활용할 수 있도록 GitHub에 giscus 앱을 설치해 줍니다.
<a href="https://github.com/apps/giscus" target="_blank" rel="noopener noreferrer">설치 링크</a>로 들어가서 Install 버튼을 클릭한 후,
<code>[username].github.io</code> 레포지토리에 giscus 앱을 설치합니다.</p>
<p><img decoding="async" loading="lazy" src="https://polar-sn.github.io/assets/images/giscus_install-b82f82bf38f7d878a08a1bf13c8986ee.png" width="2361" height="3750" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-giscus-configuration-생성">3. Giscus Configuration 생성<a href="https://polar-sn.github.io/blog/giscus#3-giscus-configuration-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="3. Giscus Configuration 생성에 대한 직접 링크" title="3. Giscus Configuration 생성에 대한 직접 링크">​</a></h3>
<p>이제 <a href="https://giscus.app/" target="_blank" rel="noopener noreferrer">giscus</a>에 접속하여 아래와 같은 정보를 입력합니다.</p>
<ul>
<li>사용할 언어</li>
<li>Giscus와 연결할 레포지토리</li>
<li>블로그 페이지와 Discussion을 연결하는 방식</li>
<li>새로운 Discussion이 생성될 카테고리</li>
<li>기능, 테마</li>
</ul>
<p>입력 후, 아래와 같이 자동으로 생성된 script 태그 코드를 복사해 둡니다.
이 코드는 다음 단계에서 필요하니 잘 메모해 두시기 바랍니다.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">script src</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"https://giscus.app/client.js"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">repo</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"[ENTER REPO HERE]"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">repo</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">id</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"[ENTER REPO ID HERE]"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">category</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"[ENTER CATEGORY NAME HERE]"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">category</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">id</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"[ENTER CATEGORY ID HERE]"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">mapping</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"pathname"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">strict</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">reactions</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">enabled</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">emit</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">metadata</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">input</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">position</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"bottom"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">theme</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"preferred_color_scheme"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">lang</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"ko"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    crossorigin</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"anonymous"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    async</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">script</span><span class="token operator" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-docusaurus에-comments-component-추가">4. Docusaurus에 Comments Component 추가<a href="https://polar-sn.github.io/blog/giscus#4-docusaurus%EC%97%90-comments-component-%EC%B6%94%EA%B0%80" class="hash-link" aria-label="4. Docusaurus에 Comments Component 추가에 대한 직접 링크" title="4. Docusaurus에 Comments Component 추가에 대한 직접 링크">​</a></h3>
<p>Docusaurus 프로젝트 폴더에서 <code>@giscus/react</code> 패키지를 설치해 줍니다.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> @giscus/react</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>다음으로 <code>src/components</code> 디렉토리에 <code>Comments</code> 폴더를 만들고, <code>index.tsx</code> 파일을 생성하여 아래와 같이 작성해 줍니다. 이때 앞서 메모해 둔 Giscus Configuration을 이용하여 값을 채워주시면 됩니다.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"react"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Giscus</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@giscus/react"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> useColorMode </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@docusaurus/theme-common"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#d73a49">Comments</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">JSX</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Element</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> colorMode </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">useColorMode</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">div</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token maybe-class-name">Giscus</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        id</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"comments"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        repo</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"[ENTER REPO HERE]"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        repoId</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"[ENTER REPO ID HERE]"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        category</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"[ENTER CATEGORY NAME HERE]"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        categoryId</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"[ENTER CATEGORY ID HERE]"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        mapping</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"pathname"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        strict</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        reactionsEnabled</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        emitMetadata</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        inputPosition</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"bottom"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        theme</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">colorMode </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"dark"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"dark_tritanopia"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"light_tritanopia"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        lang</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"ko"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        loading</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"lazy"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">div</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="5-blog-포스트에-comments-추가">5. Blog 포스트에 Comments 추가<a href="https://polar-sn.github.io/blog/giscus#5-blog-%ED%8F%AC%EC%8A%A4%ED%8A%B8%EC%97%90-comments-%EC%B6%94%EA%B0%80" class="hash-link" aria-label="5. Blog 포스트에 Comments 추가에 대한 직접 링크" title="5. Blog 포스트에 Comments 추가에 대한 직접 링크">​</a></h3>
<p>이제 Swizzling을 이용해 블로그 글 하단에 댓글이 표시되도록 Docusaurus의 블로그 레이아웃을 수정해 줄 겁니다.</p>
<p>우선, 프로젝트 폴더에서 아래 명령을 입력하면 <code>src/theme</code> 디렉토리에 <code>BlogPostItem/index.tsx</code>가 생성됩니다.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run swizzle @docusaurus/theme-classic BlogPostItem -- </span><span class="token parameter variable" style="color:#36acaa">--wrap</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--typescript</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>노트</div><div class="admonitionContent_BuS1"><p>위 명령어 실행 시 나타나는 warning은 "YES: I know what I am doing!"를 선택해 주시면 됩니다.</p></div></div>
<p>생성된 <code>index.tsx</code> 파일을 아래와 같이 수정해 줍니다.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports">type </span><span class="token imports maybe-class-name">ReactNode</span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">BlogPostItem</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@theme-original/BlogPostItem'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> type </span><span class="token maybe-class-name">BlogPostItemType</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@theme/BlogPostItem'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> type </span><span class="token punctuation" style="color:#393A34">{</span><span class="token maybe-class-name">WrapperProps</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@docusaurus/types'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> useBlogPost </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@docusaurus/plugin-content-blog/client"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Comments</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@site/src/components/Comments"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">type </span><span class="token maybe-class-name">Props</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token maybe-class-name">WrapperProps</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">typeof</span><span class="token plain"> </span><span class="token maybe-class-name">BlogPostItemType</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#d73a49">BlogPostItemWrapper</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter literal-property property" style="color:#36acaa">props</span><span class="token parameter operator" style="color:#393A34">:</span><span class="token parameter"> </span><span class="token parameter maybe-class-name">Props</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">ReactNode</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> metadata</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> isBlogPostPage </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">useBlogPost</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> comments </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> metadata</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">frontMatter</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token maybe-class-name">BlogPostItem</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">props</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">comments </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> isBlogPostPage </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token maybe-class-name">Comments</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>이제 블로그 포스트 글을 확인해 보면 아래와 같이 Comments가 생긴 것을 확인할 수 있습니다.
<img decoding="async" loading="lazy" src="https://polar-sn.github.io/assets/images/comments-044107f46ed815f7ad7116c44b753aba.png" width="4125" height="3763" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="참고-사이트">참고 사이트<a href="https://polar-sn.github.io/blog/giscus#%EC%B0%B8%EA%B3%A0-%EC%82%AC%EC%9D%B4%ED%8A%B8" class="hash-link" aria-label="참고 사이트에 대한 직접 링크" title="참고 사이트에 대한 직접 링크">​</a></h2>
<ul>
<li>Add Giscus Comments to Docusaurus 3 Blog Posts and Doc Pages: <a href="https://rikublock.dev/docs/tutorials/giscus-integration/" target="_blank" rel="noopener noreferrer">https://rikublock.dev/docs/tutorials/giscus-integration/</a></li>
</ul>]]></content>
        <category label="Blog" term="Blog"/>
        <category label="Docusaurus" term="Docusaurus"/>
        <category label="giscus" term="giscus"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Docusaurus 블로그 구축기]]></title>
        <id>https://polar-sn.github.io/blog/docusaurus</id>
        <link href="https://polar-sn.github.io/blog/docusaurus"/>
        <updated>2025-01-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[공부하면서 알게 된 지식이나 삽질하면서 문제를 해결했던 방법들이 잊히는 게 아쉬워 글로 남겨야지 생각만 하다가]]></summary>
        <content type="html"><![CDATA[<p>공부하면서 알게 된 지식이나 삽질하면서 문제를 해결했던 방법들이 잊히는 게 아쉬워 글로 남겨야지 생각만 하다가
드디어 블로그를 개설하고 이렇게 첫 번째 포스트를 작성하게 되었습니다.</p>
<p>이 글에서는 Docusaurus를 이용해 블로그를 만든 여정을 공유하려 합니다.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="어떤-플랫폼을-사용할까">어떤 플랫폼을 사용할까<a href="https://polar-sn.github.io/blog/docusaurus#%EC%96%B4%EB%96%A4-%ED%94%8C%EB%9E%AB%ED%8F%BC%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C" class="hash-link" aria-label="어떤 플랫폼을 사용할까에 대한 직접 링크" title="어떤 플랫폼을 사용할까에 대한 직접 링크">​</a></h2>
<p>블로그 운영을 결심한 후 가장 먼저 고민한 것은 바로 "어떤 플랫폼을 사용할까?"였습니다.</p>
<p>블로그 플랫폼은 국내에서 많이 사용하는 <a href="https://blog.naver.com/" target="_blank" rel="noopener noreferrer">네이버 블로그</a>와 <a href="https://www.tistory.com/" target="_blank" rel="noopener noreferrer">티스토리</a>부터,
<a href="https://wordpress.com/" target="_blank" rel="noopener noreferrer">워드프레스</a>, <a href="https://brunch.co.kr/" target="_blank" rel="noopener noreferrer">브런치</a>, <a href="https://medium.com/" target="_blank" rel="noopener noreferrer">미디엄</a>,
<a href="https://velog.io/" target="_blank" rel="noopener noreferrer">벨로그</a>, <a href="https://pages.github.com/" target="_blank" rel="noopener noreferrer">깃허브 페이지</a> 등 정말 다양합니다.</p>
<p>저는 기술 블로그를 목적으로 했기 때문에,
우선 <strong>마크다운</strong>과 <strong>코드 하이라이팅</strong>을 지원하지 않는
네이버 블로그, 브런치, 미디엄은 고려 대상에서 제외했습니다.
(GitHub Gist 등을 이용해 가능하다지만 불편할 거 같았습니다.)
또한, 워드프레스는 유지 비용이 들기 때문에 제외하고, 티스토리, 깃허브 페이지, 벨로그 중에서 고민했습니다.</p>
<p>글을 꾸준히 작성하려면 티스토리나 벨로그처럼 접근성과 편의성이 높은 플랫폼이 적합할 것 같았지만,
직접 블로그를 구축해 보고 싶은 마음도 있었습니다.</p>
<p>고민 끝에 도전적인 게 더 끌렸고, 이왕 할 거면 제대로 해보자는 생각과 글쓰기를 습관화하겠다는 다짐으로
깃허브 페이지를 선택했습니다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="github-pages를-선택한-이유">GitHub Pages를 선택한 이유<a href="https://polar-sn.github.io/blog/docusaurus#github-pages%EB%A5%BC-%EC%84%A0%ED%83%9D%ED%95%9C-%EC%9D%B4%EC%9C%A0" class="hash-link" aria-label="GitHub Pages를 선택한 이유에 대한 직접 링크" title="GitHub Pages를 선택한 이유에 대한 직접 링크">​</a></h3>
<ol>
<li>마크다운 및 코드 하이라이팅 지원</li>
<li>유지 비용 없이 무료로 운영 가능</li>
<li>편리함보다는 도전에 끌림</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="어떤-정적-사이트-생성기를-사용할까">어떤 정적 사이트 생성기를 사용할까<a href="https://polar-sn.github.io/blog/docusaurus#%EC%96%B4%EB%96%A4-%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%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C" class="hash-link" aria-label="어떤 정적 사이트 생성기를 사용할까에 대한 직접 링크" title="어떤 정적 사이트 생성기를 사용할까에 대한 직접 링크">​</a></h2>
<p>예전에 깃허브 페이지를 구축해 본 적이 있었는데, 당시에는 깃허브 페이지하면 Jekyll이라, Jekyll밖에 없는 줄 알고 있었습니다...
이번에 블로그 구축을 위해 조사해 보니 Jekyll 외에도 Hugo, Docusaurus, Gatsby, Hexo 등
다양한 정적 사이트 생성기(Static Site Generator, SSG)가 있다는 것을 알게 되었습니다.
이것들을 JAM Stack을 활용한 SSG라 부르더군요.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="jam-stack이란">JAM Stack이란<a href="https://polar-sn.github.io/blog/docusaurus#jam-stack%EC%9D%B4%EB%9E%80" class="hash-link" aria-label="JAM Stack이란에 대한 직접 링크" title="JAM Stack이란에 대한 직접 링크">​</a></h3>
<p>JAM Stack은 JavaScript, API, Markup(HTML/CSS)을 사용해 웹사이트를 구축하는 방법을 의미합니다.
JAM Stack 기반의 정적 사이트 생성기 목록은 <a href="https://jamstack.org/generators/" target="_blank" rel="noopener noreferrer">여기</a>에서 확인할 수 있습니다.
<img decoding="async" loading="lazy" src="https://polar-sn.github.io/assets/images/JAM-SSG-52bab23767fb698e02905b694ccc1f9b.png" width="1714" height="1994" class="img_ev3q"></p>
<p>저는 최근에 웹 개발에서 많이 사용되는 Javascript + React 조합의 프레임워크를 다뤄보고 싶었습니다.
그래서 해당 조합 중 GitHub Stars 수가 많은 상위 3개 프레임워크인 <code>Next.js</code>, <code>Docusaurus</code>, <code>Gatsby</code>를 조사해 보았습니다.</p>
<ul>
<li>Next.js: 서버 사이드 렌더링과 정적 사이트 생성을 지원하는 풀스택 프레임워크</li>
<li>Docusaurus: 문서화와 블로그 생성에 특화된 정적 사이트 생성기</li>
<li>Gatsby: 빠르고 최적화된 정적 사이트 생성을 위한 프레임워크</li>
</ul>
<p>저는 고민 끝에 <code>Docusaurus</code>를 선택했습니다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="docusaurus를-선택한-이유">Docusaurus를 선택한 이유<a href="https://polar-sn.github.io/blog/docusaurus#docusaurus%EB%A5%BC-%EC%84%A0%ED%83%9D%ED%95%9C-%EC%9D%B4%EC%9C%A0" class="hash-link" aria-label="Docusaurus를 선택한 이유에 대한 직접 링크" title="Docusaurus를 선택한 이유에 대한 직접 링크">​</a></h3>
<ol>
<li>깔끔한 기본 레이아웃<!-- -->
<ul>
<li>기본 제공되는 레이아웃 디자인이 깔끔하고, 공식 홈페이지도 해당 UI로 구현이 되어 있어 참조하기에 용이하리라 생각했습니다.</li>
</ul>
</li>
<li>활발한 유지보수 및 커뮤니티<!-- -->
<ul>
<li>React를 개발한 Meta에서 만든 프로젝트이기 때문에 유지보수와 커뮤니티가 꾸준히 활발할 것으로 기대했습니다.</li>
</ul>
</li>
<li>다양한 마크다운 지원<!-- -->
<ul>
<li>MDX를 지원, 탭, 코드 블록 내 라인 하이라이팅 등 유용한 기능을 제공하고 있습니다.</li>
</ul>
</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="docusaurus-블로그-구축">Docusaurus 블로그 구축<a href="https://polar-sn.github.io/blog/docusaurus#docusaurus-%EB%B8%94%EB%A1%9C%EA%B7%B8-%EA%B5%AC%EC%B6%95" class="hash-link" aria-label="Docusaurus 블로그 구축에 대한 직접 링크" title="Docusaurus 블로그 구축에 대한 직접 링크">​</a></h2>
<p>이제 본격적으로 블로그를 구축하는 방법을 설명해 보겠습니다.
Docusaurus <a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer">공식 사이트</a>에서 자세한 문서를 확인할 수 있으며,
한국어도 지원하지만 아직 완벽하지는 않은 거 같습니다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-nodejs-및-yarn-설치">1. Node.js 및 Yarn 설치<a href="https://polar-sn.github.io/blog/docusaurus#1-nodejs-%EB%B0%8F-yarn-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="1. Node.js 및 Yarn 설치에 대한 직접 링크" title="1. Node.js 및 Yarn 설치에 대한 직접 링크">​</a></h3>
<p>Docusaurus를 사용하려면 먼저 <code>Node.js</code>가 필요합니다.</p>
<p>각 OS에 맞는 패키지 매니저를 이용해 <code>node</code>를 설치한 후,
<code>node -v</code> 명령어로 정상 설치 여부 및 설치 버전을 확인할 수 있습니다.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Node.js 설치</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">## macOS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">brew </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">## Ubuntu/Debian</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> nodejs </span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">## CentOS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-SL</span><span class="token plain"> https://rpm.nodesource.com/setup_lts.x </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">bash</span><span class="token plain"> -</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> yum </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> nodejs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Node.js 버전 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">node</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-v</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> v22.12.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>노트</div><div class="admonitionContent_BuS1"><p>2025년 1월 기준으로, 공식 문서에서는 18.0 버전 이상의 Node.js를 요구하고 있습니다.</p></div></div>
<p>사이트 배포를 위해 <code>yarn</code>도 설치해 줍니다.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">yarn</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-docusaurus-기본-템플릿-생성">2. Docusaurus 기본 템플릿 생성<a href="https://polar-sn.github.io/blog/docusaurus#2-docusaurus-%EA%B8%B0%EB%B3%B8-%ED%85%9C%ED%94%8C%EB%A6%BF-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="2. Docusaurus 기본 템플릿 생성에 대한 직접 링크" title="2. Docusaurus 기본 템플릿 생성에 대한 직접 링크">​</a></h3>
<p>Docusaurus에서 기본으로 제공하는 <code>classic</code> 템플릿을 이용해 웹사이트를 생성합니다.
여기서 <code>my-website</code>는 생성되는 폴더명이므로 자유롭게 설정해 주시면 됩니다.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npx create-docusaurus@latest my-website classic</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>실행 후 사용할 언어를 선택하는 옵션이 나오면, 방향키를 이용해 JavaScript 또는 TypeScript를 선택할 수 있습니다.
저는 TypeScript를 선택했습니다.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">? Which language do you want to use? › - Use arrow-keys. Return to submit.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    JavaScript</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">❯   TypeScript</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>참고로 아래와 같이 인자로 사용할 언어를 지정해 주는 것도 가능합니다.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npx create-docusaurus@latest my-website classic </span><span class="token parameter variable" style="color:#36acaa">--typescript</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>명령이 성공적으로 실행됐다면, <code>my-website</code> 폴더에 아래와 같은 파일들이 생성됩니다.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">my-website</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── blog</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── 2019-05-28-first-blog-post.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── 2019-05-29-long-blog-post.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── 2021-08-01-mdx-blog-post.mdx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── 2021-08-26-welcome</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; ├── docusaurus-plushie-banner.jpeg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; └── index.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── authors.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── tags.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── docs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── intro.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── tutorial-basics</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; ├── _category_.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; ├── congratulations.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; ├── create-a-blog-post.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; ├── create-a-document.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; ├── create-a-page.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; ├── deploy-your-site.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; └── markdown-features.mdx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── tutorial-extras</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── _category_.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── img</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     │&nbsp;&nbsp; ├── docsVersionDropdown.png</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     │&nbsp;&nbsp; └── localeDropdown.png</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── manage-docs-versions.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     └── translate-your-site.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── docusaurus.config.ts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── package-lock.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── package.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── sidebars.ts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── src</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── components</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; └── HomepageFeatures</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp;     ├── index.tsx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp;     └── styles.module.css</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; ├── css</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; │&nbsp;&nbsp; └── custom.css</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── pages</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── index.module.css</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── index.tsx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     └── markdown-page.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── static</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp; └── img</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── docusaurus-social-card.jpg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── docusaurus.png</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── favicon.ico</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── logo.svg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── undraw_docusaurus_mountain.svg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     ├── undraw_docusaurus_react.svg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│&nbsp;&nbsp;     └── undraw_docusaurus_tree.svg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── tsconfig.json</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-로컬-개발-서버-실행">3. 로컬 개발 서버 실행<a href="https://polar-sn.github.io/blog/docusaurus#3-%EB%A1%9C%EC%BB%AC-%EA%B0%9C%EB%B0%9C-%EC%84%9C%EB%B2%84-%EC%8B%A4%ED%96%89" class="hash-link" aria-label="3. 로컬 개발 서버 실행에 대한 직접 링크" title="3. 로컬 개발 서버 실행에 대한 직접 링크">​</a></h3>
<p>프로젝트 폴더 <code>my-website</code>로 이동한 후, <code>npm run start</code> 명령을 실행하면 로컬 개발 서버가 실행됩니다.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> my-website</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run start</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>기본적으로 <a href="http://localhost:3000/" target="_blank" rel="noopener noreferrer">http://localhost:3000/</a> 에서 사이트를 확인할 수 있으며, 설정이나 코드 변경 사항이 실시간으로 반영됩니다.
Classic 템플릿으로 만들어진 웹사이트는 아래와 같은 모습을 하고 있으며,
Docusaurus <a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer">공식 사이트</a>와 유사한 것을 확인할 수 있습니다.
<img decoding="async" loading="lazy" src="https://polar-sn.github.io/assets/images/devserver-36b75a5053c55be8000098535f40be0e.png" width="2902" height="2006" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>팁</div><div class="admonitionContent_BuS1"><p><code>npm run</code> 명령은 npm 스크립트를 실행할 때 사용하는 명령어로,
프로젝트의 <code>package.json</code> 파일에 정의된 사용자 지정 스크립트를 실행할 수 있도록 도와줍니다.</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">package.json</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"scripts"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"docusaurus"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docusaurus"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"start"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docusaurus start"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"build"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docusaurus build"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"swizzle"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docusaurus swizzle"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"deploy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docusaurus deploy"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"clear"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docusaurus clear"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"serve"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docusaurus serve"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>따라서, <code>npm run start</code>는 <code>npx docusaurus start</code>와 동일하게 동작합니다.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-웹사이트-빌드">4. 웹사이트 빌드<a href="https://polar-sn.github.io/blog/docusaurus#4-%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%B9%8C%EB%93%9C" class="hash-link" aria-label="4. 웹사이트 빌드에 대한 직접 링크" title="4. 웹사이트 빌드에 대한 직접 링크">​</a></h3>
<p>위의 로컬 개발 서버 실행에서 사용한 <code>npm run start</code> 명령은 <strong>빌드 없이</strong> 서버를 실행하여 사이트를 보여줍니다.
Docusaurus는 정적 렌더링 방식을 사용하므로, 웹사이트를 배포하려면 정적 파일로 빌드가 필요합니다.</p>
<p>웹사이트에 게시할 파일을 빌드하기 위해 <code>npm run build</code> 명령을 실행합니다.
빌드가 완료되면 <code>build</code> 폴더 내에 정적 파일들이 생성됩니다.
이 <code>build</code> 폴더는 실제 배포를 위한 파일들로, 이를 웹 서버나 호스팅 서비스로 업로드해야 합니다.
예를 들어, GitHub Pages, Netlify, Vercel 등을 통해 웹사이트를 배포할 수 있습니다.</p>
<p>빌드된 결과물을 확인하려면 <code>npm run serve</code> 명령을 실행합니다.
이 명령을 실행하면 <a href="http://localhost:3000/" target="_blank" rel="noopener noreferrer">http://localhost:3000/</a> 에 빌드된 파일이 로드되며, 배포할 웹사이트를 미리 테스트할 수 있습니다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="5-github-pages로-배포">5. GitHub Pages로 배포<a href="https://polar-sn.github.io/blog/docusaurus#5-github-pages%EB%A1%9C-%EB%B0%B0%ED%8F%AC" class="hash-link" aria-label="5. GitHub Pages로 배포에 대한 직접 링크" title="5. GitHub Pages로 배포에 대한 직접 링크">​</a></h3>
<p>이제 빌드한 웹사이트를 GitHub Pages에 배포해 보겠습니다.
우선 <a href="https://github.com/" target="_blank" rel="noopener noreferrer">GitHub</a>에서 <code>[username].github.io</code>라는 이름으로 <code>public</code> 레포지토리를 생성합니다.</p>
<p>그리고 <code>docusaurus.config.ts</code> 파일에서 아래 설정값을 수정 및 추가해 줍니다.</p>
<ul>
<li><code>organizationName</code>: 배포할 레포지토리를 소유하고 있는 GitHub 사용자 또는 그룹 계정을 설정합니다.</li>
<li><code>projectName</code>: 배포할 레포지토리 이름을 설정합니다.</li>
<li><code>deploymentBranch</code>: 배포할 브랜치 이름을 설정합니다. 일반적으로 <code>gh-pages</code>브랜치를 많이 사용하지만, 임의로 설정해도 무방합니다.</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">docusaurus.config.js</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">config</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">Config</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">url</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://[username].github.io'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">baseUrl</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">organizationName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'[username]'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">projectName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'[username].github.io'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">deploymentBranch</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'gh-pages'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token spread operator" style="color:#393A34">...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>다음으로 아래 명령을 실행해 사이트를 GitHub Pages로 배포합니다.
명령이 실행되면 위에서 설정한 레포지토리의 브랜치에 빌드된 파일이 커밋된 것을 확인할 수 있습니다.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">USE_SSH=true yarn deploy</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>마지막으로, 레포지토리의 Settings &gt; Pages에 들어간 후, Build and deployment 항목에서 Branch를 배포에 사용할 브랜치로 변경해 줍니다.
<img decoding="async" loading="lazy" src="https://polar-sn.github.io/assets/images/deploy-branch-5c764f866e03a9ee2427d635025d3528.png" width="2290" height="1814" class="img_ev3q"></p>
<p>이제 https://[username].github.io 에서 나만의 웹사이트를 확인하실 수 있습니다.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="참고-사이트">참고 사이트<a href="https://polar-sn.github.io/blog/docusaurus#%EC%B0%B8%EA%B3%A0-%EC%82%AC%EC%9D%B4%ED%8A%B8" class="hash-link" aria-label="참고 사이트에 대한 직접 링크" title="참고 사이트에 대한 직접 링크">​</a></h2>
<ul>
<li>공식 사이트: <a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer">https://docusaurus.io</a></li>
<li>Docusaurus 설치 가이드: <a href="https://docusaurus.io/docs/installation" target="_blank" rel="noopener noreferrer">https://docusaurus.io/docs/installation</a></li>
<li>Docusaurus 배포 가이드: <a href="https://docusaurus.io/docs/deployment" target="_blank" rel="noopener noreferrer">https://docusaurus.io/docs/deployment</a></li>
</ul>
<p><em>다음 포스트는 Docusaurus 블로그를 커스터마이징하는 방법으로 찾아오겠습니다.</em></p>]]></content>
        <category label="Blog" term="Blog"/>
        <category label="Docusaurus" term="Docusaurus"/>
    </entry>
</feed>