GitHub์ API ์ ๋ณด
GitHub์(๋) REST API์ GraphQL API๋ผ๋ ๋ ๊ฐ์ง API๋ฅผ ์ ๊ณตํฉ๋๋ค. GitHub CLI, curl, ๊ณต์ Octokit ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ API์ ์ํธ ์์ฉํ ์ ์์ต๋๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํ API์์ ๊ธฐ๋ฅ์ด ์ง์๋ ์ ์์ง๋ง ๋ค๋ฅธ API์์๋ ์ง์๋์ง ์์ ์ ์์ต๋๋ค.
์๊ตฌ ์ฌํญ์ ๊ฐ์ฅ ์ ๋ถํฉํ๊ณ ๊ฐ์ฅ ํธ์ํ๊ฒ ์ฌ์ฉํ ์ ์๋ API๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ํ๋์ API๋ฅผ ๋ค๋ฅธ API๋ณด๋ค ๋ ์ ์ ์ผ๋ก ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค. ๋ ธ๋ ID๋ฅผ ์ฌ์ฉํ๋ฉด REST API ๋ฐ GraphQL API ๊ฐ์ ์ด๋ํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ ์ญ ๋ ธ๋ ID ์ฌ์ฉ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
์ด ๋ฌธ์์์๋ ๊ฐ API์ ์ด์ ์ ๋ํด ์ค๋ช ํฉ๋๋ค. GraphQL API์ ๋ํ ์์ธํ ๋ด์ฉ์ GraphQL API ์ ๋ณด์(๋ฅผ) ์ฐธ์กฐํ์ธ์. REST API์ ๋ํ ์์ธํ ๋ด์ฉ์ REST API ์ ๋ณด์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
GraphQL API ์ ํ
GraphQL API๋ ์์ฒญํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ฒ ๋ฐํํฉ๋๋ค. ๋ํ GraphQL์ ์์ฒญ์ ๋ฐ๋ผ ๋ฏธ๋ฆฌ ์๋ ค์ง ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฐ๋ฉด REST API๋ ์์ฒญํ ๋ฐ์ดํฐ๋ณด๋ค ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ณ ๋ฏธ๋ฆฌ ๊ฒฐ์ ๋ ๊ตฌ์กฐ๋ก ๋ฐํํฉ๋๋ค. ๋จ์ผ GraphQL ์์ฒญ์์ ์ฌ๋ฌ REST API ์์ฒญ์ ํด๋นํ๋ ์์ ์ ์ํํ ์๋ ์์ต๋๋ค. ๋ ์ ์ ์์ ์์ฒญ์ ์ํํ๊ณ ๋ ์ ์ ๋ฐ์ดํฐ๋ฅผ ํ์นํ๋ ๊ธฐ๋ฅ์ ํตํด GraphQL์ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์๊ฒ ๋งค๋ ฅ์ ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ํ๋ก์ 10๋ช ์ GitHub ๋ก๊ทธ์ธ๊ณผ ๊ฐ ํ๋ก์์ ํ๋ก์ 10๋ช ์ ๋ก๊ทธ์ธ์ ์ป๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋จ์ผ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
{
viewer {
followers(first: 10) {
nodes {
login
followers(first: 10) {
nodes {
login
}
}
}
}
}
}
์๋ต์ ํด๋น ์์ฒญ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋ JSON ๊ฐ์ฒด์ ๋๋ค.
๋ฐ๋ฉด REST API์์ ์ด ๋์ผํ ์ ๋ณด๋ฅผ ์ป์ผ๋ ค๋ฉด ๋จผ์ GET /user/followers
์ ๋ํ ์์ฒญ์ ์ํํด์ผ ํฉ๋๋ค . API๋ ํ์ํ์ง ์์ ํ๋ก์์ ๋ํ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ํจ๊ป ๊ฐ ํ๋ก์์ ๋ก๊ทธ์ธ์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ ํ๋ก์์ ๋ํด GET /users/{username}/followers
์ ๋ํ ์์ฒญ์ ์ํํด์ผ ํฉ๋๋ค. ๋จ์ผ GraphQL ์์ฒญ์์ ๊ฐ์ ธ์ฌ ์ ์๋ ์ ๋ณด์ ๋์ผํ ์ ๋ณด๋ฅผ ์ป์ผ๋ ค๋ฉด ์ด 11๊ฐ์ ์์ฒญ์ ์ํํด์ผ ํ๋ฉฐ ์ด๊ณผ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค.
REST API ์ ํ
REST API๋ GraphQL API๋ณด๋ค ๋ ์ค๋ ์ฌ์ฉ๋์์ผ๋ฏ๋ก ์ผ๋ถ ๊ฐ๋ฐ์๋ REST API์ ๋ ์ต์ํฉ๋๋ค. REST API๋ ํ์ค HTTP ๋์ฌ ๋ฐ ๊ฐ๋ ์ ์ฌ์ฉํ๋ฏ๋ก ๋ง์ ๊ฐ๋ฐ์๋ REST API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ด๋ฏธ ์ต์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, octocat/Spoon-Knife
๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ด์๋ฅผ ๋ง๋ค๋ ค๋ฉด JSON ์์ฒญ ๋ณธ๋ฌธ์ ์ฌ์ฉํ์ฌ POST /repos/octocat/Spoon-Knife/issues
์ ์์ฒญ์ ๋ณด๋ด์ผ ํฉ๋๋ค.
{
"title": "Bug with feature X",
"body": "If you do A, then B happens"
}
๋ฐ๋ฉด, GraphQL API๋ฅผ ์ฌ์ฉํ์ฌ ์ด์๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด octocat/Spoon-Knife
๋ฆฌํฌ์งํ ๋ฆฌ์ ๋
ธ๋ ID๋ฅผ ๊ฐ์ ธ์์ ๋ค์๊ณผ ๊ฐ์ ์์ฒญ์ ๋ณด๋ด์ผ ํฉ๋๋ค.
mutation {
createIssue(
input: {
repositoryId: "MDEwOlJlcG9zaXRvcnkxMzAwMTky"
title: "Bug with feature X"
body: "If you do A, then B happens"}
) {
issue {
number
url
}
}
}