Gatsby: GraphQL ์˜ค๋ฅ˜ ์•Œ ์ˆ˜ ์—†๋Š” ์ธ์ˆ˜ `slug`

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

์•ˆ๋…• ๋ชจ๋‘๋“ค. ๊ณ ๊ธ‰ ์Šคํƒ€ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ˜ํ…์ธ ๋ฅผ ๋ธ”๋กœ๊ทธ์— ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฏน์Šค์—์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊บผ๋‚ด๊ณ  ์ƒ˜ํ”Œ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ GraphQL Error Unknown argument slug ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

exports.createPages = ({ graphql, boundActionCreators }) => {
  const { createPage } = boundActionCreators
  return new Promise((resolve, reject) => {
    graphql(
      `
      {
        allContentfulBlogPost(limit: 1000) {
          edges {
            node {
              id
              slug
            }
          }
        }
      }
    `
    )
      .then(result => {
        if (result.errors) {
          reject(result.errors)
        }
        const postPage = path.resolve("src/templates/post.jsx");
        _.each(result.data.allContentfulBlogPost.edges, edge => {
          console.log(edge.node);

          createPage({
            path: `/post/${edge.node.slug}`,
            component: postPage,
            context: {
              id: edge.node.id,
              slug: edge.node.slug
            },
          })
        })
      })
      .then(resolve)
  })
}

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด ์‹ค์ œ ์‚ฌํ›„ ๊ตฌ์„ฑ ์š”์†Œ graphQL ์ฟผ๋ฆฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” "์Šฌ๋Ÿฌ๊ทธ"๋ฅผ ํฌํ•จํ•˜๋„๋ก ์ปจํ…์ŠคํŠธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์ฝ˜์†” ์ถœ๋ ฅ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Fetch Contentful data: 404.350ms
success source and transform nodes โ€” 0.552 s
success building schema โ€” 0.548 s
success createLayouts โ€” 0.055 s
โ  /xxxxxxx/src/templates/post.jsx
{ id: 'c7juaTIcg6cW2wAGKCQuios', slug: 'test-post' }
success createPages โ€” 0.061 s
success createPagesStatefully โ€” 0.023 s
GraphQL Error Unknown argument `slug`

  file: /Users/joshuaweaver/Documents/JoyfulNoise/joyfulnoiseliving/src/templates/post.jsx

   1 |
   2 |   query BlogPostBySlug($slug: String!) {
>  3 |     allContentfulBlogPost(slug: { eq: $slug }) {
     |                           ^
   4 |       title
   5 |       slug
...

์ €๋Š” GraphQL์„ ์ฒ˜์Œ ์ ‘ํ–ˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ๋ถ„๋ช…ํ•œ ๊ฒƒ์„ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ค‘ ํŠน์ดํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ฐพ์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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

์•„ ๋งž๋‹ค, ๊ทธ ์ฟผ๋ฆฌ๋Š” ํ†ตํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์— ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— Graph i QL์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

"all"์€ ์œ ํ˜•์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ฟผ๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ์—†์œผ๋ฉด ๋‹จ์ผ ํ•ญ๋ชฉ์„ ์ฟผ๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋…ธ๋“œ์— ์Šฌ๋Ÿฌ๊ทธ๊ฐ€ ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

2017๋…„ 9์›” 10์ผ ์ผ์š”์ผ ์˜ค์ „ 7์‹œ 17๋ถ„์— Josh Weaver [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…• ๋ชจ๋‘๋“ค. ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ˜ํ…์ธ ๋ฅผ ๋ธ”๋กœ๊ทธ์— ์—ฐ๊ฒฐํ•˜๋ ค๊ณ 
๊ธฐ๋™๊ธฐ. ๋ฏน์Šค์—์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊บผ๋‚ด์„œ ์‹œ๋„ ์ค‘์ž…๋‹ˆ๋‹ค.
์ƒ˜ํ”Œ ํฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ๋ฐ›๊ณ  ์žˆ๋Š”
์˜ค๋ฅ˜ GraphQL ์˜ค๋ฅ˜ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹œ์ž‘ ์‹œ ์•Œ ์ˆ˜ ์—†๋Š” ์ธ์ˆ˜ ์Šฌ๋Ÿฌ๊ทธ์ž…๋‹ˆ๋‹ค.

export.createPages = ({ graphql, boundActionCreators }) => {
const { createPage } = boundActionCreators
return new Promise((ํ•ด๊ฒฐ, ๊ฑฐ๋ถ€) => {
๊ทธ๋ž˜ํ”„ql(
{ allContentfulBlogPost(limit: 1000) { edges { node { id slug } } } }
)
.then(๊ฒฐ๊ณผ => {
if (๊ฒฐ๊ณผ.์˜ค๋ฅ˜) {
๊ฑฐ๋ถ€(๊ฒฐ๊ณผ.์˜ค๋ฅ˜)
}
const postPage = path.resolve("src/ํ…œํ”Œ๋ฆฟ/post.jsx");
_.each(result.data.allContentfulBlogPost.edges, edge => {
์ฝ˜์†”.๋กœ๊ทธ(์—์ง€.๋…ธ๋“œ);

      createPage({
        path: `/post/${edge.node.slug}`,
        component: postPage,
        context: {
          id: edge.node.id,
          slug: edge.node.slug
        },
      })
    })
  })
  .then(resolve)

})
}

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด "์Šฌ๋Ÿฌ๊ทธ"๋ฅผ ํฌํ•จํ•˜๋„๋ก ์ปจํ…์ŠคํŠธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์‹ค์ œ ์‚ฌํ›„ ๊ตฌ์„ฑ ์š”์†Œ graphQL ์ฟผ๋ฆฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ณณ...
ํ•˜์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์ฝ˜์†” ์ถœ๋ ฅ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฝ˜ํ…์ธ  ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ: 404.350ms
์„ฑ๊ณต ์†Œ์Šค ๋ฐ ๋ณ€ํ™˜ ๋…ธ๋“œ โ€” 0.552์ดˆ
์„ฑ๊ณต ๊ตฌ์ถ• ์Šคํ‚ค๋งˆ โ€” 0.548์ดˆ
์„ฑ๊ณต createLayouts โ€” 0.055์ดˆ
โ  /xxxxxxx/src/templates/post.jsx
{ ์•„์ด๋””: 'c7juaTIcg6cW2wAGKCQuios', ์Šฌ๋Ÿฌ๊ทธ: 'ํ…Œ์ŠคํŠธ ํฌ์ŠคํŠธ' }
์„ฑ๊ณต createPages โ€” 0.061์ดˆ
์„ฑ๊ณต createPagesStatefully โ€” 0.023์ดˆ
GraphQL ์˜ค๋ฅ˜ ์•Œ ์ˆ˜ ์—†๋Š” ์ธ์ˆ˜ slug

ํŒŒ์ผ: /Users/joshuaweaver/Documents/JoyfulNoise/joyfulnoiseliving/src/templates/post.jsx

1 |
2 | ์ฟผ๋ฆฌ BlogPostBySlug($slug: ๋ฌธ์ž์—ด!) {

3 | allContentfulBlogPost(์Šฌ๋Ÿฌ๊ทธ: { eq: $slug }) {
| ^^
4 | ์ œ๋ชฉ
5 | ๊ฐ•ํƒ€
...

์ €๋Š” GraphQL์„ ์ฒ˜์Œ ์ ‘ํ–ˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ๋ถ„๋ช…ํ•œ ๊ฒƒ์„ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/gatsbyjs/gatsby/issues/2069 ๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAEVh7fahni3VfI4tz_PphtJPctw2jV5ks5sg2LWgaJpZM4PSM2E
.

๊ธ€์Ž„, ๋‚˜๋Š” Contentful์— ํ•˜๋‚˜์˜ ๋…ธ๋“œ/๊ฒŒ์‹œ๋ฌผ๋งŒ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ .. ์ฟผ๋ฆฌ๊ฐ€ allContentfulBlogPost ์—์„œ contentfulBlogPost ๋กœ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ฟผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ–ˆ๊ณ  ์ง€๊ธˆ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค... ํ•˜์ง€๋งŒ GraphQL์„ ์ฒ˜์Œ ์ ‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์ .

์•„ ๋งž๋‹ค, ๊ทธ ์ฟผ๋ฆฌ๋Š” ํ†ตํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์— ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— Graph i QL์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

"all"์€ ์œ ํ˜•์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ฟผ๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ์—†์œผ๋ฉด ๋‹จ์ผ ํ•ญ๋ชฉ์„ ์ฟผ๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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