+++ /dev/null
-# ๊ณ ๊ธ ๋ฏธ๋ค์จ์ด
-
-๋ฉ์ธ ํํ ๋ฆฌ์ผ์์ [Custom Middleware](../tutorial/middleware.md){.internal-link target=_blank}๋ฅผ ์์ฉํ๋ก๊ทธ๋จ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฝ์ผ์
จ์ต๋๋ค.
-
-๊ทธ๋ฆฌ๊ณ [CORS with the `CORSMiddleware`](){.internal-link target=_blank}ํ๋ ๋ฐฉ๋ฒ๋ ๋ณด์
จ์ต๋๋ค.
-
-์ด ์น์
์์๋ ๋ค๋ฅธ ๋ฏธ๋ค์จ์ด๋ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
-
-## ASGI ๋ฏธ๋ค์จ์ด ์ถ๊ฐํ๊ธฐ
-
-**FastAPI**๋ Starlette์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์ผ๋ฉฐ, <abbr title="Asynchronous Server Gateway Interface">ASGI</abbr> ์ฌ์์ ๊ตฌํํ๋ฏ๋ก ASGI ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
-๋ฏธ๋ค์จ์ด๊ฐ FastAPI๋ Starlette์ฉ์ผ๋ก ๋ง๋ค์ด์ง์ง ์์๋ ASGI ์ฌ์์ ์ค์ํ๋ ํ ๋์ํ ์ ์์ต๋๋ค.
-
-์ผ๋ฐ์ ์ผ๋ก ASGI ๋ฏธ๋ค์จ์ด๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ASGI ์ฑ์ ๋ฐ๋ ํด๋์ค๋ค์
๋๋ค.
-
-๋ฐ๋ผ์ ํ์ฌ ASGI ๋ฏธ๋ค์จ์ด ๋ฌธ์์์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋๋ก ์๋ดํ ๊ฒ์
๋๋ค.
-
-```Python
-from unicorn import UnicornMiddleware
-
-app = SomeASGIApp()
-
-new_app = UnicornMiddleware(app, some_config="rainbow")
-```
-
-ํ์ง๋ง ๋ด๋ถ ๋ฏธ๋ค์จ์ด๊ฐ ์๋ฒ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ฌ์ฉ์ ์ ์ ์์ธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ ๋๋ก ์๋ํ๋๋ก ํ๋ ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ FastAPI(์ค์ ๋ก๋ Starlette)๊ฐ ์์ต๋๋ค.
-
-์ด๋ฅผ ์ํด `app.add_middleware()`๋ฅผ ์ฌ์ฉํฉ๋๋ค(CORS์ ์์์์ ๊ฐ์ด).
-
-```Python
-from fastapi import FastAPI
-from unicorn import UnicornMiddleware
-
-app = FastAPI()
-
-app.add_middleware(UnicornMiddleware, some_config="rainbow")
-```
-
-`app.add_middleware()`๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฏธ๋ค์จ์ด ํด๋์ค์ ๋ฏธ๋ค์จ์ด์ ์ ๋ฌํ ์ถ๊ฐ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค.
-
-## ํตํฉ ๋ฏธ๋ค์จ์ด
-
-**FastAPI**์๋ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํ ์ฌ๋ฌ ๋ฏธ๋ค์จ์ด๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
-
-/// note | ๊ธฐ์ ์ธ๋ถ ์ฌํญ
-
-๋ค์ ์์ ์์๋ `from starlette.middleware.something import SomethingMiddleware`๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
-
-**FastAPI**๋ ๊ฐ๋ฐ์์ ํธ์๋ฅผ ์ํด `fastapi.middleware`์ ์ฌ๋ฌ ๋ฏธ๋ค์จ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋๋ถ๋ถ์ ๋ฏธ๋ค์จ์ด๋ Starlette์์ ์ง์ ์ ๊ณตํฉ๋๋ค.
-
-///
-
-## `HTTPSRedirectMiddleware`
-
-๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ด `https` ๋๋ `wss`์ฌ์ผ ํฉ๋๋ค.
-
-`http` ๋๋ `ws`๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ๋์ ๋ณด์ ์ฒด๊ณ๋ก ๋ฆฌ๋๋ ์
๋ฉ๋๋ค.
-
-{* ../../docs_src/advanced_middleware/tutorial001.py hl[2,6] *}
-
-## `TrustedHostMiddleware`
-
-HTTP ํธ์คํธ ํค๋ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ชจ๋ ์์ ์์ฒญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋ `Host` ํค๋๋ฅผ ๊ฐ๋๋ก ๊ฐ์ ํฉ๋๋ค.
-
-{* ../../docs_src/advanced_middleware/tutorial002.py hl[2,6:8] *}
-
-๋ค์ ์ธ์๊ฐ ์ง์๋ฉ๋๋ค:
-
-* `allowed_hosts` - ํธ์คํธ ์ด๋ฆ์ผ๋ก ํ์ฉํด์ผ ํ๋ ๋๋ฉ์ธ ์ด๋ฆ ๋ชฉ๋ก์
๋๋ค. ์ผ์นํ๋ ํ์ ๋๋ฉ์ธ์ ๋ํด `*.example.com`๊ณผ ๊ฐ์ ์์ผ๋์นด๋ ๋๋ฉ์ธ์ด ์ง์๋ฉ๋๋ค. ๋ชจ๋ ํธ์คํธ ์ด๋ฆ์ ํ์ฉํ๋ ค๋ฉด `allowed_hosts=[โ*โ]`๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์๋ตํ์ธ์.
-
-์์ ์์ฒญ์ ์ ํจ์ฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ํ์ธ๋์ง ์์ผ๋ฉด `400`์ด๋ผ๋ ์๋ต์ด ์ ์ก๋ฉ๋๋ค.
-
-## `GZipMiddleware`
-
-`Accept-Encoding` ํค๋์ `โgzipโ`์ด ํฌํจ๋ ๋ชจ๋ ์์ฒญ์ ๋ํด GZip ์๋ต์ ์ฒ๋ฆฌํฉ๋๋ค.
-
-๋ฏธ๋ค์จ์ด๋ ํ์ค ์๋ต๊ณผ ์คํธ๋ฆฌ๋ฐ ์๋ต์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
-
-{* ../../docs_src/advanced_middleware/tutorial003.py hl[2,6] *}
-
-์ง์๋๋ ์ธ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
-* `minimum_size` - ์ด ์ต์ ํฌ๊ธฐ(๋ฐ์ดํธ)๋ณด๋ค ์์ ์๋ต์ GZipํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ `500`์
๋๋ค.
-* `compresslevel` - GZip ์์ถ ์ค์ ์ฌ์ฉ๋ฉ๋๋ค. 1์์ 9 ์ฌ์ด์ ์ ์์
๋๋ค. ๊ธฐ๋ณธ๊ฐ์ `9`์
๋๋ค. ๊ฐ์ด ๋ฎ์์๋ก ์์ถ ์๋๋ ๋นจ๋ผ์ง์ง๋ง ํ์ผ ํฌ๊ธฐ๋ ์ปค์ง๊ณ , ๊ฐ์ด ๋์์๋ก ์์ถ ์๋๋ ๋๋ ค์ง์ง๋ง ํ์ผ ํฌ๊ธฐ๋ ์์์ง๋๋ค.
-
-## ๊ธฐํ ๋ฏธ๋ค์จ์ด
-
-๋ค๋ฅธ ๋ง์ ASGI ๋ฏธ๋ค์จ์ด๊ฐ ์์ต๋๋ค.
-
-์๋ฅผ ๋ค์ด:
-
-<a href=โhttps://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.pyโ class=โexternal-linkโ target=โ_blankโ>์ ๋น์ฝ์ `ProxyHeadersMiddleware`></a>
-<a href=โhttps://github.com/florimondmanca/msgpack-asgiโ class=โexternal-linkโ target=โ_blankโ>MessagePack</a>
-
-์ฌ์ฉ ๊ฐ๋ฅํ ๋ค๋ฅธ ๋ฏธ๋ค์จ์ด๋ฅผ ํ์ธํ๋ ค๋ฉด <a href=โhttps://www.starlette.dev/middleware/โ class=โexternal-linkโ target=โ_blankโ>์คํ๋ ์ ๋ฏธ๋ค์จ์ด ๋ฌธ์</a> ๋ฐ <a href=โhttps://github.com/florimondmanca/awesome-asgiโ class=โexternal-linkโ target=โ_blankโ>ASGI Awesome List</a>๋ฅผ ์ฐธ์กฐํ์ธ์.
+++ /dev/null
-# OpenAPI ์นํ
(Webhooks)
-
-API **์ฌ์ฉ์**์๊ฒ ํน์ **์ด๋ฒคํธ**๊ฐ ๋ฐ์ํ ๋ *๊ทธ๋ค*์ ์ฑ(์์คํ
)์ ์์ฒญ์ ๋ณด๋ด **์๋ฆผ**์ ์ ๋ฌํ ์ ์๋ค๋ ๊ฒ์ ์๋ฆฌ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
-
-์ฆ, ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ API์ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ๊ณผ๋ ๋ฐ๋๋ก, **API**(๋๋ ์ฑ)๊ฐ **์ฌ์ฉ์์ ์์คํ
**(๊ทธ๋ค์ API๋ ์ฑ)์ผ๋ก **์์ฒญ์ ๋ณด๋ด๋** ์ํฉ์ ์๋ฏธํฉ๋๋ค.
-
-์ด๋ฅผ ํํ **์นํ
(Webhook)**์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
-
-## ์นํ
์คํ
-
-**์ฝ๋์์** ์นํ
์ผ๋ก ๋ณด๋ผ ๋ฉ์์ง, ์ฆ ์์ฒญ์ **๋ฐ๋(body)**๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ํ๋ก์ธ์ค์
๋๋ค.
-
-์ฑ์์ ํด๋น ์์ฒญ์ด๋ ์ด๋ฒคํธ๋ฅผ ์ ์กํ **์์ **์ ์ ์ํฉ๋๋ค.
-
-**์ฌ์ฉ์**๋ ์ฑ์ด ํด๋น ์์ฒญ์ ๋ณด๋ผ **URL**์ ์ ์ํฉ๋๋ค. (์: ์น ๋์๋ณด๋์์ ์ค์ )
-
-์นํ
์ URL์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ๊ณผ ์ด๋ฌํ ์์ฒญ์ ์ค์ ๋ก ์ ์กํ๋ ์ฝ๋์ ๋ํ ๋ชจ๋ ๋ก์ง์ ์ฌ๋ฌ๋ถ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. ์ํ๋๋๋ก **๊ณ ์ ์ ์ฝ๋**๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
-
-## **FastAPI**์ OpenAPI๋ก ์นํ
๋ฌธ์ํํ๊ธฐ
-
-**FastAPI**๋ฅผ ์ฌ์ฉํ์ฌ OpenAPI์ ํจ๊ป ์นํ
์ ์ด๋ฆ, ์ฑ์ด ๋ณด๋ผ ์ ์๋ HTTP ์์
์ ํ(์: `POST`, `PUT` ๋ฑ), ๊ทธ๋ฆฌ๊ณ ๋ณด๋ผ ์์ฒญ์ **๋ฐ๋**๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
-
-์ด๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ **์นํ
** ์์ฒญ์ ์์ ํ **API ๊ตฌํ**์ ํจ์ฌ ์ฝ๊ฒ ํ ์ ์์ผ๋ฉฐ, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฌ์ฉ์ API ์ฝ๋์ ์ผ๋ถ๋ฅผ ์๋ ์์ฑํ ์๋ ์์ต๋๋ค.
-
-/// info
-
-์นํ
์ OpenAPI 3.1.0 ์ด์์์ ์ง์๋๋ฉฐ, FastAPI `0.99.0` ์ด์ ๋ฒ์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
-///
-
-## ์นํ
์ด ํฌํจ๋ ์ฑ ๋ง๋ค๊ธฐ
-
-**FastAPI** ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ๋, `webhooks` ์์ฑ์ ์ฌ์ฉํ์ฌ *์นํ
*์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ `@app.webhooks.post()`์ ๊ฐ์ ๋ฐฉ์์ผ๋ก *๊ฒฝ๋ก(path) ์์
*์ ์ ์ํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค.
-
-{* ../../docs_src/openapi_webhooks/tutorial001.py hl[9:13,36:53] *}
-
-์ด๋ ๊ฒ ์ ์ํ ์นํ
์ **OpenAPI** ์คํค๋ง์ ์๋ **๋ฌธ์ํ UI**์ ํ์๋ฉ๋๋ค.
-
-/// info
-
-`app.webhooks` ๊ฐ์ฒด๋ ์ฌ์ค `APIRouter`์ผ ๋ฟ์ด๋ฉฐ, ์ฌ๋ฌ ํ์ผ๋ก ์ฑ์ ๊ตฌ์ฑํ ๋ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ํ์
์
๋๋ค.
-
-///
-
-์นํ
์์๋ ์ค์ **๊ฒฝ๋ก(path)** (์: `/items/`)๋ฅผ ์ ์ธํ์ง ์๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ ๋ฌํ๋ ํ
์คํธ๋ **์๋ณ์**๋ก, ์นํ
์ ์ด๋ฆ(์ด๋ฒคํธ ์ด๋ฆ)์
๋๋ค. ์๋ฅผ ๋ค์ด, `@app.webhooks.post("new-subscription")`์์ ์นํ
์ด๋ฆ์ `new-subscription`์
๋๋ค.
-
-์ด๋ ์ค์ **URL ๊ฒฝ๋ก**๋ **์ฌ์ฉ์**๊ฐ ๋ค๋ฅธ ๋ฐฉ๋ฒ(์: ์น ๋์๋ณด๋)์ ํตํด ์ง์ ํ๋๋ก ๊ธฐ๋๋๊ธฐ ๋๋ฌธ์
๋๋ค.
-
-### ๋ฌธ์ ํ์ธํ๊ธฐ
-
-์ด์ ์ฑ์ ์์ํ๊ณ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋ก ์ด๋ํด ๋ด
์๋ค.
-
-๋ฌธ์์์ ๊ธฐ์กด *๊ฒฝ๋ก ์์
*๋ฟ๋ง ์๋๋ผ **์นํ
**๋ ํ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค:
-
-<img src="/img/tutorial/openapi-webhooks/image01.png">