240716 Today I Learn
API ํต์ ์ ๊ฐ๋
๊ฐ๋
API(Application Programming Interface)
์ํํธ์จ์ด ๊ตฌ์ฑ ์์๊ฐ ์๋ก ํต์ ํ ์ ์๊ฒ ํ๋ ๋ฐฉ์(๋ฉ์ปค๋์ฆ).
→ ํ๋ก๊ทธ๋จ๊ณผ ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ํต์ ์ ๋ฐฉ๋ฒ
- ๊ฐ๋จํ ํธ์ถ๊ตฌ๋ฌธ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ก์ ๋ฐ์ ์ ์์.
- ์คํ API ๋, ๊ธฐ์ ๋ด ๋ฐ์ดํฐ๋ฅผ ์ผ๋ฐ ์ฌ์ฉ์์๊ฒ ๊ณต๊ฐํ๋ ๊ฒ
์ญํ ๋ฐ ํน์ง
- ๊ถํ๊ด๋ฆฌ
- ๋ง์ ๋ฐ์ดํฐ๊ฐ ์ ์ฌ(์ ์ฅ)๋๋ DB ์๋ ๋ชจ๋ ์ฌ๋๋ค์ด ์ด DB์ ์ ๊ทผํ๋ฉด ๋ณด์์์ ์ด์๊ฐ ๋ฐ์ํ ์ ์์.
- API ๋ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ๊ทผ์ด ํ์ฉ๋ ๋ก์ปฌ์๊ฒ๋ง ๊ถํ์ ๋ถ์ฌํ๋ ‘์ค๊ฐ๊ด๋ฆฌ์’ ์ญํ ์ ์ํ
- ํ๋ก๊ทธ๋จ ๊ฐ (์ํํ) ํต์ ์ง์
- API ๋ ์์นซ ์ด๋ ค์ด ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์งํ ์ ์๋ ๋ถ๋ถ์ ํค๊ฐ์ ํตํด ๊ฐํธํ ํต์ ์ ์ง์
- ํด๋น ํค๊ฐ์๋ ํ ๋น๋(ํธ์ถ๋)์ด ๋ถ์ฌ๋๊ณ , ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ํ ๋น๋์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ ๊ณผ๊ธ๋๋ ๊ฒฝ์ฐ๋ ์์.
- ์ ์ ํ์คํ → ์ด ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ค๋ฉด ๊ท์น์ ์ง์ผ์ ์ ๊ทผํด๋ผ
- DB์ ์ ๊ทผํ๋ ์์ฒญ์ ํ์คํ
- ๋ฐ์ดํฐ API ์ ๊ทผ์ ๊ท์น์ ๋์ด์ฃผ๋ ๊ฒ์ด ๋๊ณ , ์ด๊ฒ์ด ๊ณง API ํ์คํ
์ข ๋ฅ ๐ํ์ฉ ๋ฒ์์ ๊ด๋ จ
- Public API : ๋๊ตฌ๋ ์ฌ์ฉ๊ฐ๋ฅํ ๊ณต๊ฐ API
- Private API : ์ฌ๋ด์์ ์ฌ์ฉํ๋ API
- Partner API : ๋ฏธ๋ฆฌ ์ ํด๋์ ์ฌ์ฉ์๋ค๋ง ์ฐ๋ API
- Window API : ์ด์์ฒด์ ๋์ API
๋ฐ์ดํฐ ํฌ๋งท
- JSON : JavaScript์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ๋ ํํ์
- ์น๋ธ๋ผ์ฐ์ ์์์ ์๋ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์ ์กํ ๋ชฉ์ ์ผ๋ก ๋์์ธ๋ ๊ฒฝ๋์ DATA ๊ตํํ์
- ์์ฑ๊ตฌ์กฐ๊ฐ ๋งค์ฐ ๊ฐ๋จํ๊ณ ํ ํ๋ก๊ทธ๋๋ฐ์ธ์ด์์๋ ์ฉ์ดํ๊ฒ ์์ฑํ ์ ์๋ค๋ ๋ฒ์ฉ์ฑ ์ธก๋ฉด์์ ๊ฐ์ ์ด ์์.
- ๋จ์ํ ์ค๊ดํธ({})์ ๋ฐ์ดํฐ๊ฐ์ ์ผ๋ ฌ๋ก ๋์ด ํ ๊ฐ ๋ฐ์ดํฐ๊ฐ๋ง๋ค comma(,)๋ก ๊ตฌ๋ถ
- XML : ๋ฐ์ดํฐ๋ฒ ์ด์ค์์์ ๋ฐ์ดํฐํ๋๊ฐ์ ์ด๋ค ๊ตฌ์กฐ๋ก ๋ฐฐ์นํด ์ ์ฅํ ๊ฒ์ธ๊ฐ๋ฅผ ์ ์
- <>์์ ํน์ ์์๋ฅผ ๋ฃ์ผ๋ฉด ํด๋น ํ๊ทธ ์์ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ์ ํด๋น ์์์ ๋ฐ์ดํฐํ๋๊ฐ์ผ๋ก ์ ์๊ฐ ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์.
- ํ๊ทธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๊ฐ์ ๊ตฌ์กฐ์ ์์น๋ฅผ ์ ์
API ํต์ ์ ์๋ฆฌ
HTTP API ํต์
๐ก ํ๋กํ ์ฝ(Protocal)
๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์์๊ณผ ๊ท์น์ ์ฒด๊ณ๋ก, ํต์ ๊ท์ฝ
→ ์ธํฐ๋ท์์๋ TCP์ IP๋ผ๋ ํ๋กํ ์ฝ์ด ํ์ค์ผ๋ก ์ฌ์ฉ๋จ.
์์ฉ(Application) HTTP, SMTP, FTP, Telnet ํํ(Presentation) ASCII, MPEG, JPEG, MIDI ์ ์ก(Transport) TCP, UDP, SPX ๋คํธ์ํฌ(Network) IP, IPX ๋ฐ์ดํฐ ๋งํฌ(Data Link) Ethernet, Token Ring, FDDI, Apple Talk
- HTTP ํ๋กํ ์ฝ: ์น ๋ธ๋ผ์ฐ์ ๋ก ์น ์ฌ์ดํธ์ ์ ์ํ ๊ฒฝ์ฐ ๋ฐ๋ฅด๋ ๊ท์ฝ์ ๋ํ ํ๋กํ ์ฝ
- IP ํ๋กํ ์ฝ: ํ ์ปดํจํฐ์ ๋ค๋ฅธ ์ปดํจํฐ๊น์ง ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ์ํ ์ ์ฐจ์ ๋ฐฉ๋ฒ์ ์ ํ ํ๋กํ ์ฝ
- TCP ํ๋กํ ์ฝ: ๋คํธ์ํฌ์ ํผ์ก๋ ๋ฑ์ ๊ณ ๋ คํด ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ ์ดํ๊ณ ๋ฐ์ดํฐ๊ฐ ์ ํํ ๋์ฐฉํ ์ ์๊ฒ ํ๋ ์ ์ฐจ์ ๋ฐฉ๋ฒ์ ์ ํ ํ๋กํ ์ฝ
- ํ๋กํ ์ฝ ์ฃผ์ ๊ธฐ๋ฅ
- ๋จํธํ : ์ก์ ์ธก์์ ๊ธด ๋ฐ์ดํฐ ๋ธ๋ก์ ์์ฝ๊ฒ ์ ์กํ ์ ์๋๋ก ํฌ๊ธฐ๊ฐ ๋๊ฐ์ ์์ ๋ธ๋ก์ผ๋ก ๋๋์ด ์ ์ก
- ์ฌํฉ์ฑ : ์์ ์ธก์์ ์ชผ๊ฐ์ง ์์ ๋ฐ์ดํฐ ๋ธ๋ก์ ์ฌํฉ์ฑํ์ฌ ์๋์ ๋ฉ์์ง๋ก ๋ณต์ํ๋ ๊ธฐ๋ฅ
- ์บก์ํ: ๊ฐ ํ๋กํ ์ฝ์ ์ ํฉํ ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ง๋ค๋ ค๊ณ ๋ฐ์ดํฐ์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ
๐ก HTTP API
HTTP๋ฅผ ์ด์ฉํด ํ๋ก๊ทธ๋จ๋ผ๋ฆฌ ์ํตํ๋ API๋ก, ์ฐ๋ฆฌ๊ฐ ํํ ๋ณด๋ OPEN API, facebook API, kakao API ๋ฑ์ ๋๋ถ๋ถ API๋ HTTP๋ผ๋ ํต์ ๊ท์น์ผ๋ก ์ํตํ๋ API
→ HTTP๋ฅผ ์ฌ์ฉํด์ ์๋ก ์ ํด๋ ์คํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ํต์ ํ๋ ๊ฒ
REST API ํต์
๐ก REST API
REST๋ HTTP๋ฅผ ์ ํ์ฉํ๊ธฐ ์ํ ์์น์ผ๋ก REST API๋ ๋ฐ๋ก ์ด ์์น์ ์ค์ํด ๋ง๋ API
- HTTP ํต์ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ฉด์, ์๋ 4๊ฐ์ง ์ถ๊ฐ ๊ท์ฝ์ ๋ฐ๋ฅธ๋ค.
- ์์์ ์๋ณ
- ๋ฉ์ธ์ง๋ฅผ ํตํ ๋ฆฌ์์ค ์กฐ์
- ์๊ธฐ์์ ์ ๋ฉ์ธ์ง
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ์ ๋ํ ์์ง์ผ๋ก์ ํ์ดํผ๋ฏธ๋์ด(HATEOAS)
API ํต์ ์ ๋ฐ์ฌํญ
- API ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ์ฌ์ดํธ์์ OPEN API ๋ฅผ ํด๋ฆญํ ๋ค ์ธ์ฆํค ์ ์ฒญ์ ์งํ
- ์๋น์ค ์ฌ์ฉํ๊ฒฝ ๋ฐ ์ฌ์ฉ URL์ ์ค์
- ์ฌ์ฉ URL์ localhost* ๋ก ๊ธฐ์
- ๋ฐ๊ธ๋ฐ์ ์ธ์ฆํค๋ฅผ ์ํ URL์ ๋น ์๋ฆฌ์ ๋ฃ์ด์ฃผ๊ธฐ
๋๋ณด๊ธฐ
๋งฅ๋ถ์์ localhost ์ฐพ๊ธฐ
์ค์ - ์ผ๋ฐ - ์์คํ ๋ฆฌํฌํธ
๋คํธ์ํฌ - IPv4 ์ฃผ์ ํ์ธ
Python ์ค์ต
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
# requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
pip install requests
# ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ
import requests
import pprint
import json
import pandas as pd
- requests๋ python ์ผ๋ก HTTP ํธ์ถ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฃผ์ ํจ์๋ ์๋ 4๊ฐ์ง๊ฐ ์กด์ฌ
- GET : ์์ฒญ, ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
- POST : ์์ฑ, ์ก์
- PUT : ์์ , ๋ฎ์ด์์ฐ๊ธฐ
- DELETE : ์ญ์
์ค์ต
# ์์ธ์ ์ด๋ฆฐ๊ด์ฅ์์ ๋ณต์ฌํด์จ KEY ๊ฐ๊ณผ URL ์ ๊ธฐ์
# url ์ค xml ๋ถ๋ถ์ json ์ผ๋ก ๋ณ๊ฒฝ
url = 'http://openapi.seoul.go.kr:8088/key๊ฐ/json/ServiceInternetShopInfo/1/5/'
# request library ๋ฅผ ์ด์ฉํ json file ๋ก๋ํ๊ธฐ
response = requests.get(url).json()
# json ํ์ผ์ row ๋ฐ์ดํฐ ๋ก๋
# response['ServiceInternetShopInfo']['row']
# json file ํ์์ dataframe ์ผ๋ก ๋ฐ์์ฃผ๊ธฐ
raw1 = pd.DataFrame(response['ServiceInternetShopInfo']['row'])
raw1.head()
# json file ์ key ๊ฐ ํ์ธํ๊ธฐ (๊ฐ ๋์
๋๋ฆฌ ๊ฐ์ผ๋ก ์ด๋ค์ ธ์์)
response['ServiceInternetShopInfo'].keys()
# json ๋ฐ์ดํฐ ํ์ธ
response
## {'ServiceInternetShopInfo': {'list_total_count': 129917,
## 'RESULT': {'CODE': 'INFO-000', 'MESSAGE': '์ ์ ์ฒ๋ฆฌ๋์์ต๋๋ค'},
## 'row': [{'COMPANY': '์ํฌ / ANGCH',
## 'SHOP_NAME': '์ํฌ / ANGCH',
## 'DOMAIN_NAME': 'www.angch.co.kr',
## 'TEL': 'ํ์ธ์๋จ',
## 'EMAIL': 'halo_an@naver.com',
## 'UPJONG_NBR': '',
## 'YPFORM': ' ์ผ๋ฐ์ผํ๋ชฐ',
## 'FIRST_HEO_DATE': '2021-05-24',
## 'COM_ADDR': 'ํ์ธ์๋จ',
## 'STAT_NM': 'ํด์
์ค',
## 'TOT_RATINGPOINT': '1',
## 'CHOGI_RATINGPOINT': '0',
## 'CHUNG_RATINGPOINT': '3',
## 'DEAL_RATINGPOINT': '0',
## 'PYOJUN_RATINGPOINT': '3',
## 'SECURITY_RATINGPOINT': '3',
## 'SERVICE': '',
## 'CHUNG': '๊ฐ๋ฅ',
## 'CHOGI': '',
## 'GYULJE': '',
## 'PYOJUN': 'ํ์ค์ฝ๊ด ์ฌ์ฉ',
## 'P_INFO_CARE': '์ด๊ธฐํ๋ฉดํ์',
## 'PER_INFO': '',
'๐ Data Analysis > ๐๏ธ Note' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐ์ดํฐ ์์ง ๋ฐฉ๋ฒ ํน๊ฐ #2 ํฌ๋กค๋ง (0) | 2024.08.27 |
---|---|
ํต๊ณํ ๊ธฐ์ด (3) ANOVA, ์ ํํ๊ท๋ถ์ (0) | 2024.05.29 |
ํต๊ณํ ๊ธฐ์ด (2) ํต๊ณ์ ๊ฐ์ค๊ฒ์ (0) | 2024.05.28 |
ํต๊ณํ ๊ธฐ์ด (1) ํ๊ท ์ด๋ ๋ฌด์์ธ๊ฐ? (0) | 2024.05.27 |
๋ฐ์ดํฐ ๋ฆฌํฐ๋ฌ์ (0) | 2024.05.07 |