์•Œ๊ณ ๋ฆฌ์ฆ˜/์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ํ›„๊ธฐ

๊ฐœ๋ฐœํ˜• ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„๋ฅผ ์œ„ํ•œ HTTPํ”„๋กœํ† ์ฝœ, REST API with python

 

๊ฐœ๋ฐœํ˜• ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๊ฐœ๋… ์ •๋ฆฌ

 

API๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

          -Application Programming Interface

          -ํ”„๋กœ๊ทธ๋žจ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•œ ๋ฐฉ์‹

 

๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ์„œ๋กœ์˜ ๊ทœ์น™์„ ๋งŒ๋“ค์–ด ๋†“์•˜๋‹ค -> ํ”„๋กœํ† ์ฝœ

์ด๊ฒƒ์€ ์ •ํ•˜๊ธฐ ๋‚˜๋ฆ„

๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ค‘ ํ•˜๋‚˜๊ฐ€HTTP(hyper text transfer protocol)

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํ™ˆํŽ˜์ด์ง€์— url์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ๊ฐ€๋Š”๋ฐ ์ด๊ฒƒ์ด http ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

(http ํ”„๋กœํ† ์ฝœ ์ˆœ์„œ๋„)

1.     ๋‚ด๊ฐ€ ๋ณด๊ณ  ์‹ถ์€ ํŽ˜์ด์ง€์˜ url ์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„ ์ธก์œผ๋กœ ๋ณด๋‚ธ๋‹ค

2.     ์„œ๋ฒ„๋Š” ๋ธŒ๋ผ์šฐ์ € ์ธก์œผ๋กœ ์‘๋‹ต์„ ๋ณด๋‚ด์ค€๋‹ค

3.     ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์—์„œ ์˜จ ์‘๋‹ต์„ ๊ฐ€์ง€๊ณ  ์‹œ๊ฐํ™” ํ•˜์—ฌ์„œ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด์–ด ์ค€๋‹ค.

 

Python์—์„œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

 

1.     requests ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ import ํ•œ๋‹ค.

2.     ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ• -> requests.get(‘ํ•ด๋‹น url’)์œผ๋กœ ์š”์ฒญ์„ ํ•œ๋‹ค

3.     ๊ทธ๋Ÿผ ์„œ๋ฒ„์—์„œ requests.get ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‘๋‹ต์„ ๋ณด๋‚ด๋Š”๋ฐ ์ด๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.

4.     ๋งŒ์ผ ๋ณ€์ˆ˜๋ช…์ด reponse ๋ผ๋ฉด response.text ๋กœ ํ•ด๋‹น ๋‚ด์šฉ์„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค. 

  

 

์—ฐ์Šต์˜ˆ์ œ๋ฅผ ์œ„ํ•œ ์‚ฌ์ดํŠธ ์ฐธ๊ณ 

[https://jsonplaceholder.typicode.com] ์—์„œ ์‘๋‹ต์„ ๋ฐ›์•„์™€ ๋ณผ ๊ฒƒ์ด๋‹ค.

1)     ์‘๋‹ต์„ ๋ฐ›์•„์™€์„œ text๋กœ ์ถœ๋ ฅํ•ด๋ณด์•„๋ผ

2)     ๋ฐ›์€ ์‘๋‹ต์„ requests.json() ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊ฟ” ๋ณด์•„๋ผ

3)     ๊ฐ€๊ณตํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์›ํ•˜๋Š” ์ž‘์—…์„ ํ•ด๋ณด์•„๋ผ

 

 

๋งŒ์ผ ์›น ์š”์ฒญ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ ๋ฐฉ๋ฒ•

 

-       HOST+PATH?Parameter1=value1&Parameter2=value2&……

-       ์œ„์˜ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋ณด๋‚ด๊ฒŒ ๋˜๋Š”๋ฐ HOST์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ host ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  path์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋ฉด url = host+path๊ฐ€ ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•˜์—ฌ์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ requests ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•˜์—ฌ์„œ ์ ‘๊ทผํ•œ๋‹ค.

 

 

 

4๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ์˜ ์˜๋ฏธ

 GET – ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์‹ถ์–ด์š”!

 POST – ์ •๋ณด๋ฅผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ๋•Œ!

 PUT – ์ˆ˜์ • ํ• ๋•Œ

 DELETE – ์‚ญ์ œ๋ฅผ ์š”์ฒญ ํ• ๋•Œ 

 

 

 

REST API๋ž€?

 

-       REST(Representational State Transfer)๋Š” ๊ฐ ์ž์›(Resource)์— ๋Œ€ํ•˜์—ฌ ์ž์›์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

-       GET, POST, PUT, DELETE ๋“ฑ์˜ HTTP ๋ฉ”์„œ๋“œ๋Š” ๊ฐ๊ฐ์˜ ์—ญํ• ์ด ์žˆ์ง€๋งŒ, ๊ฐ ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋ณธ ์„ค๋ช…์„ ๋”ฐ๋ฅด์ง€ ์•Š์•„๋„ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ €๋งˆ๋‹ค ๋„ˆ๋ฌด ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋˜๋ฏ€๋กœ ๊ธฐ์ค€์ด ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

-       REST๋Š” ์„œ๋ฒ„์˜ ์ž์›์„ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•˜๋„๋ก ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ช…์‹œํ•œ ๊ฒƒ์ด๋‹ค.

-       ํŠนํžˆ HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์›น์ด๋‚˜ ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ์—์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ†ต์‹ ํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ๋ฐฉ์‹์ด๋‹ค.

 

 

-       API๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋‹ค. ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ๊ฐ ์ผ์ข…์˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‘ ๊ฐœ์ฒด๊ฐ€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋ ค๋ฉด ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ธํ„ฐํŽ˜์ดใ…ก๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ API ๋ผ๊ณ  ํ•œ๋‹ค.

-       ์˜ˆ๋ฅผ ๋“ค์–ด /boards ๊ฒฝ๋กœ์— ๋“ค์–ด๊ฐ€์•ผ ๊ฒŒ์‹œ๋ฌผ ์ •๋ณด๊ฐ€ ๋‚˜์˜ค๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด API ๋ช…์„ธ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ /boards ๋ผ๋Š” ๊ฒฝ๋กœ์— ๋“ค์–ด ๊ฐ”์„ ๋•Œ ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก์„ ์ค€๋‹ค๋ผ๊ณ  ๋ฏธ๋ฆฌ ๋ช…์‹œํ•ด ๋†“๋Š” ๊ฒƒ์ด๊ณ , API ๊ฐœ๋ฐœ์€ ์‹ค์ œ๋กœ ์„œ๋ฒ„์˜ /boards ๊ฒฝ๋กœ์— ๋“ค์–ด ๊ฐ”์„ ๋•Œ, ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋‚˜์˜ค๋„๋ก ๊ฐœ๋ฐœ๊นŒ์ง€ ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

-       REST API๋Š” REST ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋”ฐ๋ฅด๋Š” API๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

-       ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ์˜ REST API ํ˜ธ์ถœ ์ด๋ž€, REST ๋ฐฉ์‹์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋Š” ์„œ๋ฒ„์— ํŠน์ •ํ•œ ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

-       ๊ทธ๋Ÿฌ๋ฉด REST API ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•˜๋ฉด REST API ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋ฉด ๋˜๊ฒ ๊ตฌ๋‚˜!

 

 

 

์ด์ œ REST๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์ž.

1.     HTTP URL๋กœ ์ž์›์„ ๋ช…์‹œํ•œ๋‹ค

2.     HTTP ๋ฉ”์„œ๋“œ(POST, GET, PUT, DELETE)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋ช…์‹œํ•˜๋ฉด ๋œ๋‹ค.

 

REST์˜ ๊ตฌ์„ฑ์š”์†Œ

1.     ์ž์›(Resource): URL๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘œํ˜„

2.     ํ–‰์œ„(Verb): HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘œํ˜„

3.     ํ‘œํ˜„(Representation)

 

 

JSON์ด๋ž€?

 

-       ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹

-       REST API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์œผ๋กœ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ JSON์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

JSON ์ธ์ฝ”๋”ฉ ๋ฐฉ๋ฒ•

-       JSON ์ธ์ฝ”๋”ฉ์€ ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(dict)์„ JSON ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, ํŒŒ์ด์ฌ JSON๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ json.dump() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด JSON ๊ฐ์ฒด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

JSON ๋””์ฝ”๋”ฉ ๋ฐฉ๋ฒ•

-       JSON ๊ฐ์ฒด๋ฅผ ํŒŒ์ด์ฌ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(dict)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด๋ฉฐ, json.loads() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

์ธ์ฝ”๋”ฉ ๋””์ฝ”๋”ฉ์ด ํ—ท๊ฐˆ๋ฆฐ๋‹ค ์ง€๊ธˆ๊นŒ์ง€ ๋‚˜์˜จ ๋ชจ๋“  ํ˜• ๋ณ€ํ™˜์„ ์ •๋ฆฌํ•ด๋ณด์ž

 

1)     (Requests๋กœ ๋ฐ›์•„์˜จ ์‘๋‹ต์€ class:requests  ->  ๋”•์…”๋„ˆ๋ฆฌ(dict))  = ๋ณ€์ˆ˜๋ช….json()

2)     (๋”•์…”๋„ˆ๋ฆฌ(dict) -> JSON ๊ฐ์ฒด)  =  json.dump(๋ณ€์ˆ˜๋ช…)

3)     (JSON ๊ฐ์ฒด -> ๋”•์…”๋„ˆ๋ฆฌ(dict)) = json.load(๋ณ€์ˆ˜๋ช…)

 

 

 

 

 

 

 

dump์™€ dumps ์ฐจ์ด 

 dumps๋Š” ๋ฐ”๋กœ JSON๊ฐ์ฒด๋กœ string ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉ์ด ์šฉ์ดํ•˜๊ณ , ๋ฐ˜๋ฉด dump๋Š” ๋‘๋ฒˆ์งธ ์ธ์ž๊ฐ€ fp ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด openํ•œ file ํฌ์ธํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

load์™€ loads ์ฐจ์ด

 load๋Š” openํ•œ ํŒŒ์ผ์˜ file ํฌ์ธํ„ฐ๋กœ ์ ‘๊ทผํ•˜์—ฌ JSON๊ฐ์ฒด๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋””์ฝ”๋”ฉ ํ•˜์—ฌ์ค€๋‹ค.

 

 

GET ์ด์™ธ์˜ ๋‹ค๋ฅธ HTTP ๋ฉ”์„œ๋“œ

 

1)     POST

 Ex) r = requests.post(url, data = {‘key’ : ’value’})

 

2)     PUT

 Ex) r = requests.put(url, data = {‘key’ : ‘value’})

 

3)     DELETE

 Ex) r = requests.delete(url)