๐Ÿ“Š Data Analysis/๐Ÿ—‚๏ธ Note

๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐฉ๋ฒ• ํŠน๊ฐ• #1 API

ny:D 2024. 7. 16. 20:59

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)
๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ์–‘์‹๊ณผ ๊ทœ์น™์˜ ์ฒด๊ณ„๋กœ, ํ†ต์‹  ๊ทœ์•ฝ
์‘์šฉ(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
→ ์ธํ„ฐ๋„ท์—์„œ๋Š” TCP์™€ IP๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์ด ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ๋จ.
  • 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 ํ†ต์‹  ์ œ๋ฐ˜์‚ฌํ•ญ

  1. API ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์‚ฌ์ดํŠธ์—์„œ  OPEN API ๋ฅผ ํด๋ฆญํ•œ ๋’ค ์ธ์ฆํ‚ค ์‹ ์ฒญ์„ ์ง„ํ–‰
  2. ์„œ๋น„์Šค ์‚ฌ์šฉํ™˜๊ฒฝ ๋ฐ ์‚ฌ์šฉ URL์„ ์„ค์ •
  3. ์‚ฌ์šฉ URL์€ localhost* ๋กœ ๊ธฐ์ž…
  4. ๋ฐœ๊ธ‰๋ฐ›์€ ์ธ์ฆํ‚ค๋ฅผ ์ƒ˜ํ”Œ 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 : ์‚ญ์ œ

์‹ค์Šต

raw1.T

# ์„œ์šธ์‹œ ์—ด๋ฆฐ๊ด‘์žฅ์—์„œ ๋ณต์‚ฌํ•ด์˜จ 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': '',