Skip to main content

์ „์—ญ ๋…ธ๋“œ ID ์‚ฌ์šฉ

REST API๋ฅผ ํ†ตํ•ด ๊ฐœ์ฒด์˜ ์ „์—ญ ๋…ธ๋“œ ID๋ฅผ ๊ฐ€์ ธ์™€์„œ GraphQL ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

REST API ๋˜๋Š” GraphQL API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GitHub์˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ์ฒด(์‚ฌ์šฉ์ž, ์ด์Šˆ, ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ๋“ฑ)์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. REST API ๋‚ด์—์„œ ๋งŽ์€ ๊ฐœ์ฒด์˜ ์ „์—ญ ๋…ธ๋“œ ID๋ฅผ ์ฐพ๊ณ  GraphQL ์ž‘์—…์—์„œ ์ด๋Ÿฌํ•œ ID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ REST API ๋ฆฌ์†Œ์Šค์—์„œ GraphQL API ๋…ธ๋“œ ID ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฐธ๊ณ  ํ•ญ๋ชฉ

REST์—์„œ ์ „์—ญ ๋…ธ๋“œ ID ํ•„๋“œ์˜ ์ด๋ฆ„์€ node_id์ž…๋‹ˆ๋‹ค. GraphQL์—์„œ๋Š” node ์ธํ„ฐํŽ˜์ด์Šค์˜ id ํ•„๋“œ์ž…๋‹ˆ๋‹ค. GraphQL์—์„œ โ€œ๋…ธ๋“œโ€์˜ ์˜๋ฏธ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์„ค๋ช…์€ GraphQL ์†Œ๊ฐœ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์‚ฌ์šฉํ•  ์ „์—ญ ๋…ธ๋“œ ID ๋ฐฐ์น˜

์ „์—ญ ๋…ธ๋“œ ID๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ์„ธ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ฐœ์ฒด์˜ node_id๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” REST ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. GraphQL์—์„œ ๊ฐœ์ฒด์˜ ํ˜•์‹์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
  3. ID ๋ฐ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ GraphQL์—์„œ ์ง์ ‘ ๋…ธ๋“œ ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ํ•˜๋‚˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๊ฐœ์ฒด์˜ ๋…ธ๋“œ ID๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” REST ์—”๋“œํฌ์ธํŠธ ํ˜ธ์ถœ

์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ:

curl -i --header "Authorization: Bearer YOUR-TOKEN" https://api.github.com/user

์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ node_id๊ฐ€ ํฌํ•จ๋œ ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

{
  "login": "octocat",
  "id": 1,
  "avatar_url": "https://github.com/images/error/octocat_happy.gif",
  "gravatar_id": "",
  "url": "https://api.github.com/users/octocat",
  "html_url": "https://github.com/octocat",
  "followers_url": "https://api.github.com/users/octocat/followers",
  "following_url": "https://api.github.com/users/octocat/following{/other_user}",
  "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
  "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
  "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
  "organizations_url": "https://api.github.com/users/octocat/orgs",
  "repos_url": "https://api.github.com/users/octocat/repos",
  "events_url": "https://api.github.com/users/octocat/events{/privacy}",
  "received_events_url": "https://api.github.com/users/octocat/received_events",
  "type": "User",
  "site_admin": false,
  "name": "monalisa octocat",
  "company": "GitHub",
  "blog": "https://github.com/blog",
  "location": "San Francisco",
  "email": "octocat@github.com",
  "hireable": false,
  "bio": "There once was...",
  "public_repos": 2,
  "public_gists": 1,
  "followers": 20,
  "following": 0,
  "created_at": "2008-01-14T04:33:35Z",
  "updated_at": "2008-01-14T04:33:35Z",
  "private_gists": 81,
  "total_private_repos": 100,
  "owned_private_repos": 100,
  "disk_usage": 10000,
  "collaborators": 8,
  "two_factor_authentication": true,
  "plan": {
    "name": "Medium",
    "space": 400,
    "private_repos": 20,
    "collaborators": 0
  },
  "node_id": "MDQ6VXNlcjU4MzIzMQ=="
}

2. GraphQL์—์„œ ๊ฐœ์ฒด ํ˜•์‹ ์ฐพ๊ธฐ

์ด ์˜ˆ์ œ์—์„œ node_id ๊ฐ’์€ MDQ6VXNlcjU4MzIzMQ==์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ GraphQL์—์„œ ๋™์ผํ•œ ๊ฐœ์ฒด๋ฅผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋จผ์ € ๊ฐœ์ฒด์˜ _ํ˜•์‹_์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ GraphQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜•์‹์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

query {
  node(id:"MDQ6VXNlcjU4MzIzMQ==") {
     __typename
  }
}

์ด ํ˜•์‹์˜ ์ฟผ๋ฆฌ, ์ฆ‰ ID๋กœ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์„ โ€œ์ง์ ‘ ๋…ธ๋“œ ์กฐํšŒโ€๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด __typename์ด User๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

3. GraphQL์—์„œ ์ง์ ‘ ๋…ธ๋“œ ์กฐํšŒ ์ˆ˜ํ–‰

ํ˜•์‹์„ ํ™•์ธํ•œ ํ›„์—๋Š” ์ธ๋ผ์ธ ์กฐ๊ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ID๋กœ ๊ฐœ์ฒด์— ์•ก์„ธ์Šคํ•˜๊ณ  ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ์ฟผ๋ฆฌํ•˜๋ ค๋Š” User์˜ ํ•„๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

query {
  node(id:"MDQ6VXNlcjU4MzIzMQ==") {
   ... on User {
      name
      login
    }
  }
}

์ด ํ˜•์‹์˜ ์ฟผ๋ฆฌ๋Š” ์ „์—ญ ๋…ธ๋“œ ID๋กœ ๊ฐœ์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์—์„œ ์ „์—ญ ๋…ธ๋“œ ID ์‚ฌ์šฉ

REST API ๋˜๋Š” GraphQL API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ†ตํ•ฉ์„ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ API ๋ฒ„์ „์—์„œ ๊ฐœ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ „์—ญ ๋…ธ๋“œ ID๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. REST์™€ GraphQL ๊ฐ„ ์ „ํ™˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ REST์—์„œ GraphQL๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.