]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Add Korean translation for `/docs/ko/docs/tutorial/body.md` (#11000)
authorKani Kim <kkh5428@gmail.com>
Sat, 27 Jan 2024 09:11:46 +0000 (18:11 +0900)
committerGitHub <noreply@github.com>
Sat, 27 Jan 2024 09:11:46 +0000 (04:11 -0500)
docs/ko/docs/tutorial/body.md [new file with mode: 0644]

diff --git a/docs/ko/docs/tutorial/body.md b/docs/ko/docs/tutorial/body.md
new file mode 100644 (file)
index 0000000..9317285
--- /dev/null
@@ -0,0 +1,213 @@
+# μš”μ²­ λ³Έλ¬Έ
+
+ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €λΌκ³  ν•΄λ΄…μ‹œλ‹€)λ‘œλΆ€ν„° μ—¬λŸ¬λΆ„μ˜ API둜 λ°μ΄ν„°λ₯Ό λ³΄λ‚΄μ•Ό ν•  λ•Œ, **μš”μ²­ λ³Έλ¬Έ**으둜 λ³΄λƒ…λ‹ˆλ‹€.
+
+**μš”μ²­** λ³Έλ¬Έμ€ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ API둜 λ³΄λ‚΄μ§€λŠ” λ°μ΄ν„°μž…λ‹ˆλ‹€. **응닡** λ³Έλ¬Έμ€ APIκ°€ ν΄λΌμ΄μ–ΈνŠΈλ‘œ λ³΄λ‚΄λŠ” λ°μ΄ν„°μž…λ‹ˆλ‹€.
+
+μ—¬λŸ¬λΆ„μ˜ APIλŠ” λŒ€λΆ€λΆ„μ˜ κ²½μš° **응닡** λ³Έλ¬Έμ„ λ³΄λ‚΄μ•Ό ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν΄λΌμ΄μ–ΈνŠΈλŠ” **μš”μ²­** λ³Έλ¬Έμ„ λ§€ λ²ˆ λ³΄λ‚Ό ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
+
+**μš”μ²­** λ³Έλ¬Έμ„ μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œ λͺ¨λ“  κ°•λ ₯함과 μ΄μ μ„ κ°–μΆ˜ <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a> λͺ¨λΈμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
+
+!!! μ •보
+    λ°μ΄ν„°λ₯Ό λ³΄λ‚΄κΈ° μœ„ν•΄, (μ’€ λ” λ³΄νŽΈμ μΈ) `POST`, `PUT`, `DELETE` ν˜Ήμ€ `PATCH` μ€‘에 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ΄ μ’‹μŠ΅λ‹ˆλ‹€.
+
+    `GET` μš”청에 λ³Έλ¬Έμ„ λ‹΄μ•„ λ³΄λ‚΄λŠ” κ²ƒμ€ λͺ…μ„Έμ„œμ— μ •μ˜λ˜μ§€ μ•Šμ€ ν–‰λ™μž…λ‹ˆλ‹€. κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³ , μ΄ λ°©μ‹μ€ μ•„μ£Ό λ³΅μž‘ν•œ/κ·Ήν•œμ˜ μ‚¬μš© μƒν™©μ—μ„œλ§Œ FastAPI에 μ˜ν•΄ μ§€μ›λ©λ‹ˆλ‹€.
+
+    `GET` μš”청에 λ³Έλ¬Έμ„ λ‹΄λŠ” κ²ƒμ€ κΆŒμž₯λ˜μ§€ μ•ŠκΈ°μ—, Swagger UI같은 λŒ€ν™”ν˜• λ¬Έμ„œμ—μ„œλŠ” `GET` μ‚¬μš©μ‹œ λ‹΄κΈ°λŠ” λ³Έλ¬Έμ— λŒ€ν•œ λ¬Έμ„œλ₯Ό ν‘œμ‹œν•˜μ§€ μ•ŠμœΌλ©°, μ€‘간에 μžˆλŠ” ν”„λ‘μ‹œλŠ” μ΄λ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
+
+## Pydantic의 `BaseModel` μž„ν¬νŠΈ
+
+λ¨Όμ € `pydantic`μ—μ„œ `BaseModel`λ₯Ό μž„ν¬νŠΈν•΄μ•Ό ν•©λ‹ˆλ‹€:
+
+=== "Python 3.10+"
+
+    ```Python hl_lines="2"
+    {!> ../../../docs_src/body/tutorial001_py310.py!}
+    ```
+
+=== "Python 3.8+"
+
+    ```Python hl_lines="4"
+    {!> ../../../docs_src/body/tutorial001.py!}
+    ```
+
+## μ—¬λŸ¬λΆ„μ˜ λ°μ΄ν„° λͺ¨λΈ λ§Œλ“€κΈ°
+
+`BaseModel`λ₯Ό μƒμ†λ°›μ€ ν΄λž˜μŠ€λ‘œ μ—¬λŸ¬λΆ„μ˜ λ°μ΄ν„° λͺ¨λΈμ„ μ„ μ–Έν•©λ‹ˆλ‹€.
+
+λͺ¨λ“  μ–΄νŠΈλ¦¬λ·°νŠΈμ— λŒ€ν•΄ ν‘œμ€€ νŒŒμ΄μ¬ νƒ€μž…을 μ‚¬μš©ν•©λ‹ˆλ‹€:
+
+=== "Python 3.10+"
+
+    ```Python hl_lines="5-9"
+    {!> ../../../docs_src/body/tutorial001_py310.py!}
+    ```
+
+=== "Python 3.8+"
+
+    ```Python hl_lines="7-11"
+    {!> ../../../docs_src/body/tutorial001.py!}
+    ```
+
+쿼리 λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œμ™€ κ°™μ΄, λͺ¨λΈ μ–΄νŠΈλ¦¬λ·°νŠΈκ°€ κΈ°λ³Έ κ°’을 κ°€μ§€κ³  μžˆμ–΄λ„ μ΄λŠ” ν•„μˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€. κ·Έμ™Έμ—λŠ” ν•„μˆ˜μž…λ‹ˆλ‹€. κ·Έμ € `None`을 μ‚¬μš©ν•˜μ—¬ μ„ νƒμ μœΌλ‘œ λ§Œλ“€ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+예λ₯Ό λ“€λ©΄, μœ„μ˜ μ΄ λͺ¨λΈμ€ JSON "`object`" (ν˜Ήμ€ νŒŒμ΄μ¬ `dict`)을 λ‹€μŒκ³Ό κ°™μ΄ μ„ μ–Έν•©λ‹ˆλ‹€:
+
+```JSON
+{
+    "name": "Foo",
+    "description": "선택적인 μ„€λͺ…λž€",
+    "price": 45.2,
+    "tax": 3.5
+}
+```
+
+...`description`κ³Ό `tax`λŠ” (κΈ°λ³Έ κ°’이 `None`으둜 λ˜μ–΄ μžˆμ–΄) μ„ νƒμ μ΄κΈ° λ•Œλ¬Έμ—, μ΄ JSON "`object`"λŠ” λ‹€μŒκ³Ό κ°™μ€ μƒν™©μ—μ„œλ„ μœ νš¨ν•©λ‹ˆλ‹€:
+
+```JSON
+{
+    "name": "Foo",
+    "price": 45.2
+}
+```
+
+## λ§€κ°œλ³€μˆ˜λ‘œμ„œ μ„ μ–Έν•˜κΈ°
+
+μ—¬λŸ¬λΆ„μ˜ *경둜 μž‘동*에 μΆ”κ°€ν•˜κΈ° μœ„ν•΄, κ²½λ‘œ λ§€κ°œλ³€μˆ˜ κ·Έλ¦¬κ³  μΏΌλ¦¬ λ§€κ°œλ³€μˆ˜μ—μ„œ μ„ μ–Έν–ˆλ˜ κ²ƒκ³Ό κ°™μ€ λ°©μ‹μœΌλ‘œ μ„ μ–Έν•˜λ©΄ λ©λ‹ˆλ‹€.
+
+=== "Python 3.10+"
+
+    ```Python hl_lines="16"
+    {!> ../../../docs_src/body/tutorial001_py310.py!}
+    ```
+
+=== "Python 3.8+"
+
+    ```Python hl_lines="18"
+    {!> ../../../docs_src/body/tutorial001.py!}
+    ```
+
+...그리고 λ§Œλ“€μ–΄λ‚Έ λͺ¨λΈμΈ `Item`으둜 νƒ€μž…을 μ„ μ–Έν•©λ‹ˆλ‹€.
+
+## κ²°κ³Ό
+
+μœ„μ—μ„œμ˜ λ‹¨μˆœν•œ νŒŒμ΄μ¬ νƒ€μž… μ„ μ–ΈμœΌλ‘œ, **FastAPI**λŠ” λ‹€μŒκ³Ό κ°™μ΄ λ™μž‘ν•©λ‹ˆλ‹€:
+
+* μš”μ²­μ˜ λ³Έλ¬Έμ„ JSON으둜 μ½μ–΄ λ“€μž…λ‹ˆλ‹€.
+* (ν•„μš”ν•˜λ‹€λ©΄) λŒ€μ‘λ˜λŠ” νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
+* λ°μ΄ν„°λ₯Ό κ²€μ¦ν•©λ‹ˆλ‹€.
+    * λ§Œμ•½ λ°μ΄ν„°κ°€ μœ νš¨ν•˜μ§€ μ•Šλ‹€λ©΄, μ •ν™•νžˆ μ–΄λ–€ κ²ƒμ΄ κ·Έλ¦¬κ³  μ–΄λ””μ—μ„œ λ°μ΄ν„°κ°€ μž˜ λͺ» λ˜μ—ˆλŠ”μ§€ μ§€μ‹œν•˜λŠ” μΉœμ ˆν•˜κ³  λͺ…λ£Œν•œ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•  κ²ƒμž…λ‹ˆλ‹€.
+* λ§€κ°œλ³€μˆ˜ `item`에 ν¬ν•¨λœ μˆ˜μ‹  λ°μ΄ν„°λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
+    * ν•¨μˆ˜ λ‚΄μ—μ„œ λ§€κ°œλ³€μˆ˜λ₯Ό `Item` νƒ€μž…μœΌλ‘œ μ„ μ–Έν–ˆκΈ° λ•Œλ¬Έμ—, λͺ¨λ“  μ–΄νŠΈλ¦¬λ·°νŠΈμ™€ κ·Έμ— λŒ€ν•œ νƒ€μž…에 λŒ€ν•œ νŽΈμ§‘κΈ° μ§€μ›(μ™„μ„± λ“±)을 λ˜ν•œ λ°›μ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+* μ—¬λŸ¬λΆ„μ˜ λͺ¨λΈμ„ μœ„ν•œ <a href="https://json-schema.org" class="external-link" target="_blank">JSON μŠ€ν‚€λ§ˆ</a> μ •μ˜λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μ—¬λŸ¬λΆ„μ˜ ν”„λ‘œμ νŠΈμ— μ ν•©ν•˜λ‹€λ©΄ μ—¬λŸ¬λΆ„이 μ‚¬μš©ν•˜κ³  μ‹Άμ€ κ³³ μ–΄λ””μ—μ„œλ‚˜ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+* μ΄λŸ¬ν•œ μŠ€ν‚€λ§ˆλŠ”, μƒμ„±λœ OpenAPI μŠ€ν‚€λ§ˆ μΌλΆ€κ°€ λ  κ²ƒμ΄λ©°, μžλ™ λ¬Έμ„œν™” <abbr title="μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€">UI</abbr>에 μ‚¬μš©λ©λ‹ˆλ‹€.
+
+## μžλ™ λ¬Έμ„œν™”
+
+λͺ¨λΈμ˜ JSON μŠ€ν‚€λ§ˆλŠ” μƒμ„±λœ OpenAPI μŠ€ν‚€λ§ˆμ— ν¬ν•¨λ˜λ©° λŒ€ν™”ν˜• API λ¬Έμ„œμ— ν‘œμ‹œλ©λ‹ˆλ‹€:
+
+<img src="/img/tutorial/body/image01.png">
+
+이λ₯Ό ν•„μš”λ‘œ ν•˜λŠ” κ°κ°μ˜ *경둜 μž‘동*λ‚΄λΆ€μ˜ API λ¬Έμ„œμ—λ„ μ‚¬μš©λ©λ‹ˆλ‹€:
+
+<img src="/img/tutorial/body/image02.png">
+
+## νŽΈμ§‘κΈ° μ§€μ›
+
+νŽΈμ§‘κΈ°μ—μ„œ, ν•¨μˆ˜ λ‚΄μ—μ„œ νƒ€μž… νžŒνŠΈμ™€ μ™„성을 μ–΄λ””μ„œλ‚˜ (λ§Œμ•½ Pydantic model λŒ€μ‹ μ— `dict`을 λ°›μ„ κ²½μš° λ‚˜νƒ€λ‚˜μ§€ μ•Šμ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€) λ°›μ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+<img src="/img/tutorial/body/image03.png">
+
+잘λͺ»λœ νƒ€μž… μ—°μ‚°μ— λŒ€ν•œ μ—λŸ¬ ν™•인도 λ°›μ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+<img src="/img/tutorial/body/image04.png">
+
+λ‹¨μˆœν•œ μš°μ—°μ΄ μ•„λ‹™λ‹ˆλ‹€. ν”„λ ˆμž„μ›Œν¬ μ „체가 μ΄λŸ¬ν•œ λ””μžμΈμ„ μ€‘μ‹¬μœΌλ‘œ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
+
+κ·Έ μ–΄λ–€ μ‹€ν–‰ μ „에, λͺ¨λ“  νŽΈμ§‘κΈ°μ—μ„œ μž‘동할 μˆ˜ μžˆλ„둝 λ³΄μž₯ν•˜κΈ° μœ„ν•΄ μ„€κ³„ λ‹¨κ³„μ—μ„œ ν˜Ήλ…ν•˜κ²Œ ν…ŒμŠ€νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.
+
+이λ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•΄ Pydantic μžμ²΄μ—μ„œ λͺ‡λͺ‡ λ³€κ²½μ μ΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
+
+이전 μŠ€ν¬λ¦°μƒ·μ€ <a href="https://code.visualstudio.com" class="external-link" target="_blank">Visual Studio Code</a>λ₯Ό μ°μ€ κ²ƒμž…λ‹ˆλ‹€.
+
+ν•˜μ§€λ§Œ λ˜‘같은 νŽΈμ§‘κΈ° μ§€μ›μ„ <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>μ—μ„œ λ°›μ„ μˆ˜ μžˆκ±°λ‚˜, λŒ€λΆ€λΆ„μ˜ λ‹€λ₯Έ νŽΈμ§‘κΈ°μ—μ„œλ„ λ°›μ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+<img src="/img/tutorial/body/image05.png">
+
+!!! νŒ
+    λ§Œμ•½ <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>λ₯Ό νŽΈμ§‘κΈ°λ‘œ μ‚¬μš©ν•œλ‹€λ©΄, <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a>을 μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+    λ‹€μŒ μ‚¬ν•­μ„ ν¬ν•¨ν•΄ Pydantic λͺ¨λΈμ— λŒ€ν•œ νŽΈμ§‘κΈ° μ§€μ›μ„ ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€:
+
+    * μžλ™ μ™„μ„±
+    * νƒ€μž… ν™•인
+    * λ¦¬νŒ©ν† λ§
+    * κ²€μƒ‰
+    * μ κ²€
+
+## λͺ¨λΈ μ‚¬μš©ν•˜κΈ°
+
+ν•¨μˆ˜ μ•ˆμ—μ„œ λͺ¨λΈ κ°μ²΄μ˜ λͺ¨λ“  μ–΄νŠΈλ¦¬λ·°νŠΈμ— μ§μ ‘ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€:
+
+=== "Python 3.10+"
+
+    ```Python hl_lines="19"
+    {!> ../../../docs_src/body/tutorial002_py310.py!}
+    ```
+
+=== "Python 3.8+"
+
+    ```Python hl_lines="21"
+    {!> ../../../docs_src/body/tutorial002.py!}
+    ```
+
+## μš”μ²­ λ³Έλ¬Έ + κ²½λ‘œ λ§€κ°œλ³€μˆ˜
+
+경둜 λ§€κ°œλ³€μˆ˜μ™€ μš”μ²­ λ³Έλ¬Έμ„ λ™μ‹œμ— μ„ μ–Έν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+**FastAPI**λŠ” κ²½λ‘œ λ§€κ°œλ³€μˆ˜μ™€ μΌμΉ˜ν•˜λŠ” ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜κ°€ **κ²½λ‘œμ—μ„œ κ°€μ Έμ™€μ•Ό ν•œλ‹€**λŠ” κ²ƒμ„ μΈμ§€ν•˜λ©°, Pydantic λͺ¨λΈλ‘œ μ„ μ–Έλœ κ·Έ ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜λŠ” **μš”μ²­ λ³Έλ¬Έμ—μ„œ κ°€μ Έμ™€μ•Ό ν•œλ‹€**λŠ” κ²ƒμ„ μΈμ§€ν•  κ²ƒμž…λ‹ˆλ‹€.
+
+=== "Python 3.10+"
+
+    ```Python hl_lines="15-16"
+    {!> ../../../docs_src/body/tutorial003_py310.py!}
+    ```
+
+=== "Python 3.8+"
+
+    ```Python hl_lines="17-18"
+    {!> ../../../docs_src/body/tutorial003.py!}
+    ```
+
+## μš”μ²­ λ³Έλ¬Έ + κ²½λ‘œ + μΏΌλ¦¬ λ§€κ°œλ³€μˆ˜
+
+**λ³Έλ¬Έ**, **경둜** κ·Έλ¦¬κ³  **쿼리** λ§€κ°œλ³€μˆ˜ λͺ¨λ‘ λ™μ‹œμ— μ„ μ–Έν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
+
+**FastAPI**λŠ” κ°κ°μ„ μΈμ§€ν•˜κ³  λ°μ΄ν„°λ₯Ό μ˜³λ°”λ₯Έ μœ„μΉ˜μ— κ°€μ Έμ˜¬ κ²ƒμž…λ‹ˆλ‹€.
+
+=== "Python 3.10+"
+
+    ```Python hl_lines="16"
+    {!> ../../../docs_src/body/tutorial004_py310.py!}
+    ```
+
+=== "Python 3.8+"
+
+    ```Python hl_lines="18"
+    {!> ../../../docs_src/body/tutorial004.py!}
+    ```
+
+ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜λŠ” λ‹€μŒμ„ λ”°λΌμ„œ μΈμ§€ν•˜κ²Œ λ©λ‹ˆλ‹€:
+
+* λ§Œμ•½ λ§€κ°œλ³€μˆ˜κ°€ **경둜**에도 μ„ μ–Έλ˜μ–΄ μžˆλ‹€λ©΄, μ΄λŠ” κ²½λ‘œ λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©λ  κ²ƒμž…λ‹ˆλ‹€.
+* λ§Œμ•½ λ§€κ°œλ³€μˆ˜κ°€ (`int`, `float`, `str`, `bool` λ“±κ³Ό κ°™μ€) **μœ μΌν•œ νƒ€μž…**으둜 λ˜μ–΄μžˆμœΌλ©΄, **쿼리** λ§€κ°œλ³€μˆ˜λ‘œ ν•΄μ„λ  κ²ƒμž…λ‹ˆλ‹€.
+* λ§Œμ•½ λ§€κ°œλ³€μˆ˜κ°€ **Pydantic λͺ¨λΈ** νƒ€μž…μœΌλ‘œ μ„ μ–Έλ˜μ–΄ μžˆμœΌλ©΄, μš”μ²­ **λ³Έλ¬Έ**으둜 ν•΄μ„λ  κ²ƒμž…λ‹ˆλ‹€.
+
+!!! μ°Έκ³ 
+    FastAPIλŠ” `q`의 κ°’이 ν•„μš”μ—†μŒμ„ μ•Œκ²Œ λ  κ²ƒμž…λ‹ˆλ‹€. κΈ°λ³Έ κ°’이 `= None`이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
+
+    `Union[str, None]`에 μžˆλŠ” `Union`은 FastAPI에 μ˜ν•΄ μ‚¬μš©λœ κ²ƒμ΄ μ•„λ‹ˆμ§€λ§Œ, νŽΈμ§‘κΈ°λ‘œ ν•˜μ—¬κΈˆ λ” λ‚˜μ€ μ§€μ›κ³Ό μ—λŸ¬ νƒμ§€λ₯Ό μ§€μ›ν•  κ²ƒμž…λ‹ˆλ‹€.
+
+## Pydantic없이
+
+λ§Œμ•½ Pydantic λͺ¨λΈμ„ μ‚¬μš©ν•˜κ³  μ‹Άμ§€ μ•Šλ‹€λ©΄, **Body** λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. [Body - λ‹€μ€‘ λ§€κ°œλ³€μˆ˜: λ³Έλ¬Έμ— μžˆλŠ” μœ μΌν•œ κ°’](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank} λ¬Έμ„œλ₯Ό ν™•μΈν•˜μ„Έμš”.