๐Ÿ“˜ [GithubPages] Jekyll hydejack ํƒœ๊ทธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ - 8

๐Ÿ“˜ [GithubPages] Jekyll hydejack ํƒœ๊ทธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ - 8

[GithubPages] Jekyll hydejack ํƒœ๊ทธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€



๐Ÿ“ ํƒœ๊ทธ(Tag)์˜ ๋ชฉ์ ๊ณผ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•


๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ๋ฅผ ์šด์˜ํ•˜๋ฉด์„œ ๊ธ€์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก, ๊ธ€๋“ค์„ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์ฐพ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋œ๋‹ค.
์ด๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๋Š” ๊ธฐ๋Šฅ์ด ๋ฐ”๋กœ ์นดํ…Œ๊ณ ๋ฆฌ(Category) ์™€ ํƒœ๊ทธ(Tag) ์ด๋‹ค.


โœ… ์™œ ํƒœ๊ทธ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?


์นดํ…Œ๊ณ ๋ฆฌ๋Š” ๋น„๊ต์  ํฐ ๋ฒ”์ฃผ๋กœ ๊ธ€์„ ๋‚˜๋ˆ„๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด Dev, Study ๊ฐ™์€ ํฐ ์ฃผ์ œ๋ฅผ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋‚˜๋ˆˆ๋‹ค.

๊ทธ์— ๋ฐ˜ํ•ด, ํƒœ๊ทธ๋Š” ๋” ์œ ์—ฐํ•˜๊ณ  ์„ธ๋ถ€์ ์ธ ๋ถ„๋ฅ˜๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

์˜ˆ์‹œ:

  • React๋Š” Dev ์นดํ…Œ๊ณ ๋ฆฌ์— ํฌํ•จ๋˜์ง€๋งŒ, ๋™์‹œ์— Frontend, JSX, SPA ๋“ฑ ๋‹ค์–‘ํ•œ ๊ด€์ ์œผ๋กœ ํƒœ๊น…๋  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ๊ธ€์— ์—ฌ๋Ÿฌ ํƒœ๊ทธ๋ฅผ ๋ถ™์—ฌ ๋‹ค์–‘ํ•œ ํ‚ค์›Œ๋“œ๋กœ ์—ฐ๊ฒฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ํƒœ๊ทธ๋Š” ๊ธ€ ๊ฐ„์˜ ์—ฐ๊ด€์„ฑ์„ ๊ฐ€๋ณ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋งํฌ ์—ญํ• ์„ ํ•œ๋‹ค.


โœ ํƒœ๊ทธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

โœ… ํฌ์ŠคํŠธ์— ํƒœ๊ทธ ์ถ”๊ฐ€ํ•˜๊ธฐ


๊ธ€์˜ ์ƒ๋‹จ Front Matter์— tags ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

---
layout: post
title: react
image: 
  path: /assets/img/blog/blog-basic.jpg
categories: [dev, react]
tags: [react, web]
description: >
  A page showing Hydejack-specific markdown content.  
---

โœ… ๊ฐ ํƒœ๊ทธ์— ๋Œ€ํ•ด ๊ฐœ๋ณ„ ํŽ˜์ด์ง€ ์ƒ์„ฑ


_featured_tags ํด๋” ์•ˆ์— ๊ฐ ํƒœ๊ทธ์— ๋Œ€ํ•ด ๊ฐœ๋ณ„ ํŽ˜์ด์ง€ ์ƒ์„ฑํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด react, web ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด react.md, web.md ์ฒ˜๋Ÿผ ํƒœ๊ทธ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์ƒ์„ฑํ•œ๋‹ค.

---
layout: tag-list
type: tag
title: React
slug: react
sidebar: true
description: >
  about React
---

โœ… ํƒœ๊ทธ ๋ชฉ๋ก์—์„œ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์—ฐ๊ฒฐ


ํƒœ๊ทธ ๋งํฌ๋ฅผ ์„ ํƒํ–ˆ์„๋–„ ํƒœ๊ทธ์™€ ๊ด€๋ จ๋œ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค„์ˆ˜ ์žˆ๋Š” _layout/tag-list.html ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ ๋‹ค. list.html ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๋งŒ๋“ค๋ฉด๋œ๋‹ค.

---
layout: page
---

{%include components/pagination.html %}
{{ content }}

{% assign posts = site.tags[page.slug] %}

{% assign date_formats  = site.data.strings.date_formats               %}
{% assign list_group_by = date_formats.list_group_by | default:"%Y"    %}
{% assign list_entry    = date_formats.list_entry    | default:"%d %b" %}

{% for post in posts %}
  {% assign currentdate = post.date | date:list_group_by %}
  {% if currentdate != date %}
    {% unless forloop.first %}</ul>{% endunless %}
    <h2 id="{{ list_group_by | slugify }}-{{ currentdate | slugify }}" class="hr">{{ currentdate }}</h2>
    <ul class="related-posts">
    {% assign date = currentdate %}
  {% endif %}
  {% include components/post-list-item.html post=post format=list_entry %}
  {% if forloop.last %}</ul>{% endif %}
{% endfor %}

Hydejack ํ…Œ๋งˆ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒœ๊ทธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด์ œ ๊ธฐ๋ณธ์ ์ธ ํƒœ๊ทธ ์…‹ํŒ…์€ ๋๋‚ฌ๋‹ค. ์•„๊นŒ ์ฒ˜์Œ์— ๋งํ•œ ๊ธ€์˜ ์ƒ๋‹จ Front Matter ํƒœ๊ทธ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒŒ์‹œ๋ฌผ์— ๋“ค์–ด๊ฐ€๋ณด๋ฉด ์ƒ๋‹จ์— ํƒœ๊ทธ ๋ชฉ๋ก(#React, #Web)์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค.


โœ ํƒœ๊ทธ ๋ชฉ๋ก ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ

์ด ํƒœ๊ทธ ํŽ˜์ด์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„๋˜์—ˆ๋‹ค:

  • ๊ธ€ ์ˆ˜๊ฐ€ ๋งŽ์•„์กŒ์„ ๋•Œ, ์ฃผ์ œ๋ณ„๋กœ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋Šฅ
  • ๋ธ”๋กœ๊ทธ ํƒ์ƒ‰์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ UI ๊ฐœ์„ 
  • ์‚ฌ์ด๋“œ๋ฐ” ๋ฉ”๋‰ด์— Tags๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  /tags/ ํŽ˜์ด์ง€์—์„œ ์ „์ฒด ํƒœ๊ทธ ๋ชฉ๋ก์„ ๊น”๋”ํ•˜๊ณ  ๊ทธ๋ฆฌ๋“œ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

โœ… 1๋‹จ๊ณ„: ์‚ฌ์ด๋“œ๋ฐ” ๋ฉ”๋‰ด ์ˆ˜์ •


_config.yml์˜ menu: ํ•ญ๋ชฉ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•œ๋‹ค.

menu:
  - title: Dev
    url: /dev/
    submenu:
      - title: Spring
        url: /spring/
      - title: React
        url: /react/
  - title: Study
    url: /study/
    submenu:
      - title: Algorithm
        url: /algorithm/
      - title: Data Structure
        url: /ds/
      - title: ETC
        url: /etc/
  - title: Tags    # โ† ์—ฌ๊ธฐ๋ฅผ ์ถ”๊ฐ€
    url: /tags/
  - title: About
    url: /about/


โœ… 2๋‹จ๊ณ„: /tags/ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ


  • tags.md _pages ํด๋” ์•ˆ์— ์ƒ์„ฑ
  • ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์ธ์‹ ๋˜์ง€๋งŒ _pages ํด๋” ์•ˆ์— ๋„ฃ์–ด์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์œผ๋ฉด
  • _config.yml ์—์„œ collections์— pages ์ถ”๊ฐ€
# file: '_config.yml'
collections:
  pages:
    output: true
    permalink: /:name/
  • ์ œ๋ชฉ์€ โ€œTagsโ€
  • ์ฃผ์†Œ๋Š” https://๋‚ด๋ธ”๋กœ๊ทธ์ฃผ์†Œ/tags/ ์ ‘์† ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •
---
layout: sidebar-tags
title: "Tags"
permalink: /tags/
---

sidebar-tags.html ํŒŒ์ผ์„ _layout ํด๋”์— ์ƒ์„ฑ

---
layout: default
---

{% assign tag_titles = site.data.tag_titles %}
{% assign tag_slugs = site.data.tag_slugs %}
{% assign sorted_tags = site.tags | sort %}

<h1 class="page-title">Tags</h1>
<div class="tag-grid">
    {% for tag in sorted_tags %}
    {% assign tag_name = tag[0] %}
    {% assign title = tag_titles[tag_name] | default: tag_name %}
    {% assign slug = tag_slugs[tag_name] | default: tag_name | slugify %}

    <a href="/tag-{{ slug }}/" class="tag-box">
        <span class="tag-name">#{{ title }}</span>
        <span class="tag-count">{{ tag[1].size }}</span>
    </a>
    {% endfor %}
</div>
<p class="faded fine" style="margin-top: 2rem;">
	์›ํ•˜๋Š” ์ฃผ์ œ์˜ ํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ๊ธ€ ๋ชฉ๋ก์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
</p>

  • _data/tag_titles.yml: ํƒœ๊ทธ์˜ ํ‘œ์‹œ ์ด๋ฆ„(title) ๋งคํ•‘
  • {% assign sorted_tags = site.tags | sort %}
  • Jekyll์˜ site.tags๋Š” ๋ชจ๋“  ํƒœ๊ทธ์™€ ํ•ด๋‹น ๊ธ€ ๋ชฉ๋ก์„ ๋‹ด๊ณ  ์žˆ์Œ
  • ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์„œ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•จ

โœ… 3๋‹จ๊ณ„ (์„ ํƒ): tag_titles.yml ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ


ํ˜„์žฌ ์„ค์ •๋œ ํƒœ๊ทธ๋“ค์€ ์˜์†Œ๋ฌธ์ž๋กœ ์ถœ๋ ฅ์„ ์›ํ•˜๋ฉด 3๋‹จ๊ณ„๋Š” ๊ฑด๋„ˆ๋„์–ด๋„ ๋œ๋‹ค.. ๋‚˜๋Š” ํ™”๋ฉด์— ๋ณด์—ฌ์ค„๋• ๋Œ€๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๊ธธ ์›ํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด algorithm์„ Algorithm์œผ๋กœ ํ‘œํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ํƒœ๊ทธ title ๋งคํ•‘์„ ํ•˜๊ธฐ์œ„ํ•ด _data/tag_titles.yml ์ƒ์„ฑํ•œ๋‹ค.

# file: _data/tag_titles.yml
algorithm: Algorithm
git: Git
data-structure: Data Structure
react: React
spring: Spring
web: Web
codingtest: CodingTest
jekyll: Jekyll
markdown: Markdown

๐Ÿ’ก ํƒœ๊ทธ ์ •๋ฆฌ ํŒ

  • ๊ฐ€๋Šฅํ•œ ํ•œ ์งง๊ณ  ๋ช…ํ™•ํ•œ ๋‹จ์–ด๋กœ ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ ๋‹ค.
    • ์˜ˆ: data-structure๋ณด๋‹ค๋Š” ds, algorithm์„ ํƒœ๊ทธ๋กœ
  • ์ค‘๋ณต/์œ ์‚ฌ ํƒœ๊ทธ ๋ฐฉ์ง€ (์˜ˆ: React, react, ReactJS๋ฅผ ํ•˜๋‚˜๋กœ ํ†ต์ผ)
  • ํƒœ๊ทธ๋Š” ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ์ด์ž ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „๋žต์ ์œผ๋กœ ๊ด€๋ฆฌํ• ์ˆ˜๋ก ๋ธ”๋กœ๊ทธ ํƒ์ƒ‰์ด ์‰ฌ์›Œ์ง„๋‹ค.

โœ… 4๋‹จ๊ณ„: ์Šคํƒ€์ผ ์ถ”๊ฐ€ (my-style.scss)


css ์Šคํƒ€์ผ์ ์ธ ๋ถ€๋ถ„์€ ๋Œ€๋ถ€๋ถ„ ์ฑ—gpt์— ์š”์ฒญ์„ ํ–ˆ๋‹ค..๐Ÿคฃ

.tag-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 1rem;
  margin-top: 2rem;
}

.tag-box {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0.75rem 1rem;
  border: 1px solid var(--border);
  border-radius: 0.75rem;
  text-decoration: none;
  color: var(--text);
  background: var(--bg);
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
  transition: 0.2s ease-in-out;
}

.tag-box:hover {
  background-color: var(--highlight);
  color: var(--accent);
  transform: scale(1.02);
}

.tag-name {
  font-weight: bold;
}

.tag-count {
  font-size: 0.9rem;
  color: var(--text-light);
}

์™„์„ฑ๋œ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. ํƒœ๊ทธ๊ฐ€ ๋งŽ์ง€ ์•Š์•„์„œ ์•„๋žซ์ชฝ ๋นˆ ๊ณต๊ฐ„์ด ๋งŽ์ด ๋‚จ๋Š”๋‹ค. ๋‚จ๋Š” ๋ถ€๋ถ„์€ ์ž์œ ๋กญ๊ฒŒ ์›ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ตœ๊ทผ ๊ฒŒ์‹œ๋ฌผ ์ถ”๊ฐ€, ํƒœ๊ทธ ์„ค๋ช… ์•ˆ๋‚ด๋ฌธ๊ตฌ?, ์ธ๊ธฐ ํƒœ๊ทธ(GA(Google Analytics)์™€ ์—ฐ๋™ํ•ด์„œ ์ž๋™ํ™” ๊ฐ€๋Šฅ), ๋žœ๋ค ๊ธ€ ๋ณด๊ธฐ, ๋Œ“๊ธ€์ฐฝ ๋“ฑ๋“ฑ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

Search ํŽ˜์ด์ง€์—๋„ ๋นˆ๊ณต๊ฐ„์ด ๋‚จ์•„์„œ ํƒœ๊ทธ ๋ชฉ๋ก์„ ๋„ฃ์–ด์คฌ๋‹ค. Pages ๋ถ€๋ถ„์„ ๊ฑท์–ด๋‚ด๊ณ  ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

# file: 'default.html'

{% assign tag_titles = site.data.tag_titles %}
  {% assign sorted_tags = site.tags | sort %}
  
  <h2 class="hr-bottom">{{ strings.tags | default: "Tags" }}</h2>
  <div class="tag-grid">
    {% for tag in sorted_tags %}
    {% assign tag_name = tag[0] %}
    {% assign title = tag_titles[tag_name] | default: tag_name %}
    {% assign slug = tag_name %}
  
    <a href="/tag-{{ slug }}/" class="tag-box">
      <span class="tag-name">{{ title }}</span>
      <span class="tag-count">({{ tag[1].size }})</span>
    </a>
    {% endfor %}
  </div>
  <p class="faded fine" style="margin-top: 2rem;">
    ์›ํ•˜๋Š” ์ฃผ์ œ์˜ ํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ๊ธ€ ๋ชฉ๋ก์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  </p>

์งœ์ž” ์™„์„ฑ โ˜บ๏ธ


๐Ÿ“˜ ๋งˆ๋ฌด๋ฆฌ

๋‚ด๊ฐ€ ๋ธ”๋กœ๊ทธ์— ํƒœ๊ทธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  • ๊ธ€์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ์ •๋ฆฌ์™€ ๊ฒ€์ƒ‰์ด ์–ด๋ ค์›Œ์ง€๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.
  • ๋…์ž์—๊ฒŒ๋„, ๋‚˜์—๊ฒŒ๋„ ๋น ๋ฅด๊ฒŒ ๊ด€๋ จ ๊ธ€์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์—ฐ๊ฒฐ ํ†ต๋กœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์•ž์œผ๋กœ ๊ธ€์ด ๋” ๋งŽ์•„์งˆ์ˆ˜๋ก, ํƒœ๊ทธ๋Š” ๋ธ”๋กœ๊ทธ์˜ ์ค‘์š”ํ•œ ์ •๋ณด ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

Pagination


ยฉ 2025. All rights reserved.

Powered by Hydejack v9.2.1