Jayden1116 2022. 1. 27. 23:34

ν‚€μ›Œλ“œ : API, RESTful API

API(Application Programming Interface)

ν”„λ‘œκ·Έλž¨λ“€μ΄ μ„œλ‘œ μ†Œν†΅ν•  수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€

ν”„λ‘œκ·Έλž¨μ„ λ‹€λ£° 수 μžˆλŠ” μ‘°μž‘ 방법 ν˜Ήμ€ 메뉴얼

  • μŒμ‹μ μ— λ“€μ–΄κ°„λ‹€.
  • 메뉴λ₯Ό 보고 주문을 ν•œλ‹€.
  • 주방에 μ£Όλ¬Έ λ‚΄μš©μ„ μ „λ‹¬ν•œλ‹€.
  • 주문된 μŒμ‹μ„ λ§Œλ“ λ‹€.
  • μ™„μ„±λœ μŒμ‹μ„ μ†λ‹˜μ—κ²Œ λ“œλ¦°λ‹€.

ν΄λΌμ΄μ–ΈνŠΈ : μŒμ‹μ μ—μ„œ λ­”κ°€λ₯Ό μš”μ²­ν•˜λŠ” 'μ†λ‹˜'
λ©”λ‰΄νŒ : API(사전에 μ•½μ†λœ κ·œμΉ™λ“€κ³Ό 절차)
(API)μ„œλ²„ : 웨이터(μŒμ‹μ„ μ£Όλ¬Έν•˜λ©΄ μŒμ‹μ„ μ „λ‹¬ν•΄μ£ΌλŠ” μ—­ν• )
(Service)μ„œλ²„ : μš”λ¦¬μ‚¬(μ‹€μ§ˆμ μœΌλ‘œ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” μ—­ν• )

λ©”λ‰΄νŒμ€ 단지 λ¬Έμ„œμΈ κ²ƒμ²˜λŸΌ API μ—­μ‹œ 싀체가 μ—†λ‹€.
μŒμ‹μ„ λ°›μ•„μ•Ό κ·Έ μŒμ‹μ˜ μ‹€μ œ λ‚΄μš©μ„ 확인할 수 μžˆλ“―μ΄, API μ—­μ‹œ κ²°κ³Ό ν˜Ήμ€ Return Value λ₯Ό λ°›μ•„μ•Ό 싀체λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

또, μ†λ‹˜μ΄ 햄버거λ₯Ό μ£Όλ¬Έν–ˆλŠ”λ° 피클을 빼달라고 μš”μ²­μ„ ν•˜κ²Œ 되면 웨이터가 직접 피클을 빼주지 μ•ŠμŠ΅λ‹ˆλ‹€. μ£Όλ°©μ—μ„œ μš”λ¦¬λ₯Ό μ œμž‘ν•  λ•Œ μ΄λŸ¬ν•œ 뢀뢄을 μ²˜λ¦¬ν•˜κ²Œ λ©λ‹ˆλ‹€. 이처럼 κ²°κ΅­μ—λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ μ„œλ²„μ—μ„œ 응닡해야 ν•©λ‹ˆλ‹€.

API μ˜ˆμ‹œ : μ˜€ν”ˆ API, 곡곡데이터 API, ꡬ글/카카였 API λ“± (μ •ν™•νžˆλŠ” μ „λΆ€ WEB API)
λ˜ν•œ, Python의 pandas, scikitlearn λ“± 도 API둜 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

APIλ₯Ό 톡해 데이터λ₯Ό 받아왔을 λ•Œ λ°μ΄ν„°μ˜ ν˜•μ‹μ€ λ¬΄μ—‡μΌκΉŒ?

정해진 ν˜•μ‹μ€ μ—†μœΌλ‚˜, 보톡 μ ‘ν•˜κ²Œ 될 수 μžˆλŠ” 응닡은 λŒ€λΆ€λΆ€λΆ„ JSON ν˜•μ‹

JSON(JavaScript Object Notation)

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 'Object'λ₯Ό ν‘œκΈ°ν•˜λŠ” 방식
  • 파이썬의 'Dictionary'와 ꡉμž₯히 μœ μ‚¬ν•©λ‹ˆλ‹€.
  • 파이썬의 Dictionary처럼 ν‚€(Key)와 κ°’(Value)둜 λ¬Άμ—¬μ Έ μžˆλŠ” ꡬ쑰

JSON의 μ˜ˆμ‹œ

{
  "glossary":{
    "title":"example glossary",
    "GlossDiv":{
      "title":"S",
      "GlossList":{
        "GlossEntry":{
          "ID":"SGML",
          "SortAs":"SGML",
          "GlossTerm":"Standard Generalized Markup Language",
          "Acronym":"SGML",
          "Abbrev":"ISO 8879:1986",
          "GlossDef":{
            "para":"A meta-markup language, used to create markup languages such as DocBook.",
            "GlossSeeAlso":[
              "GML",
              "XML"
            ]
          },
          "GlossSee":"markup"
        }
      }
    }
  }
}

HTTP(HyperText Transfer Protocol ; ν•˜μ΄νΌν…μŠ€νŠΈ 톡신 κ·œμ•½) API

ν•˜λ‚˜μ˜ 컴퓨터가 λ‹€λ₯Έ 컴퓨터와 μ†Œν†΅μ„ ν•˜κ³  싢을 λ•Œ(νŒŒμΌμ„ λ°›κ±°λ‚˜, μ „λ‹¬ν•˜κ±°λ‚˜ λ“±) 정해진 κ·œμΉ™κ³Ό 틀을 μ€€μˆ˜ν•΄μ•Ό μ›ν™œν•œ μ†Œν†΅μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
μ΄λ ‡κ²Œ 정해진 κ·œμΉ™λ“€μ„ ν•˜λ‚˜μ˜ κ·œμ•½(Protocol)이라고 ν•©λ‹ˆλ‹€.

이 λ•Œ, HTTPλŠ” 'μ›Ήμ—μ„œ 톡신할 λ•Œ μ‚¬μš©λ˜λŠ” κ·œμ•½' μž…λ‹ˆλ‹€.
HTTPλŠ” 크게 μš”μ²­(Request) κ³Ό 응닡(Response) 으둜 λ‚˜λ‰˜μ–΄μ Έ μžˆμŠ΅λ‹ˆλ‹€.

HTTP Request(μš”μ²­)

μš”μ²­ν•˜λŠ” 컴퓨터가 ν΄λΌμ΄μ–ΈνŠΈ, μš”μ²­μ„ λ°›λŠ” 컴퓨터가 μ„œλ²„κ°€ λ©λ‹ˆλ‹€.

CRUD(CREATE, READ, UPDATE, DELETE)

HTTP λ©”μ†Œλ“œμ˜ 경우,

  • POST(CREATE) : μ„œλ²„ 츑의 νŠΉμ • λ¦¬μ†ŒμŠ€λ₯Ό μ €μž₯ν•  λ•Œ μ‚¬μš© ex) νšŒμ›κ°€μž…ν•  λ•Œ νŠΉμ • μœ μ €μ˜ 정보λ₯Ό μ„œλ²„μ— μ €μž₯
  • GET(READ) : νŠΉμ • λ¦¬μ†ŒμŠ€λ₯Ό 달라고 ν•  λ•Œ μ‚¬μš© ex) νŽ˜μ΄μ§€ λ‘œλ”©ν•  λ•Œ
  • PUT/PATCH(UPDATE) : μ„œλ²„ 츑의 νŠΉμ • λ¦¬μ†Œλ₯΄λ₯Ό μ—…λ°μ΄νŠΈν•  λ•Œ μ‚¬μš©, PUT-데이터 μ „λΆ€ λ³€κ²½ν•  λ•Œ, PATCH-λΆ€λΆ„μ μœΌλ‘œ λ³€κ²½ν•  λ•Œ
    ex) μ‚¬μš©μžλ‹‰λ„€μž„ λ³€κ²½
  • DELETE(DELETE) : μ„œλ²„ 츑의 νŠΉμ • λ¦¬μ†ŒμŠ€λ₯Ό μ‚­μ œν•  λ•Œ ex) μœ μ € νƒˆν‡΄

APIλ₯Ό μ œμž‘ν•  λ•Œμ—λŠ” 보톡 REST κ°€μ΄λ“œλΌμΈμ„ λ”°λ₯΄κ²Œ 되고 이 λ•Œ HTTP λ©”μ†Œλ“œλ“€μ΄ μ‚¬μš©λ©λ‹ˆλ‹€.

ν˜„μž¬λŠ” μ΄λŸ¬ν•œ REST ꡬ쑰λ₯Ό λŒ€λΆ€λΆ„ λ”°λ₯΄κ³  μžˆμ–΄ μ•Œκ³  있으면 νŽΈν•©λ‹ˆλ‹€.

기본적인 APIλ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄ CRUD에 ν•΄λ‹Ήν•˜λŠ” μœ„μ˜ 4κ°œλŠ” μ•Œκ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

HTTP Response(λ°˜μ‘)

HTTP κ·œμ•½μ„ ν†΅ν•΄μ„œ 보낸 μš”μ²­μ— λŒ€ν•œ λ°˜μ‘ λ˜ν•œ κ·œμ•½μ— λ”°λ₯Έ μ‘λ‹΅μœΌλ‘œ λŒμ•„μ˜΅λ‹ˆλ‹€.
STATUS CODE

  • 100 λ²ˆλŒ€ : 정보 응닡
  • 200 λ²ˆλŒ€ : 성곡 응닡
  • 300 λ²ˆλŒ€ : λ¦¬λ‹€μ΄λ ‰μ…˜ λ©”μ‹œμ§€(λ‹€λ₯Έ 방법을 μ œμ‹œν•˜λŠ” λ©”μ‹œμ§€)
  • 400 λ²ˆλŒ€ : ν΄λΌμ΄μ–ΈνŠΈ μ—λŸ¬ 응닡
  • 500 λ²ˆλŒ€ : μ„œλ²„ μ—λŸ¬ 응닡

HTTP μ˜ˆμ‹œ

μ›Ή νŽ˜μ΄μ§€λ₯Ό μ—΄μ–΄μ„œ 개발자 도ꡬλ₯Ό μ—° 뒀에 λ„€νŠΈμ›Œν¬ νƒ­μœΌλ‘œ λ“€μ–΄κ°€λ©΄ μ‹€μ œλ‘œ λ³΄λ‚΄μ§€λŠ” HTTP μš”μ²­κ³Ό 응닡을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 'Request Method': 이전에 봀던 HTTP μš”μ²­ λ©”μ†Œλ“œ 쀑 GET, λ¦¬μ†ŒμŠ€λ₯Ό κ°€μ Έμ˜¨λ‹€λŠ” 뜻인 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • 'Status Code' : 200 μ΄λΌλŠ” 숫자 μ•žμ— μ΄ˆλ‘μƒ‰ 뢈이 λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€. 200 은 'OK', μ„±κ³΅ν–ˆλ‹€λŠ” λœ»μž…λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œλŠ” GET μš”μ²­μ΄ μ„±κ³΅μ μ΄μ—ˆλ‹€λŠ” 뜻이 λ©λ‹ˆλ‹€.
  • 'Request URL' : λˆ„κ°€ μš”μ²­μ„ ν•˜κ³  μžˆλŠ”μ§€λ₯Ό λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • 'Remote Address' : μ–΄λŠ 리λͺ¨νŠΈ μ„œλ²„μ— μš”μ²­μ„ ν•˜κ³  μžˆλŠ”μ§€ μ•Œλ €μ£Όκ³  μžˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬λŠ” 157.245.183.96 의 443 ν¬νŠΈμ— μš”μ²­μ„ 보내고 μžˆμŠ΅λ‹ˆλ‹€.
  • 'Referrer Policy' : μš”μ²­μ„ λ³΄λ‚΄λŠ” 곳이 λ‹Ήμ‚¬μžμΈμ§€, 타 μ›Ήμ‚¬μ΄νŠΈμ—μ„œ μ—°κ²°λœ 건지 λ“± μ•Œλ €μ€λ‹ˆλ‹€. ν˜„μž¬λŠ” 'no-referrer' 둜 ν˜„ μ›Ήμ‚¬μ΄νŠΈμ—μ„œ 보내고 μžˆμŠ΅λ‹ˆλ‹€.

REST(REpresentational State of Transfer) API

μ†Œν”„νŠΈμ›¨μ–΄μ˜ 아킀텍쳐λ₯Ό μ–΄λ–»κ²Œ ν˜•μ„±ν• μ§€μ— λŒ€ν•œ κ°€μ΄λ“œλΌμΈμœΌλ‘œ 총 6κ°œκ°€ μ‘΄μž¬ν•˜λ©° λ‹€ λ”°λ₯΄κ²Œ λœλ‹€λ©΄ ν•΄λ‹Ή 아킀텍쳐λ₯Ό RESTful 이라 ν•©λ‹ˆλ‹€.

λ§ˆμ°¬κ°€μ§€λ‘œ WEB APIκ°€ REST의 κ°€μ΄λ“œλΌμΈλ“€μ„ λ‹€ λ”°λ₯΄λ©΄ RESTful API 라고 λΆ€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
RESTλΌλŠ” 것은 ν•˜λ‚˜μ˜ κ°€μ΄λ“œλΌμΈμ΄κ³  이λ₯Ό λ”°λ₯΄κΈ° μ‹œμž‘ν•˜λ©΄ REST API이며 6개의 λͺ¨λ“  κ°€μ΄λ“œλΌμΈμ„ 지킀면 RESTful API라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

기획자 : "κ°œλ°œμžλ‹˜, API κ°œλ°œν•  λ•Œ, REST 기반으둜 λ§Œλ“€μ–΄μ£Όμ„Έμš”"
개발자 : "κ°œλ°œμ— ν•„μš”ν•œ μ‹œκ°„μ΄ λΆ€μ‘±ν•˜κ³  ν•„μš”λ₯Ό λͺ»λŠκ»΄μ„œ, RESTfulν•œ API 둜 λ§Œλ“€μ§€ μ•Šμ•„λ„ λ κΉŒμš”?"
기획자 : "λ„€, μ’‹μŠ΅λ‹ˆλ‹€ REST κ°€μ΄λ“œλΌμΈμ— 맞게 APIλ₯Ό ν˜ΈμΆœν•  수 μžˆλ„λ‘ κ°œλ°œν•΄μ£Όμ„Έμš”"

HTTP API도 μ‚¬λžŒλ“€μ΄ 지킀지 μ•Šμž ν•œ 박사가 쒀더 μ—„κ²©ν•œ κ·œμ •μ„ λ§Œλ“  것이 REST API μž…λ‹ˆλ‹€.

REST API ν™œμš© μ˜ˆμ‹œ(1)-REQUEST-GET )

GET μš”μ²­μ€ REST μ—μ„œ μ •λ³΄λ‚˜ λ¦¬μ†ŒμŠ€λ₯Ό 가지고 올 λ•Œλ§Œ μ‚¬μš©ν•˜λΌκ³  μ œμ‹œλ©λ‹ˆλ‹€.(즉, μ„œλ²„μ— 기둝된 λ°μ΄ν„°λ‚˜ λ¦¬μ†ŒμŠ€λ₯Ό λ³€κ²½ν•  λ•Œ μ‚¬μš©ν•΄μ„œλŠ” μ•ˆλœλ‹€λŠ” 뜻)

  1. HTTP GET http://www.appdomain.com/users
  2. HTTP GET http://www.appdomain.com/users?size=20&page=5
  3. HTTP GET http://www.appdomain.com/users/123
  4. HTTP GET http://www.appdomain.com/users/123/address

1번 같은 κ²½μš°μ—λŠ” /users 둜 λλ‚˜κ³  μ„œλ²„μ— 기둝된 μœ μ €λ“€μ„ κ°€μ Έμ˜¬ 거라고 μ˜ˆμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
2번 같은 κ²½μš°μ—λŠ” λ§ˆμ°¬κ°€μ§€λ‘œ μœ μ €λ₯Ό 가지고 μ˜€μ§€λ§Œ μΆ”κ°€ 쿼리 νŒŒλΌλ―Έν„° (? 뒀에 μ˜€λŠ” ν•­λͺ©λ“€)λ₯Ό 톡해 νŽ˜μ΄μ§€μ™€ 개수λ₯Ό μ •ν•΄μ£Όκ³  μžˆμŠ΅λ‹ˆλ‹€.
3번 같은 κ²½μš°μ—λŠ” μœ μ €λ₯Ό 가지고 μ˜€μ§€λ§Œ μœ μ € λͺ©λ‘ μ€‘μ—μ„œ 123 에 μΌμΉ˜ν•˜λŠ” μœ μ €λ₯Ό 가지고 올 κ±°λΌλŠ” μ˜ˆμƒμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
4번 같은 κ²½μš°μ—λŠ” 3번의 μœ μ € μ •λ³΄μ—μ„œ address μ •λ³΄λ§Œ 가지고 올 κ±°λΌλŠ” μ˜ˆμƒμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

REST API ν™œμš© μ˜ˆμ‹œ(2)-RESPONSE

200 (OK)
201 (Created)
202 (Accepted)
204 (No Content)
301 (Moved Permanently)

μΆ”κ°€)

openweather API μ˜ˆμ‹œ

import requests
import json

API_URL = 'https://api.openweathermap.org/data/2.5/weather?q=Seoul&appid=3b8fb7eea967548d8cb2837639e4ca9e'

raw_data = requests.get(API_URL)

parsed_data = json.loads(raw_data.text)

print(parsed_data)

json.loads()λŠ” raw_data의 str ν˜•νƒœλ₯Ό 파이썬의 dictionary ν˜•νƒœλ‘œ λ°”κΏ”μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€.

  • JavaScript : JSON, True와 False κ°€ μ†Œλ¬Έμžλ‘œ ν‘œν˜„, μŒλ”°μ˜΄ν‘œλ§Œ μ‚¬μš©
  • Python : Dictionary

json.loads() : 파이썬의 Dictionary ν˜•νƒœλ‘œ λ°”κΏ”μ€λ‹ˆλ‹€.
json.dumps() : loads μ™€λŠ” 거꾸둜 JavaScript의 json ν˜•νƒœ(νŒŒμ΄μ¬μ—μ„œμ˜ ν˜•μ‹μ€ strν˜•)으둜 λ°”κΏ”μ€λ‹ˆλ‹€.