<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://cogito90.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://cogito90.github.io/" rel="alternate" type="text/html" /><updated>2026-08-31T00:41:17+09:00</updated><id>https://cogito90.github.io/feed.xml</id><title type="html">삶은개발</title><subtitle></subtitle><author><name>Moon Yoo</name></author><entry><title type="html">한글 카테고리가 URL을 망치고 있었다</title><link href="https://cogito90.github.io/shorts/jekyll-category-slug/" rel="alternate" type="text/html" title="한글 카테고리가 URL을 망치고 있었다" /><published>2026-08-30T00:00:00+09:00</published><updated>2026-08-31T08:30:00+09:00</updated><id>https://cogito90.github.io/shorts/jekyll-category-slug</id><content type="html" xml:base="https://cogito90.github.io/shorts/jekyll-category-slug/"><![CDATA[<p>블로그 글 주소를 오랜만에 들여다보다가 좀 이상한 걸 발견했어요.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/객체지향 이야기/oop-1-intro/
</code></pre></div></div>

<p>카테고리를 한글로 적어놨더니 그게 그대로 경로가 된 거죠. 심지어 공백까지 들어가 있어서, 실제로 브라우저 주소창에 찍히는 건 <code class="language-plaintext highlighter-rouge">%EA%B0%9D%EC%B2%B4...%20...</code> 같은 암호문이었습니다. 링크를 복사해서 어디 붙여넣으면 아무도 무슨 글인지 알 수 없는 형태가 되고요.</p>

<h2 id="원인은-permalink-한-줄">원인은 permalink 한 줄</h2>

<p>Jekyll의 <code class="language-plaintext highlighter-rouge">_config.yml</code>에 이렇게 적혀 있었습니다.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">permalink</span><span class="pi">:</span> <span class="s">/:categories/:title/</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">:categories</code>가 포스트 frontmatter의 <code class="language-plaintext highlighter-rouge">categories</code> 값을 그대로 가져다 씁니다. 그러니 거기에 “객체지향 이야기”라고 적으면 경로도 그렇게 되는 거예요. 당연한 동작인데, 카테고리를 처음 정할 때는 화면에 어떻게 보일지만 생각했지 주소가 될 거라는 생각은 못 했습니다.</p>

<h2 id="그런데-표시는-한글로-하고-싶다">그런데 표시는 한글로 하고 싶다</h2>

<p>주소만 영문으로 바꾸면 되지 않나 싶지만, 그러면 글 하단 카테고리 링크에도 <code class="language-plaintext highlighter-rouge">oop</code>라고 뜹니다. 읽는 사람 입장에서는 “객체지향 이야기”가 훨씬 낫죠.</p>

<p>그래서 <strong>값과 표시를 분리</strong>했습니다. 카테고리 값은 영문 slug로 두고, 표시할 때만 매핑 테이블을 거치게요.</p>

<p><code class="language-plaintext highlighter-rouge">_data/category_names.yml</code>:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">oop</span><span class="pi">:</span> <span class="s2">"</span><span class="s">객체지향</span><span class="nv"> </span><span class="s">이야기"</span>
<span class="na">shorts</span><span class="pi">:</span> <span class="s2">"</span><span class="s">토막상식"</span>
</code></pre></div></div>

<p>그리고 카테고리를 출력하는 자리에서 이 매핑을 조회합니다.</p>

<div class="language-liquid highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">category_label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">data</span><span class="p">.</span><span class="nv">category_names</span><span class="p">[</span><span class="nv">category_word</span><span class="p">]</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">default</span><span class="p">:</span><span class="w"> </span><span class="nv">category_word</span><span class="w"> </span><span class="p">%}</span>
&lt;a href="..."&gt;<span class="p">{{</span><span class="w"> </span><span class="nv">category_label</span><span class="w"> </span><span class="p">}}</span>&lt;/a&gt;
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">default</code> 필터가 폴백입니다. 매핑에 없는 카테고리는 slug가 그대로 나오니까, 새 카테고리를 추가하면서 매핑을 깜빡해도 페이지가 깨지진 않아요.</p>

<h2 id="한-가지-함정">한 가지 함정</h2>

<p>Liquid에서 이렇게 쓰면 조회가 안 됩니다.</p>

<div class="language-liquid highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">data</span><span class="p">.</span><span class="nv">category_names</span><span class="p">[</span><span class="nv">category</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span><span class="w"> </span><span class="p">}}</span>
</code></pre></div></div>

<p>대괄호 안에 또 대괄호가 들어간 형태를 Liquid가 제대로 파싱하지 못하더군요. 조용히 빈 값이 나와서 한참 헤맸습니다. 변수로 한 번 빼주면 해결됩니다.</p>

<div class="language-liquid highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">category_key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">category</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">%}</span>
<span class="p">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">category_label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">data</span><span class="p">.</span><span class="nv">category_names</span><span class="p">[</span><span class="nv">category_key</span><span class="p">]</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">default</span><span class="p">:</span><span class="w"> </span><span class="nv">category_key</span><span class="w"> </span><span class="p">%}</span>
</code></pre></div></div>

<h2 id="결국">결국</h2>

<p>주소는 기계가 읽고, 표시는 사람이 읽습니다. 둘을 같은 값으로 묶어두면 언젠가 한쪽이 불편해져요.</p>

<p>이미 발행한 글의 카테고리를 바꾸면 URL이 바뀌니까, 기존 유입이 있다면 리다이렉트를 먼저 준비해두는 게 맞습니다. 저는 어차피 한글+공백 주소라 검색 유입이 없다시피 해서 그냥 갈아엎었어요.</p>]]></content><author><name>Moon Yoo</name></author><category term="shorts" /><category term="Jekyll" /><category term="블로그" /><category term="minimal-mistakes" /><summary type="html"><![CDATA[한글 카테고리를 쓰면 URL이 퍼센트 인코딩으로 깨진다. 값과 표시를 분리하는 방법.]]></summary></entry></feed>