๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Programming/programming

[TIL] API, HTTP, REST๊ฐœ๋… & python์œผ๋กœ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

API

'Application Programming Interface'์˜ ์•ฝ์ž๋กœ, ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

(ํ”„๋กœ๊ทธ๋žจ๋“ค์˜ ์†Œํ†ต์€ ๋‹น์—ฐํžˆ code๋กœ ํ•˜๊ฒ ์ฃ ?!) ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป


๊ทธ๋ ‡๋‹ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ญ˜๊นŒ์š”?!

์‚ฌ์ „์  ์˜๋ฏธ๋กœ๋Š” '์–ด๋– ํ•œ ๋‘ ๊ฐ€์ง€์˜ ์˜์‚ฌ์†Œํ†ต์„ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฌผ๋ฆฌ์ , ๊ฐ€์ƒ์  ๋งค๊ฐœ์ฒด'์ž…๋‹ˆ๋‹ค.

๊ต‰์žฅํžˆ ์ถ”์ƒ์ ์ธ ์˜๋ฏธ์ด๊ธด ํ•˜์ง€๋งŒ, ์ €ํฌ๋Š” ์ด๋ฏธ ๋งŽ์€ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

๊ทธ์ค‘์˜ ํ•˜๋‚˜๋กœ UI(User Interface : ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค)์˜ ํ•˜๋‚˜์ธ GUI(Graphic User Interface)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ, CLI์™€ GUI์— ๋Œ€ํ•œ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค :)

์ง๊ด€์ ์œผ๋กœ UI๋Š” ๋””์ง€ํ„ธ ๊ธฐ๊ธฐ์— ๋ช…๋ น์— ๋‚ด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค! ์˜ˆ๋ฅผ ๋“ค์–ด, ์ €ํฌ๊ฐ€ ์•ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ์ฃผํ•˜๋Š” ๋ชจ๋“  ๋””์ž์ธ, ๊ธฐ์ˆ  ๋“ฑ์˜ ์ „๋ฐ˜์ ์ธ ๋ชจ๋“  ๊ฒƒ๋“ค์„ ํฌํ•จํ•˜๋Š” ๊ฑฐ์ฃ !

์šฐ์„  ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๊ณ  ์˜ค๋Š˜์˜ ์ฃผ์ œ์ธ API๋กœ ๊ฐ€๋ด…์‹œ๋‹ค.

 

API

์ฒ˜์Œ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ €๋„ API์— ๋Œ€ํ•œ ์ง๊ด€์ ์ธ ์ดํ•ด๋ฅผ ํ•˜๊ณ  ์‹ถ์–ด์„œ ๋งŽ์€ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„๋ดค๋Š”๋ฐ, ์ด ๋ง์ด ๋”ฑ ์™€๋‹ฟ์•˜์Šต๋‹ˆ๋‹ค. 

"API๋Š” ํ‚ค๋ณด๋“œ์™€ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค!" - ๋…ธ๋งˆ๋“œ ์ฝ”๋”

ํ‚ค๋ณด๋“œ์˜ ๊ธฐ๋Šฅ๋“ค์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘์—…ํ•˜๋Š”์ง€๋Š” ์•Œ ์ˆ˜ ์—†์ง€๋งŒ, ์–ด๋– ํ•œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ฒฐ๊ณผ๊ฐ’์„ ๋Œ๋ ค๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”!

์š”์ฆ˜ ํšŒ์›๊ฐ€์ž…ํ•  ๋•Œ ์นด์นด์˜ค๋กœ ๋กœ๊ทธ์ธ, ๊ตฌ๊ธ€๋กœ ๋กœ๊ทธ์ธ, ๋„ค์ด๋ฒ„๋กœ ๋กœ๊ทธ์ธ ๋“ฑ์˜ ์„œ๋น„์Šค๊ฐ€ ๊ต‰์žฅํžˆ ๋งŽ์ฃ ?

์–ด๋–ค ์ฝ”๋“œ๋กœ ํ•ด๋‹น API๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š”์ง€๋Š” ์•Œ ์ˆ˜ ์—†์ง€๋งŒ, ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜๋Š” ์žˆ์ฃ ?


HTTP์™€ HTTPS ๊ทธ๋ฆฌ๊ณ  REST API

HTTP(HyperText[๊ฐ์ฃผ:1] Transfer Protocol)๋Š” ์ปดํ“จํ„ฐ๋“ค์˜ ํ†ต์‹  ๊ทœ์•ฝ(protoco) ์ค‘ ํ•˜๋‚˜๋กœ, ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ[๊ฐ์ฃผ:2]์ž…๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด ์ปดํ“จํ„ฐ๋“ค์ด ํ†ต์‹  ๊ฐ„์— ์‚ฌ์šฉํ•˜๋Š” "ํ˜•์‹"์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฌ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ์ด๋ฏธ์ง€๋Š” ์‚ฌ๋žŒ์ด ์•„๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค. ๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ, ์ด๋ฆ„, ์šฐํŽธ๋ฒˆํ˜ธ ๋“ฑ์„ ์ ๋Š” ํ˜•์‹!

์ถœ์ฒ˜ : https://parksunny.tistory.com/165

ํ•˜์ง€๋งŒ ์ปดํ“จํ„ฐ๋Š” ๋ชป ์•Œ์•„๋“ฃ๊ฒ ์ฃ ? HTTP๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ์•Œ์•„๋“ค์„ ์ˆ˜ ์žˆ๋Š” ํ˜•์‹! ์ธ ๊ฒ๋‹ˆ๋‹ค!

๊ตฌ๊ธ€ URL

๊ทธ๋ ‡๋‹ค๋ฉด ๊ตฌ๊ธ€ ํ™ˆํŽ˜์ด์ง€ URL ์•ž์— https๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?


HTTPS(HyperText Transfer Protocol Secure)

HTTPS์˜ S๋Š” Secure ๋‹จ์–ด ๊ทธ ๋œป ์ž์ฒด๋กœ ์•ˆ์ „, ๋ณด์•ˆ์ž…๋‹ˆ๋‹ค.

HTTP์—์„œ S, ์•ˆ์ „์ด ์ถ”๊ฐ€๋˜์–ด  HTTP protocol์˜ ์•”ํ˜ธํ™”๋œ ๋ฒ„์ „์œผ๋กœ ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋˜๋Š”๋ฐ์š”,

๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์™€ ์•ˆ์ „ํ•˜๊ฒŒ ์ฃผ๊ณ ๋ฐ›๋„๋ก ๋„์™€์ค€๋‹ต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๊ธˆ์œต ํ™œ๋™์ด๋‚˜ ์˜จ๋ผ์ธ ์‡ผํ•‘!

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ๋‚˜์˜ค๋Š” ๊ฐœ๋…์ด ๋ฐ”๋กœ ์•”ํ˜ธํ™”! ๋Œ€์นญํ‚ค, ๋น„๋Œ€์นญํ‚ค ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐœ๋…์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์— ๊ฐ€๋ณ๊ฒŒ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค!(์˜ˆ๊ณ ํŽธ)


REST API (REpresentational State of Transfer)

REST(REpresentational State)

  • HTTP ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠน์ • ๊ฐ€์ด๋“œ๋ผ์ธ๋“ค์„ ์ œ์‹œํ•˜๋Š” ๊ฒƒ
  • ์ฆ‰, REST ์•„ํ‚คํ…์ณ๋Š” HTTP๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ผ์ข…์˜ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ œ์‹œํ•ด์„œ ์›น API ์˜ ํ˜ผ๋ž€ ์†์— ์งˆ์„œ๋ฅผ ์„ธ์šฐ๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ
  • HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, ์–ด๋–ค URI์— ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๋“ฑ์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ๋„๋ฆฌ ์ง€์ผœ์ง€๋Š” ์•ฝ์†๐Ÿค™

REST API

  • REST ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค API๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ
  • ์›น์—์„œ ์‚ฌ์šฉํ•จ(HTTP ๊ฐ€์ด๋“œ๋ผ์ธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํ•˜๊ฒ ์ฃ ?!)

RESTful API

  • REST๋ผ๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋ชจ๋‘ ์ง€ํ‚ค๋Š” API

์ œ๊ฐ€ ์ดํ•ดํ•œ ์–ธ์–ด๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ REST์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค! ์ถ”๊ฐ€์ ์ธ ๋‚ด์šฉ์€ HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด ๋ณด๋ฉฐ ํฌ์ŠคํŒ…์œผ๋กœ ์ค€๋น„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค :) ๋ฉ”์†Œ๋“œ๋ฅผ ์กฐ๊ธˆ ๋” ์•Œ๊ณ  ์‹ถ์€ ๋ถ„๊ป˜๋Š” ํ•˜๋‹จ reference์— ์žˆ๋Š” ์–„์ฝ” ์œ ํŠœ๋ธŒ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค!


python์œผ๋กœ API ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

OpenWeather์ด๋ผ๋Š” ์‚ฌ์ดํŠธ์—์„œ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…๋งŒ ํ•˜์‹œ๋ฉด ๋ฌด๋ฃŒ๋กœ API key๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ํšŒ์›๊ฐ€์ž… -> ๋ณธ์ธ์˜ ๋‹‰๋„ค์ž„ ํด๋ฆญ -> My API Keys์— ๋“ค์–ด๊ฐ€์‹œ๋ฉด default๋กœ ์ด๋ฏธ ์ฃผ์–ด์ ธ์žˆ๊ณ , ์ถ”๊ฐ€๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

OpenWeather ์‚ฌ์ดํŠธ

 

์‚ฌ์ดํŠธ์—์„œ API๋ผ๋Š” ๋ฉ”๋‰ด๋ฐ”๋ฅผ ๋ˆ„๋ฅด๋ฉด, ๋‹ค์–‘ํ•œ API๋ฅผ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ๊ณ , ์ €๋Š” Current Weather Data API๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค!

 

API doc click!

 

Current Weather Data API

 

Current Weather Data API๋ฅผ ํด๋ฆญํ•˜๋ฉด, API call, Parameter ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์†Œ๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๋„์‹œ์˜ ์ด๋ฆ„์œผ๋กœ ๋‚ ์”จ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” 'By city name'์œผ๋กœ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ Parameters์—์„œ required๋Š” ํ•„์ˆ˜๋กœ ์ž…๋ ฅ์ด ๋˜์–ด์•ผ ํ•  ๊ฐ’, optional์€ ์„ ํƒ์‚ฌํ•ญ์ด์—์š”!

ํ™ˆํŽ˜์ด์ง€์™€ ์•„๋ž˜ ์ฝ”๋“œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ๋„์‹œ์˜ ์ด๋ฆ„๊ณผ ๋ณธ์ธ์˜ API key๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” https๊ฐ€ ๋ช…์‹œ๊ฐ€ ์•ˆ ๋˜์–ด์žˆ์ง€๋งŒ, ๊ธฐ๋ณธ์ ์ธ ์‚ฌํ•ญ์ด๋ผ ์ƒ๋žตํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค)

 

api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key}

์ฐธ๊ณ ๋กœ ์•„๋ž˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์— ์ž…๋ ฅํ•˜๋ฉด json ํ˜•ํƒœ๋กœ ๋ฐ”๋กœ ํ™•์ธ๋„ ๊ฐ€๋Šฅํ•ด์š”!

์ €๋Š” optional์œผ๋กœ ํ•œ๊ตญ์–ด[๊ฐ์ฃผ:3]๋กœ ์ œ๊ณตํ•˜๋„๋ก ์˜ต์…˜์„ ์ถ”๊ฐ€ํ–ˆ์–ด์š”:)

 

json ํŒŒ์ผ

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ํŒŒ์ด์ฌ์—์„œ ๊ฐ€์ง€๊ณ  ์™€๋ณผ๊ฒŒ์š”!

import requests
import json

API_URL = "https://api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key}"

response = requests.get(API_URL)
print(response.text)

 

ํŒŒ์ด์ฌ์—์„œ๋„ ์ž˜ ๊ฐ€์ง€๊ณ  ์™€์ง‘๋‹ˆ๋‹ค! ์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋ฉด ์•„์‹œ๊ฒ ์ง€๋งŒ txt ์ฆ‰, ํ…์ŠคํŠธ ํŒŒ์ผ๋กœ ๊ฐ€์ง€๊ณ  ์™”์–ด์š”!

 

ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰์‹œํ‚จ ํŒŒ์ด์ฌ

 

ํ•ด๋‹น txt๋ฅผ json์ด๋‚˜ dictionary๋กœ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค!

response = requests.get(url)
# print(response.text)
parsed_data = json.loads(response.text) # JSON -> dictionary
to_json = json.dump(parsed_data) # dictionary -> JSON
JSON -> dictionary ๋˜๋Š” dictionary -> JSON ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ๋ฐ”๊ฟ€ ๋•Œ ์ •๋ง ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™์•„์š”!

์ €๋Š” ํ•ด๋‹น API์—์„œ London, Seoul, Sydeny์˜ ๋‚ ์”จ๋งŒ ์™ ๋ฝ‘์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
cities = [
    "London",
    "Seoul",
    "Sydney"
]

for city in cities:
    city_url = f"https://api.openweathermap.org/data/2.5/weather?q={city}&appid={myAPIkey}&lang=kr"
    response = requests.get(city_url)
    parsed_data = json.loads(response.text)
    print(f"๋„์‹œ : {city}\t๋‚ ์”จ : ", parsed_data['weather'][0]['description'])

 

cites๋ผ๋Š” list๋ฅผ ๋งŒ๋“ค๊ณ , for ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๋ฝ‘์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ œ ์ฝ”๋“œ์—์„œ {myAPIkey}๋ผ๊ณ  ์ ํžŒ ๋ถ€๋ถ„์—๋Š” ๊ผญ ์ž์‹ ์˜ key๋ฅผ ์ ์–ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค! :)

 

ํ„ฐ๋ฏธ๋„์—์„œ ํŒŒ์ด์ฌ์„ ์‹คํ–‰์‹œํ‚จ ํ™”๋ฉด

 

์ด์ƒ API์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ณ , ๊ฐ„๋‹จํ•œ ์‹ค์Šตํ•œ ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค:)

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ฅธ API, ๋” ์‹ฌํ™”๋œ ์‹ค์Šต์„ ๊ธฐ๋กํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

REFERENCE

  1. HyperText๋Š” ์ฐธ์กฐ(ํ•˜์ดํผ๋งํฌ)๋ฅผ ํ†ตํ•˜์—ฌ ํ•œ ๋ฌธ์„œ์—์„œ ๋‹ค๋ฅธ ๋ฌธ์„œ๋กœ ์ฆ‰์‹œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ๋ฅผ ๋งํ•จ. [๋ณธ๋ฌธ์œผ๋กœ]
  2. ํ”„๋กœํ† ์ฝœ์˜ ์ข…๋ฅ˜๋Š” ๋งค์šฐ ๋งŽ๋‹ค. ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” HTTP ์™ธ์—๋„ ์ด๋ฉ”์ผ๊ณผ ๊ด€๋ จ๋œ ์ž‘์—…์„ ํ•˜๋Š” IMAP, SMTP๋“ฑ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. [๋ณธ๋ฌธ์œผ๋กœ]
  3. lang=kr [๋ณธ๋ฌธ์œผ๋กœ]