Skip to main content

์ฃผ์„ ์ž‘์—…

REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ, ์ด์Šˆ ๋˜๋Š” ์ปค๋ฐ‹์˜ ์ฃผ์„์— ์•ก์„ธ์Šคํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์˜ ๊ฒฝ์šฐ GitHub๋Š” ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์˜ ์ฃผ์„ ์ „์ฒด, ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ๋‚ด์˜ ํŠน์ • ์ค„์— ๋Œ€ํ•œ ์ฃผ์„, ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ๋‚ด์˜ ํŠน์ • ์ปค๋ฐ‹์— ๋Œ€ํ•œ ์ฃผ์„์˜ ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ฃผ์„ ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฐ ์œ ํ˜•์˜ ์ฃผ์„์€ GitHub API์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ๊ฐ ํ•ญ๋ชฉ์— ์•ก์„ธ์Šคํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜ˆ์ œ์—์„œ๋Š” โ€œoctocatโ€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋งŒ๋“  ์ด ์ƒ˜ํ”Œ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ ์ƒ˜ํ”Œ์€ ํ”Œ๋žซํผ ์ƒ˜ํ”Œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ์ฃผ์„

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

Octokit.rb๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Ruby ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ์ฃผ์„์„ ํŽ˜์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. personal access token์„(๋ฅผ) ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” Octokit.rb๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์—์„œ ์ฃผ์„์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

require 'octokit'

# !!! DO NOT EVER USE HARD-CODED VALUES IN A REAL APP !!!
# Instead, set and test environment variables, like below
client = Octokit::Client.new :access_token => ENV['MY_PERSONAL_TOKEN']

client.issue_comments("octocat/Spoon-Knife", 1176).each do |comment|
  username = comment[:user][:login]
  post_date = comment[:created_at]
  content = comment[:body]

  puts "#{username} made a comment on #{post_date}. It says:\n'#{content}'\n"
end

์—ฌ๊ธฐ์„œ๋Š” ํŠนํžˆ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฃผ์„(issue_comments)์„ ๊ฐ€์ ธ์˜ค๊ณ , ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ์ด๋ฆ„(octocat/Spoon-Knife) ๋ฐ ๊ด€์‹ฌ ์žˆ๋Š” ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ID(1176)๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์—๋Š” ๊ฐ ์ฃผ์„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํŽ˜์น˜ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์„์„ ๋ฐ˜๋ณตํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ค„์˜ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ์ฃผ์„

๋น„๊ต ๋ณด๊ธฐ ๋‚ด์—์„œ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ๋‚ด์—์„œ ์ด๋ฃจ์–ด์ง„ ๋‹จ์ผ ๋ณ€๊ฒฝ์˜ ํŠน์ • ์ธก๋ฉด์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฃผ์„์€ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ ๋‚ด์˜ ๊ฐœ๋ณ„ ์ค„์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์˜ ์—”๋“œํฌ์ธํŠธ URL์€ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ๊ฒ€ํ† ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋‹จ์ผ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ๋ฒˆํ˜ธ๊ฐ€ ์ง€์ •๋œ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ์ฃผ์„์„ ํŽ˜์น˜ํ•ฉ๋‹ˆ๋‹ค.

require 'octokit'

# !!! DO NOT EVER USE HARD-CODED VALUES IN A REAL APP !!!
# Instead, set and test environment variables, like below
client = Octokit::Client.new :access_token => ENV['MY_PERSONAL_TOKEN']

client.pull_request_comments("octocat/Spoon-Knife", 1176).each do |comment|
  username = comment[:user][:login]
  post_date = comment[:created_at]
  content = comment[:body]
  path = comment[:path]
  position = comment[:position]

  puts "#{username} made a comment on #{post_date} for the file called #{path}, on line #{position}. It says:\n'#{content}'\n"
end

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

์ปค๋ฐ‹ ์ฃผ์„

๋งˆ์ง€๋ง‰ ์œ ํ˜•์˜ ์ฃผ์„์€ ๊ฐœ๋ณ„ ์ปค๋ฐ‹์—์„œ ํŠนํžˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ์„ค๋ช…์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ปค๋ฐ‹์— ๋Œ€ํ•œ ์ฃผ์„์„ ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด ์ปค๋ฐ‹์˜ SHA1์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ๊ณผ ๊ด€๋ จ๋œ ์‹๋ณ„์ž๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

require 'octokit'

# !!! DO NOT EVER USE HARD-CODED VALUES IN A REAL APP !!!
# Instead, set and test environment variables, like below
client = Octokit::Client.new :access_token => ENV['MY_PERSONAL_TOKEN']

client.commit_comments("octocat/Spoon-Knife", "cbc28e7c8caee26febc8c013b0adfb97a4edd96e").each do |comment|
  username = comment[:user][:login]
  post_date = comment[:created_at]
  content = comment[:body]

  puts "#{username} made a comment on #{post_date}. It says:\n'#{content}'\n"
end

์ด API ํ˜ธ์ถœ์€ ๋‹จ์ผ ์ค„ ์ฃผ์„๊ณผ ์ „์ฒด ์ปค๋ฐ‹์— ๋Œ€ํ•œ ์ฃผ์„์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.