Skip to main content

GraphQL ์ „์—ญ ๋…ธ๋“œ ID ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

๋‘ ๊ฐœ์˜ ์ „์—ญ ๋…ธ๋“œ ID ํ˜•์‹๊ณผ ๋ ˆ๊ฑฐ์‹œ ํ˜•์‹์—์„œ ์ƒˆ ํ˜•์‹์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ

GitHub GraphQL API๋Š” ํ˜„์žฌ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ „์—ญ ๋…ธ๋“œ ID ํ˜•์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ ํ˜•์‹์€ ๋‹ซ๊ธฐ์ด๊ณ  ์ƒˆ ํ˜•์‹์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ƒˆ ํ˜•์‹์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

์ƒˆ ํ˜•์‹์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ฉด ์š”์ฒญ์˜ ์‘๋‹ต ์‹œ๊ฐ„์„ ์ผ๊ด€์„ฑ ์žˆ๊ณ  ์งง๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ ˆ๊ฑฐ์‹œ ID๊ฐ€ ๋‹ซ๊ธฐ์ด๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ณ„์† ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๋ ˆ๊ฑฐ์‹œ ์ „์—ญ ๋…ธ๋“œ ID ํ˜•์‹์ด ๋‹ซ๊ธฐ์ธ ์ด์œ ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ GraphQL์— ์ƒˆ๋กœ์šด ์ „์—ญ ID ํ˜•์‹ ์ œ๊ณต์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธ

GraphQL ์ „์—ญ ๋…ธ๋“œ ID์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ID๋Š” ์Šคํ‚ค๋งˆ์— ์žˆ๋Š” ๊ฐœ์ฒด์— ๋Œ€ํ•œ id ํ•„๋“œ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ ๋…ธ๋“œ ID๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฉด ๋ณ€๊ฒฝ ์—†์ด API์™€ ๊ณ„์† ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ˜„์žฌ ๋ ˆ๊ฑฐ์‹œ ID๋ฅผ ๋””์ฝ”๋”ฉํ•˜์—ฌ ํ˜•์‹ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ๊ฐœ์ฒด๊ฐ€ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ PR_kwDOAHz1OX4uYAah์˜ ์ฒ˜์Œ ๋‘ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ) ID์˜ ํ˜•์‹์ด ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฏ€๋กœ ์„œ๋น„์Šค๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ID๋ฅผ ๋ถˆํˆฌ๋ช… ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„œ๋น„์Šค๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ID๋Š” ๊ณ ์œ ํ•˜๋ฏ€๋กœ ์ฐธ์กฐ๋กœ์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ ์ „์—ญ ID๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

์ƒˆ ID ํ˜•์‹์œผ๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด GraphQL API ์š”์ฒญ์—์„œ X-Github-Next-Global-ID ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. X-Github-Next-Global-ID ํ—ค๋”์˜ ๊ฐ’์€ 1 ๋˜๋Š” 0์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ 1๋กœ ์„ค์ •ํ•˜๋ฉด ์‘๋‹ต ํŽ˜์ด๋กœ๋“œ๊ฐ€ id ํ•„๋“œ๋ฅผ ์š”์ฒญํ•œ ๊ฐœ์ฒด์— ๋Œ€ํ•ด ํ•ญ์ƒ ์ƒˆ ID ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฐœ์ฒด ์ƒ์„ฑ ๋‚ ์งœ์— ๋”ฐ๋ผ ๋ ˆ๊ฑฐ์‹œ ID ๋˜๋Š” ์ƒˆ ID๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ๋˜๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

curl ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ curl \
  -H "Authorization: Bearer $GITHUB_TOKEN" \
  -H "X-Github-Next-Global-ID: 1" \
  https://api.github.com/graphql \
  -d '{ "query": "{ node(id: \"MDQ6VXNlcjM0MDczMDM=\") { id } }" }'

์ฟผ๋ฆฌ์—๋Š” ๋ ˆ๊ฑฐ์‹œ ID MDQ6VXNlcjM0MDczMDM=๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ ์‘๋‹ต์—๋Š” ์ƒˆ ID ํ˜•์‹์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

{"data":{"node":{"id":"U_kgDOADP9xw"}}}

X-Github-Next-Global-ID ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ ˆ๊ฑฐ์‹œ ID์— ๋Œ€ํ•œ ์ƒˆ ID ํ˜•์‹์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‘๋‹ต์—์„œ ๋ฐ›์€ ID๋กœ ํ•ด๋‹น ์ฐธ์กฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ ID์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  API์— ๋Œ€ํ•œ ํ›„์† ์š”์ฒญ์— ๋Œ€ํ•ด ์ƒˆ ID ํ˜•์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋Ÿ‰ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ API ํ˜ธ์ถœ์—์„œ ์—ฌ๋Ÿฌ ๋…ธ๋“œ ์ฟผ๋ฆฌ๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GraphQL ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ•ญ๋ชฉ์˜ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ์ƒˆ ID๋ฅผ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์กฐ์ง์˜ ๋งˆ์ง€๋ง‰ 10๊ฐœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ์ƒˆ ID๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  organization(login: "github") {
    repositories(last: 10) {
      edges {
        cursor
        node {
          name
          id
        }
      }
    }
  }
}

X-Github-Next-Global-ID๋ฅผ 1๋กœ ์„ค์ •ํ•˜๋ฉด ์ฟผ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  id ํ•„๋“œ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค. ์ฆ‰, node๊ฐ€ ์•„๋‹Œ ์ฟผ๋ฆฌ๋ฅผ ์ œ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ id ํ•„๋“œ๋ฅผ ์š”์ฒญํ•˜๋ฉด ์ƒˆ ํ˜•์‹ ID๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ ๊ณต์œ 

์•ฑ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์ถœ์‹œ์— ๋Œ€ํ•ด ์šฐ๋ ค ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ GitHub ์ง€์› ํฌํ„ธ ์‚ฌ์šฉ์— ๋ฌธ์˜ํ•˜๊ณ  ์•ฑ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋ฉด ๋” ๋‚˜์€ ์ง€์›์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.