Browse Source

๐ŸŒ Add Korean translation for `docs/ko/docs/tutorial/metadata.md` (#12541)

pull/12676/merge
LKY 5 months ago
committed by GitHub
parent
commit
46a085ebe7
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 131
      docs/ko/docs/tutorial/metadata.md

131
docs/ko/docs/tutorial/metadata.md

@ -0,0 +1,131 @@
# ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ ๋ฌธ์„œํ™” URL
**FastAPI** ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‹ค์–‘ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉ์ž ๋งž์ถค ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## API์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
OpenAPI ๋ช…์„ธ ๋ฐ ์ž๋™ํ™”๋œ API ๋ฌธ์„œ UI์— ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์Œ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
| ๋งค๊ฐœ๋ณ€์ˆ˜ | ํƒ€์ž… | ์„ค๋ช… |
|----------|------|-------|
| `title` | `str` | API์˜ ์ œ๋ชฉ์ž…๋‹ˆ๋‹ค. |
| `summary` | `str` | API์— ๋Œ€ํ•œ ์งง์€ ์š”์•ฝ์ž…๋‹ˆ๋‹ค. <small>OpenAPI 3.1.0, FastAPI 0.99.0๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ</small> |
| `description` | `str` | API์— ๋Œ€ํ•œ ์งง์€ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| `version` | `string` | API์˜ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. OpenAPI์˜ ๋ฒ„์ „์ด ์•„๋‹Œ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ: `2.5.0` |
| `terms_of_service` | `str` | API ์ด์šฉ ์•ฝ๊ด€์˜ URL์ž…๋‹ˆ๋‹ค. ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ URL ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. |
| `contact` | `dict` | ๋…ธ์ถœ๋œ API์— ๋Œ€ํ•œ ์—ฐ๋ฝ์ฒ˜ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. <details><summary><code>contact</code> ํ•„๋“œ</summary><table><thead><tr><th>๋งค๊ฐœ๋ณ€์ˆ˜</th><th>ํƒ€์ž…</th><th>์„ค๋ช…</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>์—ฐ๋ฝ์ฒ˜ ์ธ๋ฌผ/์กฐ์ง์˜ ์‹๋ณ„๋ช…์ž…๋‹ˆ๋‹ค.</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>์—ฐ๋ฝ์ฒ˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด URL์ž…๋‹ˆ๋‹ค. URL ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>์—ฐ๋ฝ์ฒ˜ ์ธ๋ฌผ/์กฐ์ง์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค. ์ด๋ฉ”์ผ ์ฃผ์†Œ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</td></tr></tbody></table></details> |
| `license_info` | `dict` | ๋…ธ์ถœ๋œ API์˜ ๋ผ์ด์„ ์Šค ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. <details><summary><code>license_info</code> ํ•„๋“œ</summary><table><thead><tr><th>๋งค๊ฐœ๋ณ€์ˆ˜</th><th>ํƒ€์ž…</th><th>์„ค๋ช…</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>ํ•„์ˆ˜</strong> (<code>license_info</code>๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ). API์— ์‚ฌ์šฉ๋œ ๋ผ์ด์„ ์Šค ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>API์— ๋Œ€ํ•œ <a href="https://spdx.org/licenses/" class="external-link" target="_blank">SPDX</a> ๋ผ์ด์„ ์Šค ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. <code>identifier</code> ํ•„๋“œ๋Š” <code>url</code> ํ•„๋“œ์™€ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค. <small>OpenAPI 3.1.0, FastAPI 0.99.0๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>API์— ์‚ฌ์šฉ๋œ ๋ผ์ด์„ ์Šค์˜ URL์ž…๋‹ˆ๋‹ค. URL ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</td></tr></tbody></table></details> |
๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```Python hl_lines="3-16 19-32"
{!../../docs_src/metadata/tutorial001.py!}
```
/// tip
`description` ํ•„๋“œ์— ๋งˆํฌ๋‹ค์šด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ถœ๋ ฅ์—์„œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
///
์ด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์„œ ์ž๋™ํ™”(๋กœ ์ƒ์„ฑ๋œ) API ๋ฌธ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค:
<img src="/img/tutorial/metadata/image01.png">
## ๋ผ์ด์„ ์Šค ์‹๋ณ„์ž
OpenAPI 3.1.0 ๋ฐ FastAPI 0.99.0๋ถ€ํ„ฐ `license_info`์— `identifier`๋ฅผ URL ๋Œ€์‹  ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ:
```Python hl_lines="31"
{!../../docs_src/metadata/tutorial001_1.py!}
```
## ํƒœ๊ทธ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
`openapi_tags` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๋กœ ์ž‘๋™์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํƒœ๊ทธ์— ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ํƒœ๊ทธ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ ๋”•์…”๋„ˆ๋ฆฌ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* `name` (**ํ•„์ˆ˜**): `tags` ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ *๊ฒฝ๋กœ ์ž‘๋™*๊ณผ `APIRouter`์— ์‚ฌ์šฉ๋œ ํƒœ๊ทธ ์ด๋ฆ„๊ณผ ๋™์ผํ•œ `str`์ž…๋‹ˆ๋‹ค.
* `description`: ํƒœ๊ทธ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ๋‹ด์€ `str`์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฌธ์„œ UI์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
* `externalDocs`: ์™ธ๋ถ€ ๋ฌธ์„œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” `dict`์ด๋ฉฐ:
* `description`: ์™ธ๋ถ€ ๋ฌธ์„œ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ๋‹ด์€ `str`์ž…๋‹ˆ๋‹ค.
* `url` (**ํ•„์ˆ˜**): ์™ธ๋ถ€ ๋ฌธ์„œ์˜ URL์„ ๋‹ด์€ `str`์ž…๋‹ˆ๋‹ค.
### ํƒœ๊ทธ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒ์„ฑ
`users` ๋ฐ `items`์— ๋Œ€ํ•œ ํƒœ๊ทธ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ `openapi_tags` ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:
```Python hl_lines="3-16 18"
{!../../docs_src/metadata/tutorial004.py!}
```
์„ค๋ช… ์•ˆ์— ๋งˆํฌ๋‹ค์šด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "login"์€ ๊ตต๊ฒŒ(**login**) ํ‘œ์‹œ๋˜๊ณ , "fancy"๋Š” ๊ธฐ์šธ์ž„๊ผด(_fancy_)๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
/// tip
์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“  ํƒœ๊ทธ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
///
### ํƒœ๊ทธ ์‚ฌ์šฉ
`tags` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ *๊ฒฝ๋กœ ์ž‘๋™* ๋ฐ `APIRouter`์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ํƒœ๊ทธ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```Python hl_lines="21 26"
{!../../docs_src/metadata/tutorial004.py!}
```
/// info
ํƒœ๊ทธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ฒฝ๋กœ ์ž‘๋™ ๊ตฌ์„ฑ](path-operation-configuration.md#tags){.internal-link target=_blank}์—์„œ ์ฝ์–ด๋ณด์„ธ์š”.
///
### ๋ฌธ์„œ ํ™•์ธ
์ด์ œ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜๋ฉด ๋ชจ๋“  ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค:
<img src="/img/tutorial/metadata/image02.png">
### ํƒœ๊ทธ ์ˆœ์„œ
๊ฐ ํƒœ๊ทธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋”•์…”๋„ˆ๋ฆฌ์˜ ์ˆœ์„œ๋Š” ๋ฌธ์„œ UI์— ํ‘œ์‹œ๋˜๋Š” ์ˆœ์„œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ์ƒ `users`๋Š” `items` ๋’ค์— ์˜ค์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” `users` ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
## OpenAPI URL
OpenAPI ๊ตฌ์กฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ `/openapi.json`์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
`openapi_url` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฅผ `/api/v1/openapi.json`์— ์ œ๊ณตํ•˜๋„๋ก ์„ค์ •ํ•˜๋ ค๋ฉด:
```Python hl_lines="3"
{!../../docs_src/metadata/tutorial002.py!}
```
OpenAPI ๊ตฌ์กฐ๋ฅผ ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด `openapi_url=None`์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œํ™” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋„ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
## ๋ฌธ์„œํ™” URL
ํฌํ•จ๋œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์„œํ™” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* **Swagger UI**: `/docs`์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
* `docs_url` ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ URL์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* `docs_url=None`์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* **ReDoc**: `/redoc`์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
* `redoc_url` ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ URL์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* `redoc_url=None`์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, Swagger UI๋ฅผ `/documentation`์—์„œ ์ œ๊ณตํ•˜๊ณ  ReDoc์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด:
```Python hl_lines="3"
{!../../docs_src/metadata/tutorial003.py!}
```
Loadingโ€ฆ
Cancel
Save