Skip to main content

REST API ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€

GitHub์˜ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

ํด๋ง ๋ฐฉ์ง€

๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ API๋ฅผ ํด๋งํ•˜๋Š” ๋Œ€์‹  ์›นํ›„ํฌ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ†ตํ•ฉ์ด API ํŠธ๋ž˜ํ”ฝ๋ฅ  ์ œํ•œ ๋‚ด์—์„œ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์›นํ›„ํฌ ์„ค๋ช…์„œ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์š”์ฒญ ์ธ์ฆํ•˜๊ธฐ

์ธ์ฆ๋œ ์š”์ฒญ์€ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์š”์ฒญ๋ณด๋‹ค ๊ธฐ๋ณธ ์†๋„ ์ œํ•œ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์†๋„ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ์ธ์ฆ๋œ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ REST API์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ๋ฅ  ์ œํ•œ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

๋™์‹œ ์š”์ฒญ ๊ธˆ์ง€

๋ณด์กฐ ์†๋„ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ๋™์‹œ์— ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ์ง๋ ฌ๋กœ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์š”์ฒญ์— ๋Œ€ํ•œ ํ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์š”์ฒญ ๊ฐ„ ์ผ์‹œ ์ค‘์ง€

๋งŽ์€ ์ˆ˜์˜ POST, PATCH, PUT ๋˜๋Š” DELETE ์š”์ฒญ์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ๊ฐ ์š”์ฒญ ์‚ฌ์ด์— 1์ดˆ ์ด์ƒ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ณด์กฐ ์†๋„ ์ œํ•œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†๋„ ์ œํ•œ ์˜ค๋ฅ˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌ

ํŠธ๋ž˜ํ”ฝ๋ฅ  ์ œํ•œ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์ง€์นจ์— ๋”ฐ๋ผ ์ผ์‹œ์ ์œผ๋กœ ์š”์ฒญ์„ ์ค‘์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • retry-after ์‘๋‹ต ํ—ค๋”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ช‡ ์ดˆ๊ฐ€ ๊ฒฝ๊ณผํ•  ๋•Œ๊นŒ์ง€ ์š”์ฒญ์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • x-ratelimit-remaining ํ—ค๋”๊ฐ€ 0์ธ ๊ฒฝ์šฐ x-ratelimit-reset ํ—ค๋”๋กœ ์ง€์ •๋œ ์‹œ๊ฐ„๊นŒ์ง€ ๋‹ค๋ฅธ ์š”์ฒญ์„ ์‹œ๋„ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ํ—ค๋”๋Š” x-ratelimit-reset UTC Epoch ์ดˆ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ธฐ ์ „์— 1๋ถ„ ์ด์ƒ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋ณด์กฐ ํŠธ๋ž˜ํ”ฝ๋ฅ  ์ œํ•œ์œผ๋กœ ์ธํ•ด ์š”์ฒญ์ด ๊ณ„์† ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ ์žฌ์‹œ๋„ ์‚ฌ์ด์— ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ํŠน์ • ํšŸ์ˆ˜์˜ ์žฌ์‹œ๋„ ํ›„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ž˜ํ”ฝ๋ฅ ์ด ์ œํ•œ๋œ ๋™์•ˆ ์š”์ฒญ์„ ๊ณ„์†ํ•˜๋ฉด ํ†ตํ•ฉ์ด ๊ธˆ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋””๋ ‰์…˜ ๋”ฐ๋ฅด๊ธฐ

GitHub REST API๋Š” ์ ์ ˆํ•œ ๊ฒฝ์šฐ HTTP ๋ฆฌ๋””๋ ‰์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  ์š”์ฒญ์ด ๋ฆฌ๋””๋ ‰์…˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. HTTP ๋ฆฌ๋””๋ ‰์…˜์„ ๋ฐ›๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ๋ฆฌ๋””๋ ‰์…˜์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

301 ์ƒํƒœ ์ฝ”๋“œ๋Š” ์˜๊ตฌ ๋ฆฌ๋””๋ ‰์…˜์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. location ํ—ค๋”์— ์ง€์ •๋œ URL์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ดํ›„ ์š”์ฒญ์— ์ด URL์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

302 ๋˜๋Š” 307 ์ƒํƒœ ์ฝ”๋“œ๋Š” ์ž„์‹œ ๋ฆฌ๋””๋ ‰์…˜์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. location ํ—ค๋”์— ์ง€์ •๋œ URL์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ดํ›„ ์š”์ฒญ์— ์ด URL์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฆฌ๋””๋ ‰์…˜ ์ƒํƒœ ์ฝ”๋“œ๋Š” HTTP ์‚ฌ์–‘์— ๋”ฐ๋ผ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

URL์˜ ์ˆ˜๋™ ๊ตฌ๋ฌธ ๋ถ„์„ ๊ธˆ์ง€

๋งŽ์€ API ์—”๋“œํฌ์ธํŠธ๋Š” ์‘๋‹ต ๋ณธ๋ฌธ์˜ ํ•„๋“œ์— ๋Œ€ํ•œ URL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ URL์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ฑฐ๋‚˜ ํ–ฅํ›„ URL์˜ ๊ตฌ์กฐ๋ฅผ ์˜ˆ์ธกํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด GitHub์ด(๊ฐ€) ๋‚˜์ค‘์— URL์˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ํ†ตํ•ฉ์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ํ•„๋“œ๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌธ์ œ๋ฅผ ๋งŒ๋“œ๋Š” ์—”๋“œํฌ์ธํŠธ๋Š” https://github.com/octocat/Hello-World/issues/1347๊ณผ ๊ฐ™์€ ๊ฐ’์ด ์žˆ๋Š” html_url ํ•„๋“œ์™€ 1347๊ณผ ๊ฐ™์€ ๊ฐ’์ด ์žˆ๋Š” number ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ์ˆ˜๋ฅผ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ html_url ํ•„๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋Œ€์‹  number ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŽ˜์ด์ง€๋ฅผ ๋งค๊ธด ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ๋งํฌ ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ์˜ ํŽ˜์ด์ง€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ REST API์—์„œ ํŽ˜์ด์ง€ ๋งค๊น€ ์‚ฌ์šฉ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ ์ ˆํ•œ ๊ฒฝ์šฐ ์กฐ๊ฑด๋ถ€ ์š”์ฒญ ์‚ฌ์šฉ

๋Œ€๋ถ€๋ถ„์˜ ์—”๋“œํฌ์ธํŠธ๋Š” etag ํ—ค๋”๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋งŽ์€ ์—”๋“œํฌ์ธํŠธ๋Š” last-modified ํ—ค๋”๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ—ค๋”์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด๋ถ€ GET ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 304 Not Modified ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด๋ถ€ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ, 304 ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋˜๊ณ  Authorization ํ—ค๋”๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ธ์ฆ๋œ ์ƒํƒœ์—์„œ ์š”์ฒญ์ด ์ด๋ฃจ์–ด์ง„ ๊ฒฝ์šฐ, ํ•ด๋‹น ์š”์ฒญ์€ ๊ธฐ๋ณธ ์†๋„ ์ œํ•œ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ „ ์š”์ฒญ์ด 644b5b0155e6404a9cc4bd9d8b1ae730์˜ etag ํ—ค๋” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ ๊ฒฝ์šฐ ์ดํ›„ ์š”์ฒญ์—์„œ if-none-match ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

curl -H "Authorization: Bearer YOUR-TOKEN" https://api.github.com/meta --include --header 'if-none-match: "644b5b0155e6404a9cc4bd9d8b1ae730"'

์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ „ ์š”์ฒญ์ด Wed, 25 Oct 2023 19:17:59 GMT์˜ last-modified ํ—ค๋” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ ๊ฒฝ์šฐ ์ดํ›„ ์š”์ฒญ์—์„œ if-modified-since ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

curl -H "Authorization: Bearer YOUR-TOKEN" https://api.github.com/repos/github/docs --include --header 'if-modified-since: Wed, 25 Oct 2023 19:17:59 GMT'

ํŠน์ • ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์„ค๋ช…์„œ์— ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ POST, PUT, PATCH, DELETE ๋“ฑ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์กฐ๊ฑด๋ถ€ ์š”์ฒญ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฌด์‹œ ๊ธˆ์ง€

๋ฐ˜๋ณต๋˜๋Š” 4xx ๋ฐ 5xx ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฌด์‹œํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  API์™€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋ฌธ์ž์—ด์„ ์š”์ฒญํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ˆซ์ž ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜๊ฐ€ ์ˆ˜์‹ ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ถŒํ•œ์ด ์—†๊ฑฐ๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์—”๋“œํฌ์ธํŠธ์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ํ•˜๋ฉด 4xx ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ณต๋œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜๋ฅผ ์˜๋„์ ์œผ๋กœ ๋ฌด์‹œํ•˜๋ฉด ๋‚จ์šฉ์œผ๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ์•ฑ์ด ์ผ์‹œ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ฐธ๊ณ  ์ž๋ฃŒ