RESTful API & Swagger

merongยท2024๋…„ 4์›” 4์ผ
0

BACK-END

๋ชฉ๋ก ๋ณด๊ธฐ
3/4

ํ•„์š”์„ฑ

RESTful API

๐Ÿ’ก RESTful API๋Š” REST ์›์น™์„ ๋”ฐ๋ฅด๋ฉฐ, ์ž์›์„ ํ‘œํ˜„ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•˜๊ณ  ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

1. What is.. โ€œRESTโ€?

REST๋Š” Representational State Transfer๋กœ, ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ Client์™€ Server ์‚ฌ์ด์˜ ํ†ต์‹  ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

1) HTTP URI(Uniform Resource Identifier)๋ฅผ ํ†ตํ•ด ์ž์›(Resource)์„ ๋ช…์‹œํ•˜๊ณ 

2) HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ CRUD Operation์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ.

  • HTTP ํ”„๋กœํ† ์ฝœ?

    HTTP๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ํ†ต์‹  ๊ทœ์น™ ์„ธํŠธ(ํ”„๋กœํ† ์ฝœ).

    ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €(๋งˆ์น˜ ํฌ๋กฌ๊ณผ ์‚ฌํŒŒ๋ฆฌ)๊ฐ€ ์›น ์„œ๋ฒ„์— HTTP ์š”์ฒญ์„ ์ „์†กํ•˜๊ณ , ์›น ์„œ๋ฒ„๋Š” HTTP ์‘๋‹ต์œผ๋กœ ์‘๋‹ตํ•จ.

    • HTTP vs HTTPS(Hypertext Transfer Protocol Secure) : ์•”ํ˜ธํ™”๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ณด๋‹ค ์•ˆ์ „ํ•œ ๋ฒ„์ „!
    • HTTP์˜ ์ž‘๋™ : GET (์›น ์‚ฌ์ดํŠธ์˜ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ๋•Œ) / PUT (์ผ๋ถ€ ์ •๋ณด๋ฅผ ์ž…๋ ฅ? ์ „์†กํ•  ๋•Œ)
operationHTTP method
Create (์ƒ์„ฑ)POST
Read (์กฐํšŒ)GET
Update (์ˆ˜์ •)PUT
Delete (์‚ญ์ œ)DELETE
Head (header ์ •๋ณด ์กฐํšŒ)HEAD
  • ์ž์›(resource)๊ณผ ํ‘œํ˜„(representation)
    • ์ž์› : ํ•ด๋‹น ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ. ํ…์ŠคํŠธ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ณ , html์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
    • ์ž์›์˜ ํ‘œํ˜„ : ๊ทธ ์ž์›์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ด๋ฆ„. ex) DB์˜ ์ „ํ™”๋ฒˆํ˜ธ๊ฐ€ ์ž์›์ผ ๋•Œ, phonenumbers์„ ์ž์›์˜ ํ‘œํ˜„์œผ๋กœ ์ •ํ•œ๋‹ค.
  • URI (Uniform Resource Identifier) URI๋Š” ์ž์›์˜ ์œ„์น˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž์›์— ๋Œ€ํ•œ ๊ณ ์œ  ์‹๋ณ„์ž. URL๋ณด๋‹ค ๋” ์ข์€ ๋ฒ”์œ„. ex) students๊ฐ€ ํ•™์ƒ ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ž์›์˜ ํ‘œํ˜„์ด๋ผ๋ฉด, URI๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.
   ๐ŸŒ http://education.co.kr/students/20


   ์œ„์˜ URI๋ฅผ ํ†ตํ•ด, `students`๊ฐ€ 20์ธ ์ž์›์„ ์‹๋ณ„ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

2. What is.. โ€œRESTfulโ€?

RESTful์€ ์ผ๋ฐ˜์ ์œผ๋กœ REST๋ผ๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋”ฐ๋ฅด๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, REST๋ผ๋Š” ์›น ํ†ต์‹  ๋ฐฉ์‹์„ ๋”ฐ๋ผ์„œ ์–ป๋Š” ์ด๋“์€ ๋ฌด์—‡์ผ๊นŒ์š”..?

ํ™•์žฅ์„ฑ

HTTP๊ฐ€ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์˜ ํ‘œ์ค€์œผ๋กœ ์ฑ„ํƒ๋˜์–ด ์žˆ๋Š”๋ฐ, RESTful API๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ํ”Œ๋žซํผ์ด๋“ , ์–ด๋–ค ์–ธ์–ด๋“  HTTP๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ํŽธ๋ฆฌํ•ด์ง‘๋‹ˆ๋‹ค.

๊ฐ„๊ฒฐ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ

RESTful API๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์›์„ ๋‹ค๋ฃจ๊ณ , ์ž์›์€ ๊ณ ์œ ํ•œ URI๋ฅผ ํ†ตํ•ด ์‹๋ณ„๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ์จ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๋Ÿ‰์„ฑ

๋ฐ์ดํ„ฐ ํฌ๋งท์œผ๋กœ JSON์ด ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋น ๋ฅธ ์‘๋‹ต ์‹œ๊ฐ„์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

Swagger

Swagger ๋Š” REST API๋ฅผ ์„ค๊ณ„, ๋นŒ๋“œ, ๋ฌธ์„œํ™” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” OpenAPI ์‚ฌ์–‘์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์ถ• ๋œ ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ ์„ธํŠธ์ž…๋‹ˆ๋‹ค.

FastAPI์—์„œ, ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ์›น ์† API ๋ฌธ์„œ๋ฅผ ๋ณธ ์ ์ด ์žˆ์ง€ ์•Š๋‚˜์š”..?

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ, Swagger์ž…๋‹ˆ๋‹ค.

Swagger๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹คโ€ฆ๐Ÿ‘

  1. ์ ์šฉํ•˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— or ๋– ๋จน๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—..

    FastAPI๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์ฝ”๋“œ ๋ช‡ ์ค„์ด๋ฉด Swagger UI๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋ฒˆ์— ๊ณต๋ถ€ํ•˜์˜€๋˜ FastAPI์˜ ๊ฒฝ์šฐ, ์ž์ฒด์ ์œผ๋กœ ์ด๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ ์šฉํ•  ํ•„์š”๋„ ์—†์ด ๊ทธ์ € ์‚ฌ์šฉ๋งŒ.. ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  2. ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋Š” UI๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—

    Swagger UI์—์„œ๋Š” ์ง์ ‘ ์ž…๋ ฅ๋„ ํ•˜์—ฌ ์„ค๊ณ„ํ•œ ๋Œ€๋กœ ์ถœ๋ ฅ์ด ๋‚˜์˜ค๋Š” ์ง€ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตณ์ด html template์„ ๋งŒ๋“ค์–ด ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์•„๋„ ์ด docs๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋ฉด, ์›น์„ ํ†ตํ•œ ๋ชจ๋ธ ๋ฐ๋ชจ ๋“ฑ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์  ํŠน์ง•

RESTful API ์„ค๊ณ„ ๊ทœ์น™

1๏ธโƒฃ HTTP URI(Uniform Resource Identifier)๋ฅผ ํ†ตํ•ด ์ž์›(Resource)์„ ๋ช…์‹œํ•˜๊ณ 

2๏ธโƒฃ HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ CRUD Operation์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ.

์œ„์˜ REST ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜๋ฉด์„œ ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•˜์ž.

  1. URI์—ย HTTPย Method๊ฐ€ย ๋“ค์–ด๊ฐ€๋ฉดย ์•ˆ๋œ๋‹ค.

    ex) GET /members/delete/1 -> DELETE /members/1

  2. URI์—ย ํ–‰์œ„์—ย ๋Œ€ํ•œย ๋™์‚ฌย ํ‘œํ˜„์ดย ๋“ค์–ด๊ฐ€๋ฉดย ์•ˆ๋œ๋‹ค.

    ex) GET /members/show/1 -> GET /members/1

    ex) GET /members/insert/2 -> POST /members/2

  3. ๊ฒฝ๋กœย ๋ถ€๋ถ„ย ์ค‘ย ๋ณ€์ˆ˜๋Š”ย ์œ ์ผํ•œย ๊ฐ’์œผ๋กœย ๋Œ€์ฒดํ•œ๋‹ค.

    ex) id=12์ธ student๋ฅผ ์‚ญ์ œํ•˜๋Š” route: DELETE /students/12

  4. ์Šฌ๋ž˜์‹œ ๊ตฌ๋ถ„์ž(/)๋Š” ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

    ex) http://skku.edu/aai/lab/dsail

  5. URI ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์Šฌ๋ž˜์‹œ(/)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

    ex) http://skku.edu/aai/lab/dsail~~/~~

  6. ํ•˜์ดํ”ˆ(- )์€ URI ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์‚ฌ์šฉ

  7. ๋ฐ‘์ค„(_ )์€ URI์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  8. URI ๊ฒฝ๋กœ์—๋Š” ๋Œ€๋ฌธ์ž๋ณด๋‹ค ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค.

  9. ํŒŒ์ผ ํ™•์žฅ์ž๋Š” URI์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

    ex) http://skku.edu/aai/lab/dsail/research/31/result.png

  • RESTful or not?
    • CRUD ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ GET์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” API โŒ
    • route์— resource, id ์™ธ์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ(/dsail/showFeat) โŒ

๋ชฉ์ 

  • ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ , ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด API๋ฅผ ๋งŒ๋“ค์ž!
  • API์˜ ์ดํ•ด๋„ ๋ฐ ํ˜ธํ™˜์„ฑ์„ ๋†’์ด์ž!

Swagger UI์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค

  • ๊ตฌ์„ฑ

    API๋ผ๋Š” ๋ฆฌ๋ชจ์ฝ˜์ด ์žˆ๋‹ค๋ฉด, ๊ฐ ๋ฆฌ๋ชจ์ฝ˜์˜ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•ด ๋†“์€ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ๊ฐ url์ด ์ž…๋ ฅ๋˜์—ˆ์„ ๋•Œ, ์–ด๋– ํ•œ HTTP Method(POST, GET, PUT, DELETE)๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • API ํ…Œ์ŠคํŠธ โ†’ ์ž…/์ถœ๋ ฅ ๊ฐ€๋Šฅ

    • ์˜ˆ์‹œ) Stable Diffusion text-to-image ๋ชจ๋ธ์„ ๋‹ค๋ฃฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

      ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅํ•˜๋Š” ๋ชจ์Šต

      ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋œ ๋ชจ์Šต

      FastAPI for Machine Learning: Live coding an ML web application.

sample code

swagger

  • ์›น ํ™”๋ฉด (http://127.0.0.1:8001)

  • ์‹คํ–‰ ์ฝ”๋“œ

    from typing import Union
    from fastapi import FastAPI
    
    app = FastAPI()
    
    @app.get("/")
    def read_root():
        return {"Name": "ShinYeeun"}
    
    @app.get("/items/{item_id}")
    def read_item(item_id: int, q: Union[str, None] = None):
        return {"item_id": item_id, "q": q}
    • read_root() : root url์„ ์ž…๋ ฅํ•˜์˜€์„ ๋•Œ ํ•ด๋‹น ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • read_item() : item_id์™€ q ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๊ทธ์— ๋Œ€ํ•œ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • Swagger UI (http://127.0.0.1:8001/docs)

    ์ „์ฒด์ ์ธ ํ™”๋ฉด

    Swagger UI์—์„œ ์ž…๋ ฅ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ชจ์Šต

    ์‹ค์ œ๋กœ ์ž…๋ ฅ๋œ ๊ฐ’์ด ์›น์— ๋„์›Œ์ง€๋Š” ๋“ฏ ๋ณด์ธ๋‹ค.


Reference

ํ•„์š”์„ฑ

๊ธฐ๋Šฅ์  ํŠน์ง•

profile
๋งค์ผ๋งค์ผ์ด ์ƒˆ๋กœ์šด ์‹œ์ž‘์ 

0๊ฐœ์˜ ๋Œ“๊ธ€