Skip to main content

REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Git ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉ

REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GitHub์—์„œ Git ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์›์‹œ Git ๊ฐœ์ฒด๋ฅผ ์ฝ๊ณ  ์“ฐ๊ณ  ์ฐธ์กฐ(๋ถ„๊ธฐ ํ—ค๋“œ ๋ฐ ํƒœ๊ทธ)๋ฅผ ๋‚˜์—ดํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์š”

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์›์‹œ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๋ถ„๊ธฐ ์ฐธ์กฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ Git์„ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ ๋„ Git์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ž‘์—…์„ ๊ธฐ์ˆ ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ REST API๋ฅผ ํ†ตํ•ด ๋งŽ์€ Git ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

REST API๋Š” Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ 409 Conflict๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ GitHub๊ฐ€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ์ค‘์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋นˆ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๊ฒฝ์šฐ, PUT /repos/{owner}/{repo}/contents/{path} REST API ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ˜ํ…์ธ ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ํ•ด๋‹น API๋ฅผ ์‚ฌ์šฉํ•ด Git ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‘๋‹ต ์ƒํƒœ๊ฐ€ ์ง€์†๋˜๋ฉด GitHub ์ง€์› ํฌํ„ธ ์‚ฌ์šฉ์— ๋ฌธ์˜ํ•˜์„ธ์š”.

Git ๊ฐœ์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Pro Git ์ฑ…์˜ Git Internals ์ฑ•ํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์ปค๋ฐ‹ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ํ˜„์žฌ ์ปค๋ฐ‹ ๊ฐœ์ฒด ๊ฐ€์ ธ์˜ค๊ธฐ
  • ๊ฐ€๋ฆฌํ‚ค๋Š” ํŠธ๋ฆฌ ๊ฒ€์ƒ‰
  • ํ•ด๋‹น ํŠน์ • ํŒŒ์ผ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ํŠธ๋ฆฌ์— ์žˆ๋Š” Blob ๊ฐœ์ฒด์˜ ์ฝ˜ํ…์ธ  ๊ฒ€์ƒ‰
  • ์–ด๋–ป๊ฒŒ๋“  ์ฝ˜ํ…์ธ ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์ƒˆ ์ฝ˜ํ…์ธ ๊ฐ€ ํฌํ•จ๋œ ์ƒˆ Blob ๊ฐœ์ฒด๋ฅผ ๊ฒŒ์‹œํ•˜์—ฌ Blob SHA ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ํ•ด๋‹น ํŒŒ์ผ ๊ฒฝ๋กœ ํฌ์ธํ„ฐ๊ฐ€ ํŠธ๋ฆฌ SHA๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋Š” ์ƒˆ Blob SHA๋กœ ๋Œ€์ฒด๋œ ์ƒˆ ํŠธ๋ฆฌ ๊ฐœ์ฒด ๊ฒŒ์‹œ
  • ํ˜„์žฌ ์ปค๋ฐ‹ SHA๋ฅผ ๋ถ€๋ชจ ๋ฐ ์ƒˆ ํŠธ๋ฆฌ SHA๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ์ปค๋ฐ‹ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ปค๋ฐ‹ SHA ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ์ƒˆ ์ปค๋ฐ‹ SHA๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ถ„๊ธฐ ์ฐธ์กฐ ์—…๋ฐ์ดํŠธ

๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ชจ๋ธ์„ ์ดํ•ดํ•˜๊ณ  API๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์ž‘์—…์„ ์—ด๋ฉด ์‹ค์ œ๋กœ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์˜ ๋ณ‘ํ•ฉ ๊ฐ€๋Šฅ์„ฑ ํ™•์ธ

๊ฒฝ๊ณ 

์ด ์ฝ˜ํ…์ธ ๋Š” ๊ฒฝ๊ณ  ์—†์ด ์˜ค๋ž˜๋˜์—ˆ์œผ๋ฏ€๋กœ Git ์ฐธ์กฐ๋ฅผ mergeํ•˜๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด Git์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ GET /repos/{owner}/{repo}/git/refs/{ref}๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.

์†Œ๋น„ API๋Š” ํ…Œ์ŠคํŠธ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.__ ํ…Œ์ŠคํŠธ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์€ UI์—์„œ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ๋ณด๊ณ  โ€œ๋ณ‘ํ•ฉโ€ ๋‹จ์ถ”๊ฐ€ ํ‘œ์‹œ๋˜๊ฑฐ๋‚˜ REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, ๋งŒ๋“ค๊ฑฐ๋‚˜, ํŽธ์ง‘ํ•  ๋•Œ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.__ ์ด ์š”์ฒญ์ด ์—†์œผ๋ฉด ๋‹ค์Œ์— ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ๋ณผ ๋•Œ๊นŒ์ง€ merge Git ์ฐธ์กฐ๊ฐ€ ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์˜ค๋ž˜๋œ merge Git ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํด๋ง ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ GitHub๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ถ„๊ธฐ์—์„œ ์ตœ์‹  ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  1. ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ์›นํ›„ํฌ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  2. ๋ณ‘ํ•ฉ ์ปค๋ฐ‹ ํ›„๋ณด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด GET /repos/{owner}/{repo}/pulls/{pull_number}๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  3. GET /repos/{owner}/{repo}/pulls/{pull_number}๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํด๋งํ•˜์—ฌ mergeable ํŠน์„ฑ์ด true ๋˜๋Š” false์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Git์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ด์ „ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„์—๋งŒ merge Git ์ฐธ์กฐ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด GET /repos/{owner}/{repo}/git/refs/{ref}๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.