committed by
GitHub
1 changed files with 326 additions and 0 deletions
@ -0,0 +1,326 @@ |
|||
# ์์ฒญ ์์ ๋ฐ์ดํฐ ์ ์ธ |
|||
|
|||
์ฌ๋ฌ๋ถ์ ์ฑ์ด ๋ฐ์ ์ ์๋ ๋ฐ์ดํฐ ์์ ๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. |
|||
|
|||
์ฌ๊ธฐ ์ด๋ฅผ ์ํ ๋ช๊ฐ์ง ๋ฐฉ์์ด ์์ต๋๋ค. |
|||
|
|||
## Pydantic ๋ชจ๋ธ ์ ์ถ๊ฐ JSON ์คํค๋ง ๋ฐ์ดํฐ |
|||
|
|||
์์ฑ๋ JSON ์คํค๋ง์ ์ถ๊ฐ๋ Pydantic ๋ชจ๋ธ์ ์ํ `examples`์ ์ ์ธํ ์ ์์ต๋๋ค. |
|||
|
|||
=== "Python 3.10+ Pydantic v2" |
|||
|
|||
```Python hl_lines="13-24" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial001_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.10+ Pydantic v1" |
|||
|
|||
```Python hl_lines="13-23" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial001_py310_pv1.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+ Pydantic v2" |
|||
|
|||
```Python hl_lines="15-26" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial001.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+ Pydantic v1" |
|||
|
|||
```Python hl_lines="15-25" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial001_pv1.py!} |
|||
``` |
|||
|
|||
์ถ๊ฐ ์ ๋ณด๋ ์๋ ๊ทธ๋๋ก ํด๋น ๋ชจ๋ธ์ **JSON ์คํค๋ง** ๊ฒฐ๊ณผ์ ์ถ๊ฐ๋๊ณ , API ๋ฌธ์์์ ์ฌ์ฉํฉ๋๋ค. |
|||
|
|||
=== "Pydantic v2" |
|||
|
|||
Pydantic ๋ฒ์ 2์์ <a href="https://docs.pydantic.dev/latest/usage/model_config/" class="external-link" target="_blank">Pydantic ๊ณต์ ๋ฌธ์: Model Config</a>์ ๋์ ์๋ ๊ฒ์ฒ๋ผ `dict`๋ฅผ ๋ฐ๋ `model_config` ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค. |
|||
|
|||
`"json_schema_extra"`๋ฅผ ์์ฑ๋ JSON ์คํค๋ง์์ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋ณ๋์ ๋ฐ์ดํฐ์ `examples`๋ฅผ ํฌํจํ๋ `dict`์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. |
|||
|
|||
=== "Pydantic v1" |
|||
|
|||
Pydantic v1์์ <a href="https://docs.pydantic.dev/1.10/usage/schema/#schema-customization" class="external-link" target="_blank">Pydantic ๊ณต์ ๋ฌธ์: Schema customization</a>์์ ์ค๋ช
ํ๋ ๊ฒ์ฒ๋ผ, ๋ด๋ถ ํด๋์ค์ธ `Config`์ `schema_extra`๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค. |
|||
|
|||
`schema_extra`๋ฅผ ์์ฑ๋ JSON ์คํค๋ง์์ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋ณ๋์ ๋ฐ์ดํฐ์ `examples`๋ฅผ ํฌํจํ๋ `dict`์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. |
|||
|
|||
!!! tip "ํ" |
|||
JSON ์คํค๋ง๋ฅผ ํ์ฅํ๊ณ ์ฌ๋ฌ๋ถ์ ๋ณ๋์ ์์ฒด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค๋ฉด, ํ๋ก ํธ์๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ๋ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
!!! info "์ ๋ณด" |
|||
(FastAPI 0.99.0๋ถํฐ ์ฐ์ด๊ธฐ ์์ํ) OpenAPI 3.1.0์ **JSON ์คํค๋ง** ํ์ค์ ์ผ๋ถ์ธ `examples`์ ๋ํ ์ง์์ ์ถ๊ฐํ์ต๋๋ค. |
|||
|
|||
๊ทธ ์ ์๋, ํ๋์ ์์ ๋ง ๊ฐ๋ฅํ `example` ํค์๋๋ง ์ง์ํ์ต๋๋ค. ์ด๋ ์์ง OpenAPI 3.1.0์์ ์ง์ํ์ง๋ง, ์ง์์ด ์ข
๋ฃ๋ ๊ฒ์ด๋ฉฐ JSON ์คํค๋ง ํ์ค์ ํฌํจ๋์ง ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ์ `example`์ `examples`์ผ๋ก ์ด์ ํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. ๐ค |
|||
|
|||
์ด ๋ฌธ์ ๋์ ๋ ๋ง์ ์ฝ์๊ฑฐ๋ฆฌ๊ฐ ์์ต๋๋ค. |
|||
|
|||
## `Field` ์ถ๊ฐ ์ธ์ |
|||
|
|||
Pydantic ๋ชจ๋ธ๊ณผ ๊ฐ์ด `Field()`๋ฅผ ์ฌ์ฉํ ๋ ์ถ๊ฐ์ ์ธ `examples`๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="2 8-11" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial002_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="4 10-13" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial002.py!} |
|||
``` |
|||
|
|||
## JSON Schema์์์ `examples` - OpenAPI |
|||
|
|||
์ด๋ค ์ค์์ ์ฌ์ฉํฉ๋๋ค: |
|||
|
|||
* `Path()` |
|||
* `Query()` |
|||
* `Header()` |
|||
* `Cookie()` |
|||
* `Body()` |
|||
* `Form()` |
|||
* `File()` |
|||
|
|||
**OpenAPI**์ **JSON ์คํค๋ง**์ ์ถ๊ฐ๋ ๋ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ํฌํจํ `examples` ๋ชจ์์ ์ ์ธํ ์ ์์ต๋๋ค. |
|||
|
|||
### `examples`๋ฅผ ํฌํจํ `Body` |
|||
|
|||
์ฌ๊ธฐ, `Body()`์ ์์๋๋ ์์ ๋ฐ์ดํฐ ํ๋๋ฅผ ํฌํจํ `examples`๋ฅผ ๋๊ฒผ์ต๋๋ค: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="22-29" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial003_an_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.9+" |
|||
|
|||
```Python hl_lines="22-29" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial003_an_py39.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="23-30" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial003_an.py!} |
|||
``` |
|||
|
|||
=== "Python 3.10+ Annotated๊ฐ ์๋ ๊ฒฝ์ฐ" |
|||
|
|||
!!! tip "ํ" |
|||
๊ฐ๋ฅํ๋ค๋ฉด `Annotated`๊ฐ ๋ฌ๋ฆฐ ๋ฒ์ ์ ๊ถ์ฅํฉ๋๋ค. |
|||
|
|||
```Python hl_lines="18-25" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial003_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+ Annotated๊ฐ ์๋ ๊ฒฝ์ฐ" |
|||
|
|||
!!! tip "ํ" |
|||
๊ฐ๋ฅํ๋ค๋ฉด `Annotated`๊ฐ ๋ฌ๋ฆฐ ๋ฒ์ ์ ๊ถ์ฅํฉ๋๋ค. |
|||
|
|||
```Python hl_lines="20-27" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial003.py!} |
|||
``` |
|||
|
|||
### ๋ฌธ์ UI ์์ |
|||
|
|||
์์ ์ด๋ ๋ฐฉ๋ฒ๊ณผ ํจ๊ป๋ผ๋ฉด `/docs`์์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์
๋๋ค: |
|||
|
|||
<img src="/img/tutorial/body-fields/image01.png"> |
|||
|
|||
### ๋ค์ค `examples`๋ฅผ ํฌํจํ `Body` |
|||
|
|||
๋ฌผ๋ก ์ฌ๋ฌ `examples`๋ฅผ ๋๊ธธ ์ ์์ต๋๋ค: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="23-38" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial004_an_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.9+" |
|||
|
|||
```Python hl_lines="23-38" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial004_an_py39.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="24-39" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial004_an.py!} |
|||
``` |
|||
|
|||
=== "Python 3.10+ Annotated๊ฐ ์๋ ๊ฒฝ์ฐ" |
|||
|
|||
!!! tip "ํ" |
|||
๊ฐ๋ฅํ๋ค๋ฉด `Annotated`๊ฐ ๋ฌ๋ฆฐ ๋ฒ์ ์ ๊ถ์ฅํฉ๋๋ค. |
|||
|
|||
```Python hl_lines="19-34" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial004_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+ Annotated๊ฐ ์๋ ๊ฒฝ์ฐ" |
|||
|
|||
!!! tip "ํ" |
|||
๊ฐ๋ฅํ๋ค๋ฉด `Annotated`๊ฐ ๋ฌ๋ฆฐ ๋ฒ์ ์ ๊ถ์ฅํฉ๋๋ค. |
|||
|
|||
```Python hl_lines="21-36" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial004.py!} |
|||
``` |
|||
|
|||
์ด์ ๊ฐ์ด ํ๋ฉด ์ด ์์ ๋ ๊ทธ ๋ณธ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์ํ ๋ด๋ถ **JSON ์คํค๋ง**์ ์ผ๋ถ๊ฐ ๋ ๊ฒ์
๋๋ค. |
|||
|
|||
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ง๊ธ <abbr title="2023-08-26">์ด ๋ฌธ์๋ฅผ ์์ฑํ๋ ์๊ฐ</abbr>์, ๋ฌธ์ UI๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ญํ ์ ๋งก์ Swagger UI๋ **JSON ์คํค๋ง** ์ ๋ฐ์ดํฐ๋ฅผ ์ํ ์ฌ๋ฌ ์์ ์ ํํ์ ์ง์ํ์ง ์์ต๋๋ค. ํ์ง๋ง ํด๊ฒฐ ๋ฐฉ์์ ๋ฐ์์ ์ฝ์ด๋ณด์ธ์. |
|||
|
|||
### OpenAPI-ํนํ `examples` |
|||
|
|||
**JSON ์คํค๋ง**๊ฐ `examples`๋ฅผ ์ง์ํ๊ธฐ ์ ๋ถํฐ, OpenAPI๋ `examples`์ด๋ผ ๋ถ๋ฆฌ๋ ๋ค๋ฅธ ํ๋๋ฅผ ์ง์ํด ์์ต๋๋ค. |
|||
|
|||
์ด **OpenAPI-ํนํ** `examples`๋ OpenAPI ๋ช
์ธ์์ ๋ค๋ฅธ ๊ตฌ์ญ์ผ๋ก ๋ค์ด๊ฐ๋๋ค. ๊ฐ JSON ์คํค๋ง ๋ด๋ถ๊ฐ ์๋๋ผ **๊ฐ *๊ฒฝ๋ก ์๋* ์ธ๋ถ ์ ๋ณด**์ ํฌํจ๋ฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ Swagger UI๋ ์ด ํน์ ํ `examples` ํ๋๋ฅผ ํ๋์ ์ง์ํ์ต๋๋ค. ๊ทธ๋์, ์ด๋ฅผ ๋ค๋ฅธ **๋ฌธ์ UI์ ์๋ ์์ **๋ฅผ **ํ์**ํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด OpenAPI-ํนํ ํ๋์ธ `examples`์ ํํ๋ (`list`๋์ ์) **๋ค์ค ์์ **๊ฐ ํฌํจ๋ `dict`์ด๋ฉฐ, ๊ฐ๊ฐ์ ๋ณ๋ ์ ๋ณด ๋ํ **OpenAPI**์ ์ถ๊ฐ๋ ๊ฒ์
๋๋ค. |
|||
|
|||
์ด๋ OpenAPI์ ํฌํจ๋ JSON ์คํค๋ง ์์ผ๋ก ํฌํจ๋์ง ์์ผ๋ฉฐ, *๊ฒฝ๋ก ์๋*์ ์ง์ ์ ์ผ๋ก ํฌํจ๋ฉ๋๋ค. |
|||
|
|||
### `openapi_examples` ๋งค๊ฐ๋ณ์ ์ฌ์ฉํ๊ธฐ |
|||
|
|||
๋ค์ ์์ ์์ OpenAPI-ํนํ `examples`๋ฅผ FastAPI ์์์ ๋งค๊ฐ๋ณ์ `openapi_examples` ๋งค๊ฐ๋ณ์์ ํจ๊ป ์ ์ธํ ์ ์์ต๋๋ค: |
|||
|
|||
* `Path()` |
|||
* `Query()` |
|||
* `Header()` |
|||
* `Cookie()` |
|||
* `Body()` |
|||
* `Form()` |
|||
* `File()` |
|||
|
|||
`dict`์ ํค๊ฐ ๋ ๋ค๋ฅธ `dict`์ธ ๊ฐ ์์ ์ ๊ฐ์ ๊ตฌ๋ณํฉ๋๋ค. |
|||
|
|||
๊ฐ๊ฐ์ ํน์ `examples` ์ `dict` ์์ ๋ ๋ค์์ ํฌํจํ ์ ์์ต๋๋ค: |
|||
|
|||
* `summary`: ์์ ์ ๋ํ ์งง์ ์ค๋ช
๋ฌธ. |
|||
* `description`: ๋งํฌ๋ค์ด ํ
์คํธ๋ฅผ ํฌํจํ ์ ์๋ ๊ธด ์ค๋ช
๋ฌธ. |
|||
* `value`: ์ค์ ๋ก ๋ณด์ฌ์ง๋ ์์, ์๋ฅผ ๋ค๋ฉด `dict`. |
|||
* `externalValue`: `value`์ ๋์์ด๋ฉฐ ์์ ๋ฅผ ๊ฐ๋ฅดํค๋ URL. ๋น๋ก `value`์ฒ๋ผ ๋ง์ ๋๊ตฌ๋ฅผ ์ง์ํ์ง ๋ชปํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="23-49" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial005_an_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.9+" |
|||
|
|||
```Python hl_lines="23-49" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial005_an_py39.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="24-50" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial005_an.py!} |
|||
``` |
|||
|
|||
=== "Python 3.10+ Annotated๊ฐ ์๋ ๊ฒฝ์ฐ" |
|||
|
|||
!!! tip "ํ" |
|||
๊ฐ๋ฅํ๋ค๋ฉด `Annotated`๊ฐ ๋ฌ๋ฆฐ ๋ฒ์ ์ ๊ถ์ฅํฉ๋๋ค. |
|||
|
|||
```Python hl_lines="19-45" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial005_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+ Annotated๊ฐ ์๋ ๊ฒฝ์ฐ" |
|||
|
|||
!!! tip "ํ" |
|||
๊ฐ๋ฅํ๋ค๋ฉด `Annotated`๊ฐ ๋ฌ๋ฆฐ ๋ฒ์ ์ ๊ถ์ฅํฉ๋๋ค. |
|||
|
|||
```Python hl_lines="21-47" |
|||
{!> ../../../docs_src/schema_extra_example/tutorial005.py!} |
|||
``` |
|||
|
|||
### ๋ฌธ์ UI์์์ OpenAPI ์์ |
|||
|
|||
`Body()`์ ์ถ๊ฐ๋ `openapi_examples`๋ฅผ ํฌํจํ `/docs`๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์
๋๋ค: |
|||
|
|||
<img src="/img/tutorial/body-fields/image02.png"> |
|||
|
|||
## ๊ธฐ์ ์ ์ธ๋ถ ์ฌํญ |
|||
|
|||
!!! tip "ํ" |
|||
์ด๋ฏธ **FastAPI**์ **0.99.0 ํน์ ๊ทธ ์ด์** ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ์ด ์ธ๋ถ ์ฌํญ์ **์คํต**ํด๋ ์๊ด ์์ ๊ฒ์
๋๋ค. |
|||
|
|||
์ธ๋ถ ์ฌํญ์ OpenAPI 3.1.0์ด ์ฌ์ฉ๊ฐ๋ฅํ๊ธฐ ์ , ์์ ๋ฒ์ ๊ณผ ๋ ๊ด๋ จ์์ต๋๋ค. |
|||
|
|||
๊ฐ๋ตํ OpenAPI์ JSON ์คํค๋ง **์ญ์ฌ ๊ฐ์**๋ก ์๊ฐํ ์ ์์ต๋๋ค. ๐ค |
|||
|
|||
!!! warning "๊ฒฝ๊ณ " |
|||
ํ์ค **JSON ์คํค๋ง**์ **OpenAPI**์ ๋ํ ์์ฃผ ๊ธฐ์ ์ ์ธ ์ธ๋ถ์ฌํญ์
๋๋ค. |
|||
|
|||
๋ง์ฝ ์์ ์๊ฐ์ด ์๋ํ๋ค๋ฉด, ๊ทธ๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ฉฐ ์ด ์ธ๋ถ ์ฌํญ์ ํ์์์ ๊ฒ์ด๋, ๋ง์ ํธํ๊ฒ ์คํตํ์
๋ ๋ฉ๋๋ค. |
|||
|
|||
OpenAPI 3.1.0 ์ ์ OpenAPI๋ ์ค๋๋ **JSON ์คํค๋ง**์ ์์ ๋ ๋ฒ์ ์ ์ฌ์ฉํ์ต๋๋ค. |
|||
|
|||
JSON ์คํค๋ง๋ `examples`๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์๊ณ , ๋ฐ๋ผ์ OpenAPI๋ ๊ทธ๋ค๋ง์ `example` ํ๋๋ฅผ ์์ ๋ ๋ฒ์ ์ ์ถ๊ฐํ์ต๋๋ค. |
|||
|
|||
OpenAPI๋ ๋ํ `example`๊ณผ `examples` ํ๋๋ฅผ ๋ช
์ธ์์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ถ๊ฐํ์ต๋๋ค: |
|||
|
|||
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object" class="external-link" target="_blank">`(๋ช
์ธ์์ ์๋) Parameter Object`</a>๋ FastAPI์ ๋ค์ ๊ธฐ๋ฅ์์ ์ฐ์์ต๋๋ค: |
|||
* `Path()` |
|||
* `Query()` |
|||
* `Header()` |
|||
* `Cookie()` |
|||
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object" class="external-link" target="_blank">(๋ช
์ธ์์ ์๋)`Media Type Object`์ `content`์ ์๋ `Request Body Object`</a>๋ FastAPI์ ๋ค์ ๊ธฐ๋ฅ์์ ์ฐ์์ต๋๋ค: |
|||
* `Body()` |
|||
* `File()` |
|||
* `Form()` |
|||
|
|||
!!! info "์ ๋ณด" |
|||
์ด ์์ OpenAPI-ํนํ `examples` ๋งค๊ฐ๋ณ์๋ ์ด์ FastAPI `0.103.0`๋ถํฐ `openapi_examples`์
๋๋ค. |
|||
|
|||
### JSON ์คํค๋ง์ `examples` ํ๋ |
|||
|
|||
ํ์ง๋ง, ํ์ JSON ์คํค๋ง๋ <a href="https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5" class="external-link" target="_blank">`examples`</a>ํ๋๋ฅผ ๋ช
์ธ์์ ์ ๋ฒ์ ์ ์ถ๊ฐํ์ต๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ์๋ก์ด OpenAPI 3.1.0์ ์ด ์๋ก์ด `examples` ํ๋๊ฐ ํฌํจ๋ ์ต์ ๋ฒ์ (JSON ์คํค๋ง 2020-12)์ ๊ธฐ๋ฐ์ผ๋ก ํ์ต๋๋ค. |
|||
|
|||
์ด์ ์๋ก์ด `examples` ํ๋๋ ์ด์ ์ ๋จ์ผ (๊ทธ๋ฆฌ๊ณ ์ปค์คํ
) `example` ํ๋๋ณด๋ค ์ฐ์ ๋๋ฉฐ, `example`์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. |
|||
|
|||
JSON ์คํค๋ง์ ์๋ก์ด `examples` ํ๋๋ ์์ ์ **๋จ์ํ `list`**์ด๋ฉฐ, (์์์ ์์ ํ ๊ฒ์ฒ๋ผ) OpenAPI์ ๋ค๋ฅธ ๊ณณ์ ์กด์ฌํ๋ dict์ผ๋ก ๋ ์ถ๊ฐ์ ์ธ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์๋๋๋ค. |
|||
|
|||
!!! info "์ ๋ณด" |
|||
๋ ์ฝ๊ณ ์๋ก์ด JSON ์คํค๋ง์์ ํตํฉ๊ณผ ํจ๊ป OpenAPI 3.1.0๊ฐ ๋ฐฐํฌ๋์์ง๋ง, ์ ์๋์ ์๋ ๋ฌธ์ ์์ฑ์ ์ ๊ณตํ๋ ๋๊ตฌ์ธ Swagger UI๋ OpenAPI 3.1.0์ ์ง์ํ์ง ์์์ต๋๋ค (5.0.0 ๋ฒ์ ๋ถํฐ ์ง์ํฉ๋๋ค ๐). |
|||
|
|||
์ด๋ก์ธํด, FastAPI 0.99.0 ์ด์ ๋ฒ์ ์ ์์ง OpenAPI 3.1.0 ๋ณด๋ค ๋ฎ์ ๋ฒ์ ์ ์ฌ์ฉํ์ต๋๋ค. |
|||
|
|||
### Pydantic๊ณผ FastAPI `examples` |
|||
|
|||
`examples`๋ฅผ Pydantic ๋ชจ๋ธ ์์ ์ถ๊ฐํ ๋, `schema_extra` ํน์ `Field(examples=["something"])`๋ฅผ ์ฌ์ฉํ๋ฉด Pydantic ๋ชจ๋ธ์ **JSON ์คํค๋ง**์ ํด๋น ์์๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ Pydantic ๋ชจ๋ธ์ **JSON ์คํค๋ง**๋ API์ **OpenAPI**์ ํฌํจ๋๊ณ , ๊ทธ ํ ๋ฌธ์ UI ์์์ ์ฌ์ฉ๋ฉ๋๋ค. |
|||
|
|||
FastAPI 0.99.0 ์ด์ ๋ฒ์ ์์ (0.99.0 ์ด์ ๋ฒ์ ์ ์๋ก์ด OpenAPI 3.1.0์ ์ฌ์ฉํฉ๋๋ค), `example` ํน์ `examples`๋ฅผ ๋ค๋ฅธ ์ ํธ๋ฆฌํฐ(`Query()`, `Body()` ๋ฑ)์ ํจ๊ป ์ฌ์ฉํ์ ๋, ์ ๋ฌํ ์์๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋ช
ํ๋ JSON ์คํค๋ง์ ์ถ๊ฐ๋์ง ์์ผ๋ฉฐ (์ฌ์ง์ด OpenAPI์ ์์ฒด JSON ์คํค๋ง์๋ ํฌํจ๋์ง ์์ต๋๋ค), OpenAPI์ *๊ฒฝ๋ก ์๋* ์ ์ธ์ ์ง์ ์ ์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค (JSON ์คํค๋ง๋ฅผ ์ฌ์ฉํ๋ OpenAPI ๋ถ๋ถ ์ธ์๋). |
|||
|
|||
ํ์ง๋ง ์ง๊ธ์ FastAPI 0.99.0 ๋ฐ ์ดํ ๋ฒ์ ์์๋ JSON ์คํค๋ง 2020-12๋ฅผ ์ฌ์ฉํ๋ OpenAPI 3.1.0๊ณผ Swagger UI 5.0.0 ๋ฐ ์ดํ ๋ฒ์ ์ ์ฌ์ฉํ๋ฉฐ, ๋ชจ๋ ๊ฒ์ด ๋ ์ผ๊ด์ฑ์ ๋๊ณ ์์๋ JSON ์คํค๋ง์ ํฌํจ๋ฉ๋๋ค. |
|||
|
|||
### Swagger UI์ OpenAPI-ํนํ `examples` |
|||
|
|||
ํ์ฌ (2023-08-26), Swagger UI๊ฐ ๋ค์ค JSON ์คํค๋ง ์์๋ฅผ ์ง์ํ์ง ์์ผ๋ฉฐ, ์ฌ์ฉ์๋ ๋ค์ค ์์๋ฅผ ๋ฌธ์์ ํ์ํ๋ ๋ฐฉ๋ฒ์ด ์์์ต๋๋ค. |
|||
|
|||
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, FastAPI `0.103.0`์ ์๋ก์ด ๋งค๊ฐ๋ณ์์ธ `openapi_examples`๋ฅผ ํฌํจํ๋ ์์ **OpenAPI-ํนํ** `examples` ํ๋๋ฅผ ์ ์ธํ๊ธฐ ์ํ **์ง์์ ์ถ๊ฐ**ํ์ต๋๋ค. ๐ค |
|||
|
|||
### ์์ฝ |
|||
|
|||
์ ๋ ์ญ์ฌ๋ฅผ ๊ทธ๋ค์ง ์ข์ํ๋ ํธ์ด ์๋๋ผ๊ณ ๋งํ๊ณ ๋ ํ์ง๋ง... "๊ธฐ์ ์ญ์ฌ" ๊ฐ์๋ฅผ ๊ฐ๋ฅด์น๋ ์ง๊ธ์ ์ ๋ฅผ ๋ณด์ธ์. |
|||
|
|||
์์ฝํ์๋ฉด **FastAPI 0.99.0 ํน์ ๊ทธ ์ด์์ ๋ฒ์ **์ผ๋ก ์
๊ทธ๋ ์ด๋ํ๋ ๊ฒ์ ๋ง์ ๊ฒ๋ค์ด ๋ **์ฝ๊ณ , ์ผ๊ด์ ์ด๋ฉฐ ์ง๊ด์ ์ด๊ฒ** ๋๋ฉฐ, ์ฌ๋ฌ๋ถ์ ์ด ๋ชจ๋ ์ญ์ฌ์ ์ธ๋ถ ์ฌํญ์ ์ ํ์๊ฐ ์์ต๋๋ค. ๐ |
Loadingโฆ
Reference in new issue