<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko-KR"><generator uri="https://jekyllrb.com/" version="4.3.3">Jekyll</generator><link href="https://blog.woonyong.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.woonyong.org/" rel="alternate" type="text/html" hreflang="ko-KR" /><updated>2026-04-09T18:41:38+09:00</updated><id>https://blog.woonyong.org/feed.xml</id><title type="html">Woonyong Blog</title><subtitle>개발과 운영을 기록하는 블로그</subtitle><entry><title type="html">Velog Style Jekyll Theme 소개</title><link href="https://blog.woonyong.org/introducing-velog-style-jekyll-theme/" rel="alternate" type="text/html" title="Velog Style Jekyll Theme 소개" /><published>2026-04-02T09:00:00+09:00</published><updated>2026-04-02T09:00:00+09:00</updated><id>https://blog.woonyong.org/introducing-velog-style-jekyll-theme</id><content type="html" xml:base="https://blog.woonyong.org/introducing-velog-style-jekyll-theme/"><![CDATA[<p>이 테마는 <code class="language-plaintext highlighter-rouge">읽기 편한 글 목록</code>, <code class="language-plaintext highlighter-rouge">시리즈</code>, <code class="language-plaintext highlighter-rouge">태그</code>, <code class="language-plaintext highlighter-rouge">검색</code>, <code class="language-plaintext highlighter-rouge">GitHub 프로필 동기화</code>, <code class="language-plaintext highlighter-rouge">기여 그래프</code>를 한 번에 갖춘 Jekyll 기반 개발 블로그 출발점입니다. 단순히 보기 좋은 화면만 넣는 대신, 실제로 저장소를 복제한 뒤 어떻게 설정하고 운영하는지까지 문서형 데모로 함께 제공하는 것을 목표로 만들었습니다.</p>

<p>라이트 모드와 다크 모드를 모두 지원하며, 기본값은 시스템 모드를 따릅니다. 아래 화면은 다크 모드 기준으로 캡처한 실제 데모입니다.</p>

<h2 id="화면-미리보기">화면 미리보기</h2>

<h3 id="홈">홈</h3>

<p><img src="/assets/images/docs/home-preview.png" alt="홈 화면 미리보기" /></p>

<p>홈에서는 프로필, 기여 그래프, 태그 목록, 글 목록을 한 화면 흐름 안에서 바로 볼 수 있습니다. “최근 글을 먼저 보여주면서도 탐색 도구를 잃지 않는 구조”가 이 테마의 핵심입니다.</p>

<h3 id="시리즈">시리즈</h3>

<p><img src="/assets/images/docs/series-preview.png" alt="시리즈 화면 미리보기" /></p>

<p>시리즈 탭은 글 목록과 다른 밀도를 갖도록 카드형 레이아웃을 사용합니다. 사용자는 시리즈를 “연재 묶음”처럼 인식하고, 개별 글과는 다른 방식으로 탐색할 수 있습니다.</p>

<h3 id="글-상세">글 상세</h3>

<p><img src="/assets/images/docs/post-preview.png" alt="글 상세 화면 미리보기" /></p>

<p>글 상세에서는 시리즈명, 제목, 설명, 작성자 메타, 태그, 썸네일, 본문, 이전/다음 포스트까지 한 흐름으로 이어집니다. 문서형 블로그에서 필요한 정보가 처음 접속한 사용자에게도 무리 없이 보이도록 정리한 구조입니다.</p>

<h2 id="이-테마가-해결하려는-문제">이 테마가 해결하려는 문제</h2>

<p>정적 블로그 테마는 보통 두 방향으로 갈립니다.</p>

<ul>
  <li>화면은 예쁘지만 설정 지점이 흩어져 있어서 초기에 손대기 어렵거나</li>
  <li>기능은 충분하지만 글 읽는 흐름이 무겁고 오래된 느낌이 나는 경우</li>
</ul>

<p>이 테마는 그 중간을 노렸습니다. 글은 가볍게 읽히고, 운영자는 <code class="language-plaintext highlighter-rouge">_config.yml</code>, <code class="language-plaintext highlighter-rouge">_data/profile.yml</code>, <code class="language-plaintext highlighter-rouge">_data/theme.yml</code>, <code class="language-plaintext highlighter-rouge">_data/series.yml</code>만 바꿔도 빠르게 자기 블로그로 전환할 수 있게 구성했습니다.</p>

<h2 id="기본으로-제공하는-화면">기본으로 제공하는 화면</h2>

<p>이 저장소를 실행하면 아래 흐름이 바로 보입니다.</p>

<ol>
  <li>프로필과 GitHub 기여 그래프가 있는 상단 소개 영역</li>
  <li><code class="language-plaintext highlighter-rouge">글 / 시리즈</code> 탭</li>
  <li>글 탭에서는 태그 필터와 검색</li>
  <li>시리즈 탭에서는 카드형 시리즈 목록</li>
  <li>글 상세에서는 태그, 본문, 이전/다음 글 네비게이션</li>
</ol>

<p>즉, 블로그를 시작하는 순간부터 “소개 페이지”, “카드 샘플”, “설정 샘플”이 아니라 실제 운영 화면에 가까운 구조를 확인할 수 있습니다.</p>

<h2 id="이-테마가-특히-잘-맞는-경우">이 테마가 특히 잘 맞는 경우</h2>

<ul>
  <li>GitHub Pages 위에 개발 블로그를 빠르게 올리고 싶은 경우</li>
  <li>velog처럼 가볍게 읽히는 목록 구조를 좋아하는 경우</li>
  <li>글, 시리즈, 태그, 검색을 모두 갖춘 출발점을 원하는 경우</li>
  <li>README와 데모 글까지 함께 공개할 오픈소스 테마 저장소가 필요한 경우</li>
</ul>

<h2 id="디렉터리-구조를-어떻게-읽으면-좋은가">디렉터리 구조를 어떻게 읽으면 좋은가</h2>

<p>가장 중요한 파일은 다음 다섯 묶음입니다.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>_config.yml               # 사이트 메타, URL, 외부 연동
_data/profile.yml         # 기본 프로필 정보
_data/theme.yml           # UI 옵션과 문구
_data/series.yml          # 시리즈 표시 이름과 설명
_posts/*.md               # 실제 블로그 글
</code></pre></div></div>

<p>CSS와 레이아웃은 이미 기본 구조가 잡혀 있기 때문에, 처음부터 HTML을 뜯기보다 위 파일들을 먼저 바꾸는 편이 훨씬 빠릅니다.</p>

<h2 id="오픈소스-테마로-배포하기-위해-정리한-기준">오픈소스 테마로 배포하기 위해 정리한 기준</h2>

<p>이 저장소는 공개용 테마라는 전제를 두고 샘플 자산도 함께 정리했습니다.</p>

<ul>
  <li>프로필 SVG와 문서용 프리뷰 이미지는 이 저장소에서 직접 만든 자산</li>
  <li>포스트 커버는 라이선스가 명확한 무료 사진만 사용</li>
  <li>빈 예시 폴더와 폐기된 데모 세트 제거</li>
  <li>실제로 쓰이지 않는 분기나 스타일은 정리</li>
  <li><code class="language-plaintext highlighter-rouge">_posts</code>에는 lorem ipsum 대신 사용 설명서 역할을 하는 데모 글 배치</li>
</ul>

<p>이 기준 덕분에 저장소를 그대로 공개해도 “샘플이 너무 허전해서 다시 만들어야 하는 상태”를 피할 수 있습니다.</p>

<h2 id="처음-가져간-뒤-추천하는-순서">처음 가져간 뒤 추천하는 순서</h2>

<p>새 블로그를 만들 때는 아래 순서가 가장 빠릅니다.</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">_config.yml</code>에서 <code class="language-plaintext highlighter-rouge">title</code>, <code class="language-plaintext highlighter-rouge">description</code>, <code class="language-plaintext highlighter-rouge">url</code>, <code class="language-plaintext highlighter-rouge">baseurl</code> 수정</li>
  <li><code class="language-plaintext highlighter-rouge">_data/profile.yml</code>에서 기본 이름과 소개 문구 수정</li>
  <li><code class="language-plaintext highlighter-rouge">_data/theme.yml</code>에서 탭, 헤더, 검색 문구, GitHub 연동 옵션 조정</li>
  <li><code class="language-plaintext highlighter-rouge">_posts</code>의 샘플 글을 유지하거나 교체</li>
  <li>필요하면 <code class="language-plaintext highlighter-rouge">scripts/fetch_github_contributions.rb</code>로 GitHub 프로필 연결</li>
</ol>

<p>다음 글부터는 이 과정을 각각 자세히 설명합니다. 설치, 설정, 글 작성, GitHub 동기화, 배포까지 순서대로 읽으면 한 번에 전체 구조를 파악할 수 있습니다.</p>]]></content><author><name></name></author><category term="Jekyll Theme" /><category term="Velog Style" /><category term="GitHub Pages" /><category term="Open Source" /><summary type="html"><![CDATA[velog의 읽기 흐름을 참고해 Jekyll과 GitHub Pages에 맞게 다시 구성한 오픈소스 개발 블로그 테마를 소개합니다.]]></summary></entry><entry><title type="html">로컬에서 테마를 설치하고 미리보기하는 가장 빠른 방법</title><link href="https://blog.woonyong.org/installing-the-theme-locally/" rel="alternate" type="text/html" title="로컬에서 테마를 설치하고 미리보기하는 가장 빠른 방법" /><published>2026-04-01T09:00:00+09:00</published><updated>2026-04-01T09:00:00+09:00</updated><id>https://blog.woonyong.org/installing-the-theme-locally</id><content type="html" xml:base="https://blog.woonyong.org/installing-the-theme-locally/"><![CDATA[<p>처음 실행할 때는 명령 자체보다 “어떤 단계는 선택 사항이고, 어떤 단계는 필수인지”를 구분하는 것이 중요합니다. 이 테마는 GitHub 연동이 없어도 열리지만, Ruby 의존성과 <code class="language-plaintext highlighter-rouge">baseurl</code>만큼은 정확히 맞아야 합니다.</p>

<h2 id="준비물">준비물</h2>

<p>로컬 미리보기를 위해 필요한 것은 아래 정도입니다.</p>

<ul>
  <li>Ruby와 Bundler</li>
  <li>Git</li>
  <li>선택 사항: <code class="language-plaintext highlighter-rouge">gh auth login</code> 또는 GitHub 토큰</li>
</ul>

<p>GitHub 연동이 없더라도 화면은 정상으로 열립니다. 다만 이 경우 프로필과 잔디 그래프는 샘플 상태를 유지합니다.</p>

<h2 id="가장-짧은-실행-순서">가장 짧은 실행 순서</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">BUNDLE_FORCE_RUBY_PLATFORM</span><span class="o">=</span><span class="nb">true </span>bundle <span class="nb">install
</span>ruby scripts/fetch_github_contributions.rb
<span class="nv">BUNDLE_FORCE_RUBY_PLATFORM</span><span class="o">=</span><span class="nb">true </span>bundle <span class="nb">exec </span>jekyll serve
</code></pre></div></div>

<p>두 번째 줄은 선택입니다. GitHub 프로필과 기여 그래프를 연결하지 않을 거라면 생략해도 됩니다.</p>

<h2 id="미리보기-주소">미리보기 주소</h2>

<p>현재 저장소 이름 기준 기본 주소는 다음입니다.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http://127.0.0.1:4000/
</code></pre></div></div>

<p>커스텀 도메인을 쓰고 <code class="language-plaintext highlighter-rouge">baseurl</code>을 비워 둔 상태라면 로컬 미리보기 주소도 루트(<code class="language-plaintext highlighter-rouge">/</code>)로 열립니다. 프로젝트 페이지를 쓸 때만 저장소 이름에 맞는 <code class="language-plaintext highlighter-rouge">baseurl</code>이 필요합니다.</p>

<h2 id="github-동기화-없이-실행하는-경우">GitHub 동기화 없이 실행하는 경우</h2>

<p>토큰이 아직 없거나 GitHub 연동을 나중에 붙일 생각이라면 이렇게 실행해도 됩니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">BUNDLE_FORCE_RUBY_PLATFORM</span><span class="o">=</span><span class="nb">true </span>bundle <span class="nb">install
</span><span class="nv">BUNDLE_FORCE_RUBY_PLATFORM</span><span class="o">=</span><span class="nb">true </span>bundle <span class="nb">exec </span>jekyll serve
</code></pre></div></div>

<p>이 경우 화면은 아래처럼 동작합니다.</p>

<ul>
  <li>프로필 이름과 소개는 <code class="language-plaintext highlighter-rouge">_data/profile.yml</code>의 샘플 값 사용</li>
  <li>브라우저 탭 아이콘과 헤더 이미지는 기본 프로필 이미지 사용</li>
  <li>잔디 그래프는 캐시가 없으면 비어 있거나 마지막 캐시 상태를 사용</li>
</ul>

<h2 id="처음-실행할-때-자주-걸리는-문제">처음 실행할 때 자주 걸리는 문제</h2>

<h3 id="gem-설치가-실패하는-경우">gem 설치가 실패하는 경우</h3>

<p>Apple Silicon이나 특정 네이티브 gem 환경에서는 Ruby 플랫폼 관련 오류가 날 수 있습니다. 그래서 이 저장소는 예시 명령에 <code class="language-plaintext highlighter-rouge">BUNDLE_FORCE_RUBY_PLATFORM=true</code>를 기본으로 넣어 두었습니다.</p>

<h3 id="잔디-그래프가-비어-보이는-경우">잔디 그래프가 비어 보이는 경우</h3>

<p>아래 중 하나만 준비되어 있으면 됩니다.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">GITHUB_GRAPHQL_TOKEN</code></li>
  <li><code class="language-plaintext highlighter-rouge">GITHUB_TOKEN</code></li>
  <li><code class="language-plaintext highlighter-rouge">gh auth login</code></li>
</ul>

<p>셋 다 없으면 스크립트는 공개 GitHub 데이터를 가져오지 못합니다.</p>

<h3 id="주소는-열리는데-스타일이-이상한-경우">주소는 열리는데 스타일이 이상한 경우</h3>

<p>가장 먼저 <code class="language-plaintext highlighter-rouge">_config.yml</code>의 <code class="language-plaintext highlighter-rouge">baseurl</code>과 실제 저장소 이름이 같은지 확인하세요. 프로젝트 페이지는 저장소 이름이 곧 URL 경로가 되기 때문에, 이 값이 어긋나면 CSS와 JS 경로가 같이 틀어집니다.</p>

<h2 id="추천-로컬-워크플로">추천 로컬 워크플로</h2>

<p>처음 테마를 가져간 뒤에는 아래 흐름이 편합니다.</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">bundle install</code></li>
  <li><code class="language-plaintext highlighter-rouge">_config.yml</code>에서 <code class="language-plaintext highlighter-rouge">title</code>, <code class="language-plaintext highlighter-rouge">url</code>, <code class="language-plaintext highlighter-rouge">baseurl</code> 수정</li>
  <li><code class="language-plaintext highlighter-rouge">_data/profile.yml</code> 수정</li>
  <li><code class="language-plaintext highlighter-rouge">jekyll serve</code>로 화면 확인</li>
  <li>그 다음에 GitHub 동기화와 배포 설정 진행</li>
</ol>

<p>이 순서대로 가면 “배포까지는 됐는데 주소가 꼬여 있는 상태”를 훨씬 덜 만나게 됩니다.</p>]]></content><author><name></name></author><category term="Quick Start" /><category term="Local Preview" /><category term="Ruby" /><category term="Jekyll" /><summary type="html"><![CDATA[Ruby 의존성 설치부터 GitHub 연동 데이터 동기화, 로컬 미리보기와 흔한 오류 대응까지 한 번에 정리합니다.]]></summary></entry><entry><title type="html">프로필, 탭, 홈 화면을 테마 설정으로 커스터마이징하기</title><link href="https://blog.woonyong.org/customizing-profile-navigation-and-home/" rel="alternate" type="text/html" title="프로필, 탭, 홈 화면을 테마 설정으로 커스터마이징하기" /><published>2026-03-31T09:00:00+09:00</published><updated>2026-03-31T09:00:00+09:00</updated><id>https://blog.woonyong.org/customizing-profile-navigation-and-home</id><content type="html" xml:base="https://blog.woonyong.org/customizing-profile-navigation-and-home/"><![CDATA[<p>이 테마는 HTML을 바로 열기 전에 <code class="language-plaintext highlighter-rouge">_config.yml</code>, <code class="language-plaintext highlighter-rouge">_data/theme.yml</code>, <code class="language-plaintext highlighter-rouge">_data/profile.yml</code>, <code class="language-plaintext highlighter-rouge">_data/series.yml</code> 네 군데만 먼저 보면 구조를 거의 파악할 수 있습니다. 커스터마이징도 이 네 파일에서 대부분 끝납니다.</p>

<h2 id="어떤-파일을-어디에-쓰는가">어떤 파일을 어디에 쓰는가</h2>

<h3 id="_configyml"><code class="language-plaintext highlighter-rouge">_config.yml</code></h3>

<p>사이트 자체의 주소와 메타데이터를 담당합니다.</p>

<ul>
  <li>블로그 제목</li>
  <li>설명</li>
  <li><code class="language-plaintext highlighter-rouge">url</code></li>
  <li><code class="language-plaintext highlighter-rouge">baseurl</code></li>
  <li>Google Analytics, Algolia, Giscus 같은 외부 연동</li>
</ul>

<p>이 파일은 “사이트 레벨 설정”이라고 생각하면 됩니다.</p>

<h3 id="_datathemeyml"><code class="language-plaintext highlighter-rouge">_data/theme.yml</code></h3>

<p>화면에 보이는 UI 옵션과 문구를 담당합니다.</p>

<ul>
  <li>헤더 GitHub / RSS / 다크모드 토글 노출</li>
  <li><code class="language-plaintext highlighter-rouge">글 / 시리즈 / 소개</code> 탭 노출 여부</li>
  <li>홈 검색 placeholder</li>
  <li>홈의 기본 로딩 개수</li>
  <li>GitHub 프로필 동기화 사용 여부</li>
</ul>

<p>이 파일은 “테마 레벨 설정”입니다.</p>

<h3 id="_dataprofileyml"><code class="language-plaintext highlighter-rouge">_data/profile.yml</code></h3>

<p>GitHub 연동이 없을 때 보여줄 기본 프로필을 정의합니다.</p>

<ul>
  <li>표시 이름</li>
  <li>소개 문구</li>
  <li>기본 아바타</li>
  <li>기본 GitHub 링크</li>
</ul>

<p>즉, 동기화 실패 상황까지 포함해 화면이 비어 보이지 않도록 받쳐 주는 파일입니다.</p>

<h3 id="_dataseriesyml"><code class="language-plaintext highlighter-rouge">_data/series.yml</code></h3>

<p>시리즈 키와 표시용 제목, 설명을 분리합니다.</p>

<div class="language-yml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">theme-overview</span><span class="pi">:</span>
  <span class="na">title</span><span class="pi">:</span> <span class="s">테마 소개와 구조</span>
  <span class="na">description</span><span class="pi">:</span> <span class="s">홈 구성, 글 목록, 시리즈 카드처럼 테마의 핵심 화면 구성을 빠르게 훑습니다.</span>
</code></pre></div></div>

<p>글 front matter에는 짧은 키만 넣고, 실제 카드에 보일 문구는 이 파일에서 관리하는 방식이 더 유지보수에 좋습니다.</p>

<h2 id="가장-많이-바꾸는-옵션-예시">가장 많이 바꾸는 옵션 예시</h2>

<p>소개 탭을 숨기고, 헤더에서 RSS는 숨기고, GitHub 프로필 동기화만 유지하고 싶다면 아래처럼 바꿀 수 있습니다.</p>

<div class="language-yml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">header</span><span class="pi">:</span>
  <span class="na">show_github_link</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">show_rss_link</span><span class="pi">:</span> <span class="no">false</span>
  <span class="na">show_theme_toggle</span><span class="pi">:</span> <span class="no">true</span>

<span class="na">tabs</span><span class="pi">:</span>
  <span class="na">show_about</span><span class="pi">:</span> <span class="no">false</span>

<span class="na">profile</span><span class="pi">:</span>
  <span class="na">github_sync</span><span class="pi">:</span>
    <span class="na">enabled</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>

<h2 id="브랜드만-빠르게-바꾸는-체크리스트">브랜드만 빠르게 바꾸는 체크리스트</h2>

<p>새 프로젝트에 이 테마를 가져갔다면 아래 순서가 가장 효율적입니다.</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">_config.yml</code>의 <code class="language-plaintext highlighter-rouge">title</code>, <code class="language-plaintext highlighter-rouge">description</code>, <code class="language-plaintext highlighter-rouge">url</code>, <code class="language-plaintext highlighter-rouge">baseurl</code> 수정</li>
  <li><code class="language-plaintext highlighter-rouge">_data/profile.yml</code>의 기본 이름과 소개 수정</li>
  <li><code class="language-plaintext highlighter-rouge">_data/theme.yml</code>의 헤더 버튼과 탭 옵션 조정</li>
  <li><code class="language-plaintext highlighter-rouge">_data/series.yml</code>에 실제 시리즈 제목 입력</li>
  <li><code class="language-plaintext highlighter-rouge">_posts</code>의 샘플 글을 유지하거나 교체</li>
</ol>

<h2 id="언제-htmlcss를-열어야-하나">언제 HTML/CSS를 열어야 하나</h2>

<p>대부분의 커스터마이징은 데이터 파일에서 끝나지만, 아래 경우에는 템플릿이나 CSS를 열어야 합니다.</p>

<ul>
  <li>카드 간격이나 폰트 크기를 바꾸고 싶을 때</li>
  <li>태그/시리즈 레이아웃 구조를 바꾸고 싶을 때</li>
  <li>헤더 아이콘 모양 자체를 교체하고 싶을 때</li>
</ul>

<p>즉, 텍스트와 옵션은 데이터 파일, 구조와 스타일은 레이아웃/CSS라는 기준으로 보면 복잡도가 많이 내려갑니다.</p>]]></content><author><name></name></author><category term="Theme Config" /><category term="Navigation" /><category term="Profile" /><category term="Customization" /><summary type="html"><![CDATA[브랜드 문구와 탭 노출 여부, 헤더 버튼, 홈 검색 문구, GitHub 동기화 옵션을 어디서 조절하는지 체계적으로 정리합니다.]]></summary></entry><entry><title type="html">글, 시리즈, 태그, 썸네일을 이 테마에서 다루는 방법</title><link href="https://blog.woonyong.org/writing-posts-series-and-thumbnails/" rel="alternate" type="text/html" title="글, 시리즈, 태그, 썸네일을 이 테마에서 다루는 방법" /><published>2026-03-30T09:00:00+09:00</published><updated>2026-03-30T09:00:00+09:00</updated><id>https://blog.woonyong.org/writing-posts-series-and-thumbnails</id><content type="html" xml:base="https://blog.woonyong.org/writing-posts-series-and-thumbnails/"><![CDATA[<p>이 테마에서 포스트는 Jekyll 기본 규칙을 따르면서도, 개발 블로그에 자주 필요한 메타데이터를 조금 더 얹어서 씁니다. 핵심은 “글 파일은 단순하게 유지하고, 시리즈 이름이나 UI 문구는 별도 데이터 파일에 분리한다”는 점입니다.</p>

<h2 id="기본-front-matter">기본 front matter</h2>

<p>가장 많이 쓰는 형태는 아래 정도입니다.</p>

<div class="language-md highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">글 제목</span>
<span class="na">description</span><span class="pi">:</span> <span class="s">목록에 보일 요약</span>
<span class="na">date</span><span class="pi">:</span> <span class="s">2026-04-03 09:00:00 +0900</span>
<span class="na">updated_at</span><span class="pi">:</span> <span class="s">2026-04-03 21:00:00 +0900</span>
<span class="na">thumbnail</span><span class="pi">:</span> <span class="s">/assets/images/posts/my-post-cover.png</span>
<span class="na">series</span><span class="pi">:</span> <span class="s">theme-overview</span>
<span class="na">tags</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s">Jekyll</span>
  <span class="pi">-</span> <span class="s">Theme</span>
<span class="nn">---</span>
</code></pre></div></div>

<h2 id="각-필드가-화면에서-쓰이는-곳">각 필드가 화면에서 쓰이는 곳</h2>

<table>
  <thead>
    <tr>
      <th>필드</th>
      <th>쓰이는 위치</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">title</code></td>
      <td>글 목록 제목, 상세 제목</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">description</code></td>
      <td>글 카드 요약 문구</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">thumbnail</code></td>
      <td>카드 상단, 글 상세 상단</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">series</code></td>
      <td>시리즈 카드 제목, 시리즈 필터</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">tags</code></td>
      <td>홈 태그 목록, 글 상세 태그 링크</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">updated_at</code></td>
      <td>수정일 표기, 최신 정렬 기준</td>
    </tr>
  </tbody>
</table>

<h2 id="시리즈를-붙이는-방식">시리즈를 붙이는 방식</h2>

<p>포스트는 <code class="language-plaintext highlighter-rouge">series: theme-overview</code>처럼 키만 넣고, 실제 표시용 제목과 설명은 <code class="language-plaintext highlighter-rouge">_data/series.yml</code>에 둡니다.</p>

<p>이렇게 분리하면 같은 시리즈 이름을 여러 글에서 반복 입력할 필요가 없고, 시리즈 카드 문구를 한 곳에서 수정할 수 있습니다.</p>

<h2 id="태그는-어떻게-보이는가">태그는 어떻게 보이는가</h2>

<p>태그는 두 군데에서 동시에 쓰입니다.</p>

<ul>
  <li>홈 왼쪽 태그 패널</li>
  <li>글 카드와 글 상세의 태그 링크</li>
</ul>

<p>그래서 태그는 단순 메모 용도가 아니라 실제 탐색 체계라고 생각하고 붙이는 편이 좋습니다. 너무 세분화하면 목록이 지저분해지고, 너무 넓으면 필터 가치가 떨어집니다.</p>

<h2 id="썸네일-규칙">썸네일 규칙</h2>

<p>이 테마는 <code class="language-plaintext highlighter-rouge">thumbnail</code>이 있을 때만 이미지를 그립니다.</p>

<ul>
  <li>카드: <code class="language-plaintext highlighter-rouge">thumbnail</code>이 있을 때만 표시</li>
  <li>상세: <code class="language-plaintext highlighter-rouge">thumbnail</code>이 있을 때만 상단 이미지 표시</li>
  <li>시리즈 카드: 대표 글의 <code class="language-plaintext highlighter-rouge">thumbnail</code>이 있을 때만 표시</li>
</ul>

<p>즉, 이미지가 없는 글은 텍스트 중심 카드로 자연스럽게 남고, 이미지가 있는 글만 시각적으로 강조됩니다.</p>

<h2 id="커버-이미지-준비-팁">커버 이미지 준비 팁</h2>

<p>오픈소스 데모 저장소라면 썸네일도 대충 넣기보다 기준을 정해 두는 편이 좋습니다.</p>

<ul>
  <li>너무 작은 이미지는 피하기</li>
  <li>카드와 상세 모두에서 자연스럽게 보이도록 가로형 비율 사용</li>
  <li>저작권 출처를 <code class="language-plaintext highlighter-rouge">NOTICE.md</code>에 남기기</li>
  <li>데모용이라면 분위기가 비슷한 이미지를 한 세트로 맞추기</li>
</ul>

<p>이 저장소는 실제 공개용 데모로 보이도록 코드 화면, 작업 환경, 노트북 사용 장면처럼 개발 블로그와 자연스럽게 어울리는 커버 이미지를 사용합니다.</p>

<h2 id="markdown-지원-범위">Markdown 지원 범위</h2>

<p>현재 데모 글 기준으로 확인해 둔 요소는 다음과 같습니다.</p>

<ul>
  <li>제목과 일반 문단</li>
  <li>리스트와 체크리스트</li>
  <li>표</li>
  <li>코드 블록</li>
  <li>이미지</li>
  <li>링크</li>
  <li>인용문</li>
  <li>raw HTML</li>
  <li>YouTube iframe</li>
</ul>

<p>문서형 블로그에 필요한 기본 범위는 충분히 커버한다고 보면 됩니다.</p>

<h2 id="글-발행-전-체크리스트">글 발행 전 체크리스트</h2>

<p>실제 운영에서는 아래 정도만 확인하면 안정적입니다.</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">description</code>이 카드 요약으로 자연스러운지</li>
  <li><code class="language-plaintext highlighter-rouge">tags</code>가 너무 많지 않은지</li>
  <li><code class="language-plaintext highlighter-rouge">series</code> 키가 <code class="language-plaintext highlighter-rouge">_data/series.yml</code>에 존재하는지</li>
  <li><code class="language-plaintext highlighter-rouge">thumbnail</code> 경로가 실제 자산과 일치하는지</li>
  <li><code class="language-plaintext highlighter-rouge">updated_at</code>를 수정했는지</li>
</ol>

<p>이 기준만 지켜도 홈 목록, 시리즈, 상세 화면이 한 번에 자연스럽게 맞춰집니다.</p>]]></content><author><name></name></author><category term="Markdown" /><category term="Series" /><category term="Tags" /><category term="Thumbnail" /><summary type="html"><![CDATA[front matter 설계, Markdown 지원 범위, 시리즈와 태그 연결, 썸네일 표시 규칙까지 작성자 관점에서 정리합니다.]]></summary></entry><entry><title type="html">GitHub Pages와 Jenkins로 테마를 배포하는 방법</title><link href="https://blog.woonyong.org/deploying-with-github-pages-and-jenkins/" rel="alternate" type="text/html" title="GitHub Pages와 Jenkins로 테마를 배포하는 방법" /><published>2026-03-29T09:00:00+09:00</published><updated>2026-03-29T09:00:00+09:00</updated><id>https://blog.woonyong.org/deploying-with-github-pages-and-jenkins</id><content type="html" xml:base="https://blog.woonyong.org/deploying-with-github-pages-and-jenkins/"><![CDATA[<p>이 테마는 <code class="language-plaintext highlighter-rouge">main</code>에서 Jekyll을 빌드하고, 결과를 <code class="language-plaintext highlighter-rouge">gh-pages</code> 브랜치로 배포하는 구조를 기본값으로 둡니다. GitHub Pages 프로젝트 페이지 기준으로 가장 단순하고 재현하기 쉬운 배포 방식입니다.</p>

<h2 id="기본-배포-흐름">기본 배포 흐름</h2>

<p>파이프라인이 하는 일은 아래 네 단계입니다.</p>

<ol>
  <li>gem 설치</li>
  <li>GitHub 프로필과 기여 그래프 캐시 동기화</li>
  <li><code class="language-plaintext highlighter-rouge">jekyll build</code></li>
  <li><code class="language-plaintext highlighter-rouge">_site/</code> 내용을 <code class="language-plaintext highlighter-rouge">gh-pages</code> 브랜치로 푸시</li>
</ol>

<p>Jenkins를 쓰지 않더라도, 핵심은 “정적 결과물을 어디에 배포할지”입니다. CI가 GitHub Actions든 Jenkins든 결과만 <code class="language-plaintext highlighter-rouge">gh-pages</code>에 올리면 구조는 같습니다.</p>

<h2 id="github-pages-설정">GitHub Pages 설정</h2>

<p>프로젝트 페이지를 쓰는 경우 GitHub 저장소 설정에서 아래 두 가지를 맞춰야 합니다.</p>

<ul>
  <li>Pages source: <code class="language-plaintext highlighter-rouge">gh-pages</code> 브랜치</li>
  <li>Folder: <code class="language-plaintext highlighter-rouge">/ (root)</code></li>
</ul>

<p>이 설정이 빠지면 브랜치는 갱신돼도 실제 사이트는 열리지 않습니다.</p>

<h2 id="저장소-이름과-baseurl">저장소 이름과 baseurl</h2>

<p>가장 자주 틀리는 부분은 <code class="language-plaintext highlighter-rouge">baseurl</code>입니다. 프로젝트 페이지는 저장소 이름이 URL 경로가 되므로, 저장소를 <code class="language-plaintext highlighter-rouge">jekyll-theme-velog</code>로 바꿨다면 <code class="language-plaintext highlighter-rouge">_config.yml</code>도 이렇게 맞아야 합니다.</p>

<div class="language-yml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">url</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://blog.woonyong.org"</span>
<span class="na">baseurl</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
</code></pre></div></div>

<p>커스텀 도메인을 쓴다면 <code class="language-plaintext highlighter-rouge">baseurl</code>은 보통 비워 두는 편이 맞습니다. 반대로 <code class="language-plaintext highlighter-rouge">github.io/저장소명</code> 프로젝트 페이지를 그대로 쓸 때는 저장소 이름을 <code class="language-plaintext highlighter-rouge">baseurl</code>로 넣어야 합니다.</p>

<h2 id="jenkins에서-필요한-것">Jenkins에서 필요한 것</h2>

<p>이 저장소의 <code class="language-plaintext highlighter-rouge">Jenkinsfile</code>을 그대로 쓰려면 아래 자격 증명이 필요합니다.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">github-pages</code>
    <ul>
      <li>username: GitHub 사용자명</li>
      <li>password: GitHub Personal Access Token</li>
    </ul>
  </li>
</ul>

<p>그리고 Jenkins 에이전트에는 Ruby와 Bundler가 있어야 합니다.</p>

<h2 id="수동-배포로-검증하는-방법">수동 배포로 검증하는 방법</h2>

<p>자동화 전에 먼저 로컬 빌드만 검증하고 싶다면 아래 명령으로 충분합니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">BUNDLE_FORCE_RUBY_PLATFORM</span><span class="o">=</span><span class="nb">true </span>bundle <span class="nb">exec </span>jekyll build
</code></pre></div></div>

<p>그 다음 <code class="language-plaintext highlighter-rouge">_site</code> 내용이 올바른지 확인한 뒤, 원하는 배포 도구로 <code class="language-plaintext highlighter-rouge">gh-pages</code>에 올리면 됩니다.</p>

<h2 id="배포-후-확인-체크리스트">배포 후 확인 체크리스트</h2>

<p>배포가 끝났다면 아래 네 가지를 바로 보는 편이 좋습니다.</p>

<ol>
  <li>Pages 주소가 200 응답인지</li>
  <li><code class="language-plaintext highlighter-rouge">index.html</code>이 올바른 <code class="language-plaintext highlighter-rouge">baseurl</code>을 쓰는지</li>
  <li><code class="language-plaintext highlighter-rouge">feed.xml</code>과 썸네일 이미지가 정상 응답인지</li>
  <li>홈과 시리즈 페이지가 같은 경로 체계를 쓰는지</li>
</ol>

<p>정적 블로그는 에러 로그보다 “잘못된 링크 경로”가 더 흔한 장애 원인이기 때문에, 이 체크리스트만으로도 대부분의 배포 문제를 초기에 잡을 수 있습니다.</p>]]></content><author><name></name></author><category term="GitHub Pages" /><category term="Jenkins" /><category term="Deployment" /><category term="Open Source" /><summary type="html"><![CDATA[프로젝트 페이지 기준으로 빌드 결과를 gh-pages 브랜치에 배포하는 흐름과 저장소 이름 변경 시 주의할 점까지 정리합니다.]]></summary></entry><entry><title type="html">GitHub 프로필 동기화와 기여 그래프를 붙이는 방법</title><link href="https://blog.woonyong.org/github-profile-sync-and-contribution-graph/" rel="alternate" type="text/html" title="GitHub 프로필 동기화와 기여 그래프를 붙이는 방법" /><published>2026-03-28T09:00:00+09:00</published><updated>2026-03-28T09:00:00+09:00</updated><id>https://blog.woonyong.org/github-profile-sync-and-contribution-graph</id><content type="html" xml:base="https://blog.woonyong.org/github-profile-sync-and-contribution-graph/"><![CDATA[<p>이 테마는 GitHub 계정을 연결하면 홈 프로필, 헤더 브랜드 이미지, 브라우저 탭 파비콘, GitHub 링크, 기여 그래프를 자동으로 갱신합니다. 중요한 점은 “연결이 실패해도 화면이 비어 보이지 않게” fallback 구조를 함께 갖고 있다는 것입니다.</p>

<h2 id="어떤-데이터를-가져오나">어떤 데이터를 가져오나</h2>

<p>동기화 스크립트는 두 종류의 캐시를 만듭니다.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">_data/github_profile_cache.json</code>
    <ul>
      <li>이름, 아바타, 프로필 링크, 소개 텍스트</li>
    </ul>
  </li>
  <li><code class="language-plaintext highlighter-rouge">_data/github_contributions_cache.json</code>
    <ul>
      <li>최근 1년 기여 캘린더</li>
    </ul>
  </li>
</ul>

<p>빌드 시점에는 이 캐시 파일만 읽기 때문에, 브라우저에서 토큰이 노출되지 않습니다.</p>

<h2 id="필요한-설정">필요한 설정</h2>

<p><code class="language-plaintext highlighter-rouge">_data/theme.yml</code>에서 아래 두 옵션을 켜면 됩니다.</p>

<div class="language-yml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">hero</span><span class="pi">:</span>
  <span class="na">github_contributions</span><span class="pi">:</span>
    <span class="na">enabled</span><span class="pi">:</span> <span class="no">true</span>
    <span class="na">username</span><span class="pi">:</span> <span class="s">your-github-id</span>

<span class="na">profile</span><span class="pi">:</span>
  <span class="na">github_sync</span><span class="pi">:</span>
    <span class="na">enabled</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">username</code>이 비어 있으면 <code class="language-plaintext highlighter-rouge">_data/profile.yml</code>의 GitHub 링크에서 계정 이름을 유추합니다.</p>

<h2 id="실행-명령">실행 명령</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ruby scripts/fetch_github_contributions.rb
</code></pre></div></div>

<p>인증은 아래 셋 중 하나면 됩니다.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">GITHUB_GRAPHQL_TOKEN</code></li>
  <li><code class="language-plaintext highlighter-rouge">GITHUB_TOKEN</code></li>
  <li><code class="language-plaintext highlighter-rouge">gh auth login</code></li>
</ul>

<h2 id="fallback-규칙">fallback 규칙</h2>

<p>이 테마가 오픈소스 템플릿으로 쓸 만한 이유 중 하나가 바로 이 부분입니다. GitHub 연결이 완벽하지 않아도 화면이 망가지지 않습니다.</p>

<ul>
  <li>GitHub 아바타가 있으면 아바타를 사용</li>
  <li>GitHub 이름이 있으면 표시 이름을 덮어씀</li>
  <li>GitHub <code class="language-plaintext highlighter-rouge">bio</code>가 비어 있으면 <code class="language-plaintext highlighter-rouge">_data/profile.yml</code>의 소개 문구 유지</li>
  <li>잔디 캐시가 없으면 마지막 캐시 또는 기본 화면 사용</li>
</ul>

<p>즉, 사용자 입장에서는 “연결되면 자동으로 좋아지고, 연결이 안 돼도 깨지지 않는” 구조입니다.</p>

<h2 id="jenkins와-함께-쓸-때">Jenkins와 함께 쓸 때</h2>

<p>Jenkins 파이프라인에서는 빌드 전에 이 스크립트를 실행하도록 구성해 두었습니다. 그래서 하루 한 번 빌드를 돌리면 GitHub 프로필과 기여 그래프도 함께 최신 상태로 갱신할 수 있습니다.</p>

<h2 id="동기화가-안-될-때-확인할-것">동기화가 안 될 때 확인할 것</h2>

<ol>
  <li>GitHub username이 실제 계정과 같은지</li>
  <li>토큰 또는 <code class="language-plaintext highlighter-rouge">gh auth login</code>이 준비돼 있는지</li>
  <li>캐시 파일이 생성됐는지</li>
  <li><code class="language-plaintext highlighter-rouge">_data/profile.yml</code> fallback 문구만 보이고 있지는 않은지</li>
</ol>

<p>이 흐름만 이해하면 프로필 동기화는 별도 백엔드 없이도 충분히 안정적으로 운영할 수 있습니다.</p>]]></content><author><name></name></author><category term="GitHub" /><category term="GraphQL" /><category term="Profile Sync" /><category term="Jekyll Theme" /><summary type="html"><![CDATA[GitHub 아이디만 연결하면 이름, 아바타, 링크, 기여 그래프가 홈 화면에 반영되는 흐름과 fallback 규칙을 설명합니다.]]></summary></entry></feed>