Jekyll ๋ธ”๋กœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๋ถ„์„ ๋ณด๊ณ ์„œ

๐Ÿ“‹ ๊ฐœ์š”

๋ณธ ๋ณด๊ณ ์„œ๋Š” Jekyll ๊ธฐ๋ฐ˜ ๋ธ”๋กœ๊ทธ์˜ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ƒ์„ธ ๋ถ„์„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„๋œ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์˜ ์ž‘๋™ ์›๋ฆฌ, ๊ฒ€์ƒ‰ ๊ธฐ์ค€, ๊ทธ๋ฆฌ๊ณ  ํ–ฅํ›„ ๊ฐœ์„  ๋ฐฉ์•ˆ์— ๋Œ€ํ•ด ๋‹ค๋ฃน๋‹ˆ๋‹ค.


๐Ÿ” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ˜„ํ™ฉ

๊ฒ€์ƒ‰ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ

ํ˜„์žฌ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์€ Jekyll์˜ Liquid ํ…œํ”Œ๋ฆฟ์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ 4๊ฐ€์ง€ ๋ฐ์ดํ„ฐ ์†์„ฑ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค:

๊ฒ€์ƒ‰ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ์†์„ฑ ์†Œ์Šค ์ „์ฒ˜๋ฆฌ ๊ณผ์ •
ํฌ์ŠคํŠธ ์ œ๋ชฉ data-title post.title ์†Œ๋ฌธ์ž ๋ณ€ํ™˜, ๊ณต๋ฐฑ ์ œ๊ฑฐ, HTML ์ด์Šค์ผ€์ดํ”„
ํฌ์ŠคํŠธ ๋‚ด์šฉ data-content post.excerpt HTML ํƒœ๊ทธ ์ œ๊ฑฐ, ์ค„๋ฐ”๊ฟˆ ์ œ๊ฑฐ, ์†Œ๋ฌธ์ž ๋ณ€ํ™˜
ํƒœ๊ทธ data-tags post.tags ๊ณต๋ฐฑ์œผ๋กœ ์—ฐ๊ฒฐ, ์†Œ๋ฌธ์ž ๋ณ€ํ™˜
์นดํ…Œ๊ณ ๋ฆฌ data-categories post.categories ๊ณต๋ฐฑ์œผ๋กœ ์—ฐ๊ฒฐ, ์†Œ๋ฌธ์ž ๋ณ€ํ™˜

๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

// ๊ฒ€์ƒ‰ ๋กœ์ง (OR ์กฐ๊ฑด)
const isMatch = title.includes(searchTerm) || 
               content.includes(searchTerm) || 
               tags.includes(searchTerm) ||
               categories.includes(searchTerm);

ํŠน์ง•:

  • ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๋งค์นญ: String.includes() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
  • OR ์กฐ๊ฑด: 4๊ฐœ ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•˜๋ฉด ๊ฒฐ๊ณผ์— ํฌํ•จ
  • ๋Œ€์†Œ๋ฌธ์ž ๋ฌด์‹œ: ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์†Œ๋ฌธ์ž๋กœ ์ •๊ทœํ™”
  • ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰: 300ms ๋””๋ฐ”์šด์‹ฑ ์ ์šฉ

๐Ÿ“Š ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ๋ถ„์„

์žฅ์ 

โœ… ๋น ๋ฅธ ์‘๋‹ต ์†๋„

  • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๊ฒ€์ƒ‰์œผ๋กœ ์„œ๋ฒ„ ์š”์ฒญ ์—†์Œ
  • ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋กœ ์ฆ‰์‹œ ๊ฒฐ๊ณผ ์ œ๊ณต

โœ… ์‚ฌ์šฉ์ž ์นœํ™”์  ์ธํ„ฐํŽ˜์ด์Šค

  • ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์—…๋ฐ์ดํŠธ
  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜ ํ‘œ์‹œ
  • ๊ฒ€์ƒ‰์–ด ์ง€์šฐ๊ธฐ ๊ธฐ๋Šฅ

โœ… ๋‹ค์–‘ํ•œ ๊ฒ€์ƒ‰ ๋ฒ”์œ„

  • ์ œ๋ชฉ, ๋‚ด์šฉ, ํƒœ๊ทธ, ์นดํ…Œ๊ณ ๋ฆฌ ํ†ตํ•ฉ ๊ฒ€์ƒ‰
  • ๋ถ€๋ถ„ ๋งค์นญ์œผ๋กœ ๋†’์€ ๊ฒ€์ƒ‰ ์ •ํ™•๋„

์ œํ•œ์‚ฌํ•ญ

โŒ ๊ฒ€์ƒ‰ ๋ฒ”์œ„ ์ œํ•œ

  • ์ „์ฒด ํฌ์ŠคํŠธ ๋‚ด์šฉ์ด ์•„๋‹Œ excerpt๋งŒ ๊ฒ€์ƒ‰
  • ๊ธด ํฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ๋ˆ„๋ฝ ๊ฐ€๋Šฅ์„ฑ

โŒ ๊ณ ๊ธ‰ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๋ถ€์žฌ

  • AND/NOT ์—ฐ์‚ฐ์ž ๋ฏธ์ง€์›
  • ์ •ํ™•ํ•œ ๊ตฌ๋ฌธ ๊ฒ€์ƒ‰(โ€œ๊ตฌ๋ฌธโ€) ๋ถˆ๊ฐ€
  • ๊ฒ€์ƒ‰์–ด ํ•˜์ด๋ผ์ดํŒ… ์—†์Œ

โŒ ์„ฑ๋Šฅ ํ•œ๊ณ„

  • ํฌ์ŠคํŠธ ์ˆ˜ ์ฆ๊ฐ€ ์‹œ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„ ์ฆ๊ฐ€
  • ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€

๐ŸŽฏ ๊ฒ€์ƒ‰ ์ •ํ™•๋„ ํ‰๊ฐ€

๊ฒ€์ƒ‰ ์‹œ๋‚˜๋ฆฌ์˜ค๋ณ„ ๊ฒฐ๊ณผ

๊ฒ€์ƒ‰์–ด ์˜ˆ์ƒ ๊ฒฐ๊ณผ ์‹ค์ œ ๋™์ž‘ ์ •ํ™•๋„
โ€œwelโ€ โ€œwelcomeโ€ ํฌํ•จ ํฌ์ŠคํŠธ โœ… ์ •์ƒ ๋งค์นญ ๋†’์Œ
โ€œjavascriptโ€ JS ๊ด€๋ จ ํฌ์ŠคํŠธ โœ… ํƒœ๊ทธ/๋‚ด์šฉ ๋งค์นญ ๋†’์Œ
โ€œ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธโ€ ํ•œ๊ธ€ JS ํฌ์ŠคํŠธ โœ… ํ•œ๊ธ€ ์ง€์› ๋†’์Œ
โ€œjs tutorialโ€ ๊ณต๋ฐฑ ํฌํ•จ ๊ฒ€์ƒ‰ โš ๏ธ ๋ถ€๋ถ„ ๋งค์นญ๋งŒ ์ค‘๊ฐ„
โ€"exact phrase"โ€ ์ •ํ™•ํ•œ ๊ตฌ๋ฌธ โŒ ๋ฏธ์ง€์› ๋‚ฎ์Œ

๊ฒ€์ƒ‰ ๋ˆ„๋ฝ ์‚ฌ๋ก€

  1. ๊ธด ํฌ์ŠคํŠธ ๋‚ด์šฉ: excerpt ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๋‚ด์šฉ
  2. ๋ณตํ•ฉ ๊ฒ€์ƒ‰์–ด: โ€œA AND Bโ€ ํ˜•ํƒœ์˜ ์กฐ๊ฑด๋ถ€ ๊ฒ€์ƒ‰
  3. ํŠน์ˆ˜ ๋ฌธ์ž: ์ •๊ทœ์‹ ํŠน์ˆ˜ ๋ฌธ์ž ์ฒ˜๋ฆฌ ๋ฏธํก

๐Ÿš€ ๊ฐœ์„  ๊ถŒ์žฅ์‚ฌํ•ญ

๋‹จ๊ธฐ ๊ฐœ์„  ๋ฐฉ์•ˆ (Low-effort, High-impact)

1. ์ „์ฒด ๋‚ด์šฉ ๊ฒ€์ƒ‰ ์ง€์›

data-content=""

2. ๊ฒ€์ƒ‰์–ด ํ•˜์ด๋ผ์ดํŒ…

function highlightSearchTerm(text, term) {
    return text.replace(new RegExp(term, 'gi'), `<mark>$&</mark>`);
}

3. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ •๋ ฌ

  • ์ œ๋ชฉ ๋งค์นญ > ํƒœ๊ทธ ๋งค์นญ > ๋‚ด์šฉ ๋งค์นญ ์ˆœ์œผ๋กœ ๊ฐ€์ค‘์น˜ ์ ์šฉ

์ค‘๊ธฐ ๊ฐœ์„  ๋ฐฉ์•ˆ (Medium-effort, High-impact)

1. ๊ณ ๊ธ‰ ๊ฒ€์ƒ‰ ์—ฐ์‚ฐ์ž

// AND ๊ฒ€์ƒ‰: "javascript AND tutorial"
// NOT ๊ฒ€์ƒ‰: "javascript NOT beginner"
// ๊ตฌ๋ฌธ ๊ฒ€์ƒ‰: "javascript tutorial"

2. ๊ฒ€์ƒ‰ ์ž๋™์™„์„ฑ

  • ์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด ์ œ์•ˆ
  • ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ์ž๋™์™„์„ฑ

3. ๊ฒ€์ƒ‰ ํžˆ์Šคํ† ๋ฆฌ

  • ์ตœ๊ทผ ๊ฒ€์ƒ‰์–ด ์ €์žฅ (localStorage)
  • ์ž์ฃผ ๊ฒ€์ƒ‰ํ•œ ํ‚ค์›Œ๋“œ ์ œ์•ˆ

์žฅ๊ธฐ ๊ฐœ์„  ๋ฐฉ์•ˆ (High-effort, High-impact)

1. ์ „๋ฌธ ๊ฒ€์ƒ‰ ์—”์ง„ ํ†ตํ•ฉ

  • Algolia DocSearch ์—ฐ๋™
  • Elasticsearch ๊ตฌ์ถ•

2. AI ๊ธฐ๋ฐ˜ ์˜๋ฏธ ๊ฒ€์ƒ‰

  • ์œ ์‚ฌ ์˜๋ฏธ ๊ฒ€์ƒ‰ ์ง€์›
  • ์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ์ถ”์ฒœ

3. ๋‹ค๊ตญ์–ด ๊ฒ€์ƒ‰ ์ตœ์ ํ™”

  • ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ ์ ์šฉ
  • ๋™์˜์–ด ์‚ฌ์ „ ๊ตฌ์ถ•

๐Ÿ“ˆ ๊ตฌํ˜„ ์šฐ์„ ์ˆœ์œ„

Phase 1: ์ฆ‰์‹œ ์ ์šฉ ๊ฐ€๋Šฅ (1-2์ฃผ)

  1. ์ „์ฒด ํฌ์ŠคํŠธ ๋‚ด์šฉ ๊ฒ€์ƒ‰ ๋ฒ”์œ„ ํ™•์žฅ
  2. ๊ฒ€์ƒ‰์–ด ํ•˜์ด๋ผ์ดํŒ… ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  3. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๊ฐ€์ค‘์น˜ ์ •๋ ฌ ๊ตฌํ˜„

Phase 2: ๋‹จ๊ธฐ ๊ฐœ์„  (1๊ฐœ์›”)

  1. AND/OR ๊ฒ€์ƒ‰ ์—ฐ์‚ฐ์ž ์ง€์›
  2. ๊ฒ€์ƒ‰ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ
  3. ๋ชจ๋ฐ”์ผ ์ตœ์ ํ™”

Phase 3: ์žฅ๊ธฐ ๊ณ„ํš (3-6๊ฐœ์›”)

  1. ์™ธ๋ถ€ ๊ฒ€์ƒ‰ ์—”์ง„ ์—ฐ๋™ ๊ฒ€ํ† 
  2. ์„ฑ๋Šฅ ์ตœ์ ํ™” (lazy loading, indexing)
  3. ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ถ„์„ ๋ฐ ๊ฐœ์„ 

๐Ÿ’ก ๊ฒฐ๋ก  ๋ฐ ์ œ์–ธ

ํ˜„์žฌ Jekyll ๋ธ”๋กœ๊ทธ์˜ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์€ ๊ธฐ๋ณธ์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ์ˆ˜์ค€์œผ๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๊ฒ€์ƒ‰์˜ ์žฅ์ ์„ ํ™œ์šฉํ•˜์—ฌ ๋น ๋ฅธ ์‘๋‹ต์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋‚˜, ๊ณ ๊ธ‰ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ๊ณผ ์ •ํ™•๋„ ์ธก๋ฉด์—์„œ ๊ฐœ์„ ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰์‹œ ๊ถŒ์žฅ์‚ฌํ•ญ:

  • ์ „์ฒด ํฌ์ŠคํŠธ ๋‚ด์šฉ ๊ฒ€์ƒ‰ ๋ฒ”์œ„ ํ™•์žฅ
  • ๊ฒ€์ƒ‰์–ด ํ•˜์ด๋ผ์ดํŒ…์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ 
  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋„์ž…

์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ํฌ์ŠคํŠธ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์ „๋ฌธ ๊ฒ€์ƒ‰ ์†”๋ฃจ์…˜ ๋„์ž…์„ ๊ฒ€ํ† ํ•  ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ถ„์„์„ ํ†ตํ•œ ์ง€์†์ ์ธ ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๋ณด๊ณ ์„œ ์ž‘์„ฑ์ผ: 2025๋…„ 6์›” 9์ผ
๋ถ„์„ ๋Œ€์ƒ: Jekyll ๋ธ”๋กœ๊ทธ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ
๋ฌธ์„œ ๋ฒ„์ „: v1.0