๊ฐ๋ฐํ ์ฝ๋ฉ ํ ์คํธ ๊ฐ๋ ์ ๋ฆฌ
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)