Front-end/Good Front

๐Ÿ“ gray-matter: Markdown ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋งˆ๋ฒ• ๋„๊ตฌ

xeunnie 2025. 3. 5. 01:00
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“ gray-matter: Markdown ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋งˆ๋ฒ• ๋„๊ตฌ

 

Markdown์„ ํ™œ์šฉํ•ด ๋ธ”๋กœ๊ทธ๋‚˜ ์ •์  ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์ธ๋ฐ์š”. ์—ฌ๊ธฐ์„œ ๋“ฑ์žฅํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ gray-matter์ž…๋‹ˆ๋‹ค. gray-matter๋Š” Markdown ํŒŒ์ผ์˜ **ํ”„๋ก ํŠธ๋งคํ„ฐ(frontmatter)**๋ฅผ ์ฝ๊ณ , ์ด๋ฅผ ํŒŒ์‹ฑ(parse)ํ•˜์—ฌ JSON ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฉ‹์ง„ ๋„๊ตฌ์˜ˆ์š”. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” gray-matter๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

 

1. gray-matter๋ž€?

 

โœจ “Markdown ํŒŒ์ผ์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ”

 

gray-matter๋Š” **Markdown ํŒŒ์ผ ์ƒ๋‹จ์— ์ž‘์„ฑ๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(frontmatter)**๋ฅผ JavaScript ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋ก ํŠธ๋งคํ„ฐ๋Š” YAML, JSON ๋˜๋Š” ๊ธฐํƒ€ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ๋˜๋ฉฐ, ์ œ๋ชฉ, ๋‚ ์งœ, ํƒœ๊ทธ์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“‹ ์™œ ํ•„์š”ํ• ๊นŒ?

1. ๋ธ”๋กœ๊ทธ๋‚˜ CMS์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ:

๊ธ€ ์ œ๋ชฉ, ์ž‘์„ฑ ๋‚ ์งœ, ํƒœ๊ทธ ๋“ฑ์„ Markdown ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ด ๊ด€๋ฆฌ.

2. ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ๊ธฐ์—์„œ ์ฝ˜ํ…์ธ  ๋ฐ์ดํ„ฐ ํŒŒ์‹ฑ:

Gatsby, Next.js, Hugo์™€ ๊ฐ™์€ ํˆด๊ณผ ๊ฒฐํ•ฉ.

3. ์œ ์—ฐํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ œ๊ณต:

YAML, JSON, TOML ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•์‹ ์ง€์›.

 

2. ํ”„๋ก ํŠธ๋งคํ„ฐ(Frontmatter)๋ž€?

 

ํ”„๋ก ํŠธ๋งคํ„ฐ๋Š” Markdown ํŒŒ์ผ์˜ ์ƒ๋‹จ์— ์ถ”๊ฐ€๋˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ YAML ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ–‹๏ธ YAML ๊ธฐ๋ฐ˜ ํ”„๋ก ํŠธ๋งคํ„ฐ ์˜ˆ์‹œ

 

---

title: "gray-matter๋ž€ ๋ฌด์—‡์ธ๊ฐ€?"

date: "2025-01-17"

tags:

  - JavaScript

  - Markdown

summary: "gray-matter๋ฅผ ํ™œ์šฉํ•ด Markdown์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ด…์‹œ๋‹ค."

---

# gray-matter๋ฅผ ํ™œ์šฉํ•ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ถ”์ถœํ•˜๊ธฐ

์ด ๊ธ€์€ gray-matter๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ–‹๏ธ JSON ๊ธฐ๋ฐ˜ ํ”„๋ก ํŠธ๋งคํ„ฐ ์˜ˆ์‹œ

 

{

  "title": "gray-matter๋ž€ ๋ฌด์—‡์ธ๊ฐ€?",

  "date": "2025-01-17",

  "tags": ["JavaScript", "Markdown"],

  "summary": "gray-matter๋ฅผ ํ™œ์šฉํ•ด Markdown์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ด…์‹œ๋‹ค."

}

---

# gray-matter๋ฅผ ํ™œ์šฉํ•ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ถ”์ถœํ•˜๊ธฐ

์ด ๊ธ€์€ gray-matter๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

 

3. gray-matter ์„ค์น˜ ๋ฐ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

 

๐Ÿ› ๏ธ ์„ค์น˜

 

npm install gray-matter

 

๐Ÿ“š ์‚ฌ์šฉ๋ฒ•

 

Markdown ํŒŒ์ผ์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ณธ๋ฌธ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

 

Markdown ํŒŒ์ผ (example.md)

 

---

title: "gray-matter ์‹œ์ž‘ํ•˜๊ธฐ"

author: "์ตœ์Šน์€"

date: "2025-01-17"

tags:

  - JavaScript

  - Markdown

---

Markdown์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? gray-matter๊ฐ€ ๋„์™€๋“œ๋ฆด๊ฒŒ์š”!

 

JavaScript ์ฝ”๋“œ

 

const fs = require('fs');

const matter = require('gray-matter');

 

// Markdown ํŒŒ์ผ ์ฝ๊ธฐ

const fileContent = fs.readFileSync('./example.md', 'utf8');

 

// gray-matter๋กœ ํŒŒ์‹ฑ

const parsed = matter(fileContent);

 

console.log(parsed.data); // ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

console.log(parsed.content); // Markdown ๋ณธ๋ฌธ

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

 

// parsed.data

{

  title: "gray-matter ์‹œ์ž‘ํ•˜๊ธฐ",

  author: "์ตœ์Šน์€",

  date: "2025-01-17",

  tags: ["JavaScript", "Markdown"]

}

 

// parsed.content

"Markdown์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? gray-matter๊ฐ€ ๋„์™€๋“œ๋ฆด๊ฒŒ์š”!"

 

4. gray-matter์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

 

๐Ÿ” 1) ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœ

 

ํŠน์ • ์ƒํ™ฉ์—์„œ๋Š” Markdown์˜ ๋ณธ๋ฌธ์„ ๋ฌด์‹œํ•˜๊ณ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

const { data } = matter(fileContent);

console.log(data); // ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ์ถœ๋ ฅ

 

๐Ÿ”ง 2) ๋‹ค์–‘ํ•œ ํ”„๋ก ํŠธ๋งคํ„ฐ ํ˜•์‹ ์ง€์›

 

gray-matter๋Š” YAML๋ฟ ์•„๋‹ˆ๋ผ JSON, TOML ํ˜•์‹๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

const { data } = matter(fileContent, {

  engines: {

    toml: require('toml'),

  },

});

 

๐Ÿ–Š๏ธ 3) ํ”„๋ก ํŠธ๋งคํ„ฐ๋ฅผ ๋™์ ์œผ๋กœ ์ž‘์„ฑ

 

Markdown ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

const updatedContent = matter.stringify('๋ณธ๋ฌธ ๋‚ด์šฉ', {

  title: '์ƒˆ๋กœ์šด ๊ธ€',

  author: '์ตœ์Šน์€',

  date: '2025-01-17',

});

console.log(updatedContent);

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ:

 

---

title: "์ƒˆ๋กœ์šด ๊ธ€"

author: "์ตœ์Šน์€"

date: "2025-01-17"

---

๋ณธ๋ฌธ ๋‚ด์šฉ

 

5. gray-matter ์‹ค์ „ ํ™œ์šฉ ์˜ˆ์ œ

 

๐ŸŽฏ Next.js์—์„œ ๋ธ”๋กœ๊ทธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

 

gray-matter๋Š” Next.js์™€ ๊ฐ™์€ ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ๊ธฐ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

import fs from 'fs';

import path from 'path';

import matter from 'gray-matter';

 

// Markdown ํŒŒ์ผ ์ฝ๊ธฐ

export const getPosts = () => {

  const files = fs.readdirSync(path.join('posts'));

 

  return files.map((filename) => {

    const fileContent = fs.readFileSync(path.join('posts', filename), 'utf8');

    const { data, content } = matter(fileContent);

 

    return {

      metadata: data,

      content,

    };

  });

};

 

6. gray-matter์™€ ํ•จ๊ป˜ ์“ฐ์ด๋Š” ๋„๊ตฌ

1. Markdown-it: Markdown ํŒŒ์‹ฑ.

2. remark/rehype: Markdown๊ณผ HTML ์ฒ˜๋ฆฌ.

3. Next.js, Gatsby: ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ๊ธฐ.

4. Contentlayer: CMS ๋ฐ์ดํ„ฐ๋ฅผ ํƒ€์ž…์„ธ์ดํ”„ํ•˜๊ฒŒ ๊ด€๋ฆฌ.

 

7. gray-matter์˜ ์žฅ๋‹จ์ 

 

๐Ÿ‘ ์žฅ์ 

๋‹ค์–‘ํ•œ ํ”„๋ก ํŠธ๋งคํ„ฐ ํ˜•์‹ ์ง€์›.

๊ฐ„๋‹จํ•œ API๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ถ”์ถœ.

Markdown ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์™€ ๋†’์€ ํ˜ธํ™˜์„ฑ.

 

๐Ÿ‘Ž ๋‹จ์ 

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ณธ๋ฌธ์ด ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ ๊ฐ€๋Šฅ.

๋งค์šฐ ํฐ ํŒŒ์ผ์—์„œ ์„ฑ๋Šฅ ์ด์Šˆ ๋ฐœ์ƒ ๊ฐ€๋Šฅ.

 

๊ฒฐ๋ก 

 

gray-matter๋Š” Markdown์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋กœ, ๋ธ”๋กœ๊ทธ, ๋ฌธ์„œํ™”, ์ •์  ์‚ฌ์ดํŠธ ๋“ฑ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Markdown ํŒŒ์ผ์˜ ํ”„๋ก ํŠธ๋งคํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, gray-matter๋ฅผ ํ™œ์šฉํ•ด๋ณด์„ธ์š”.

 

๐ŸŒท์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น!๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•