Gatsby: yaml ํŒŒ์ผ์„ ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€

์— ๋งŒ๋“  2017๋…„ 11์›” 06์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: gatsbyjs/gatsby

์•ˆ๋…•ํ•˜์„ธ์š”, yaml ํŽ˜์ด์ง€ ๋‚ด์—์„œ ๋งˆํฌ๋‹ค์šด์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? jekyll์—์„œ gatsby๋กœ ์ „ํ™˜์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ jekyll์˜ ์ข‹์€ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” markdownify ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๋ฌธ์ž์—ด(์˜ˆ: yaml ํŒŒ์ผ์—์„œ)์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ๋™ ํ…œํ”Œ๋ฆฟ ์–ธ์–ด ์˜€์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŽ˜์ด์ง€์— ๊ตฌ์กฐํ™”๋˜๊ธฐ๋ฅผ ์›ํ–ˆ์ง€๋งŒ yaml ํŒŒ์ผ์— ํ•จ๊ป˜ ์ •๋ฆฌ๋œ ์ •๋ณด๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ ์œ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

- title: My Title
  image: ./assets/image.png
  description: >
    Here is a long winded description that includes a [link](https://code-somewhere.com).
- title: Second Item
  image: ./assets/image2.png
  description >
    more text ...

๋น„์Šทํ•œ ์ฐธ๊ณ ๋กœ, ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ•ดํ‚ค ์†”๋ฃจ์…˜์ด ์žˆ์ง€๋งŒ webpack์ด pages/ ์ด๋ฏธ์ง€๋ฅผ ๋ณต์‚ฌํ•˜๋„๋ก ์•Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๋ฏธ์ง€์—์„œ gatsby-source-filesystem + gatsby-transformer-yaml + gatsby-transformer-sharp/gatsby-plugin-sharp๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด gatsbyjs.org๊ฐ€ ์ž‘์„ฑ์ž ์•„๋ฐ”ํƒ€๋ฅผ ์ฟผ๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐธ์กฐํ•˜์„ธ์š”.

https://github.com/gatsbyjs/gatsby/blob/master/www/src/templates/template-blog-post.js#L306 & https://github.com/gatsbyjs/gatsby/blob/master/docs/ ๋ธ”๋กœ๊ทธ/์ €์ž.yaml

๋งˆํฌ๋‹ค์šด์„ ํ†ตํ•ด yaml ํ•„๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ โ€” ๋ฏธ๋””์–ด ์œ ํ˜•์„ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ์ง€์ •ํ•˜๋Š” ํ•˜์œ„ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด gatsby-transformer-remark๊ฐ€ ์ด๋ฅผ html๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: https://github.com/gatsbyjs/gatsby/blob/d855150dadb91e80b836d2bd5e1405e2a8). /gatsby-source-contentful/src/normalize.js#L143

๊ทธ๊ฒƒ์ด ๋งค์šฐ ๋†’์€ ์ˆ˜์ค€์ด๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. Gatsby๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์‚ฌ๋žŒ๋“ค์€ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ž๋™์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ณ ๊ธ‰ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์ง yaml => markdown => html์— ๋Œ€ํ•ด ์•„๋Š” ์‚ฌ๋žŒ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด Gatsby์˜ ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ดํŽด๋ณด๊ณ  ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

์ด๋ฏธ์ง€์—์„œ gatsby-source-filesystem + gatsby-transformer-yaml + gatsby-transformer-sharp/gatsby-plugin-sharp๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด gatsbyjs.org๊ฐ€ ์ž‘์„ฑ์ž ์•„๋ฐ”ํƒ€๋ฅผ ์ฟผ๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐธ์กฐํ•˜์„ธ์š”.

https://github.com/gatsbyjs/gatsby/blob/master/www/src/templates/template-blog-post.js#L306 & https://github.com/gatsbyjs/gatsby/blob/master/docs/ ๋ธ”๋กœ๊ทธ/์ €์ž.yaml

๋งˆํฌ๋‹ค์šด์„ ํ†ตํ•ด yaml ํ•„๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ โ€” ๋ฏธ๋””์–ด ์œ ํ˜•์„ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ์ง€์ •ํ•˜๋Š” ํ•˜์œ„ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด gatsby-transformer-remark๊ฐ€ ์ด๋ฅผ html๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: https://github.com/gatsbyjs/gatsby/blob/d855150dadb91e80b836d2bd5e1405e2a8). /gatsby-source-contentful/src/normalize.js#L143

๊ทธ๊ฒƒ์ด ๋งค์šฐ ๋†’์€ ์ˆ˜์ค€์ด๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. Gatsby๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์‚ฌ๋žŒ๋“ค์€ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ž๋™์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ณ ๊ธ‰ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์ง yaml => markdown => html์— ๋Œ€ํ•ด ์•„๋Š” ์‚ฌ๋žŒ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด Gatsby์˜ ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ดํŽด๋ณด๊ณ  ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์กฐ์–ธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €๋Š” ์ง€๊ธˆ ๋ณธ์งˆ์ ์œผ๋กœ gatsby ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“œ๋Š” ๋ฐ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์ง„ํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

import data from './_data.yaml'
import markdownIt from 'markdown-it'
const md = markdownIt({
  html: true,
  linkify: true
})
const loadedData = data.map(item => ({
  ...item,
  image: item.image && require(item.image),
  description: md.render(item.description)
}))

์ด๊ฒƒ์€ ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‚ด ๋ชฉ์ ์— ๋งž๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” graphql์ด ๋จผ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์— ์œ ์‚ฌํ•œ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ '๋ชจ๋“ˆ' ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
```
ํŽ˜์ด์ง€/
ํ•œ ํŽ˜์ด์ง€/
index.js
_data.yml
์ž์‚ฐ/
img1.png
๋‹ค๋ฅธ ํŽ˜์ด์ง€/
...

์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ onCreateNode๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆํฌ๋‹ค์šด ํ•„๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://www.gatsbyjs.org/tutorial/part-four/#programmatically -creating-pages-from-data ํ•˜๊ณ  ์ปดํŒŒ์ผ๋œ ํ•„๋“œ๋ฅผ createNodeField ์žˆ๋Š” ์ƒˆ ํ•„๋“œ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋‹น์‹ ์˜ gatsby-node.js์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰