]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Add Korean translation for `docs/ko/docs/advanced/custom-response.md` (#13265)
author11kkw <11kkw17@gmail.com>
Sat, 15 Feb 2025 11:21:20 +0000 (20:21 +0900)
committerGitHub <noreply@github.com>
Sat, 15 Feb 2025 11:21:20 +0000 (11:21 +0000)
docs/ko/docs/advanced/custom-response.md [new file with mode: 0644]

diff --git a/docs/ko/docs/advanced/custom-response.md b/docs/ko/docs/advanced/custom-response.md
new file mode 100644 (file)
index 0000000..2001956
--- /dev/null
@@ -0,0 +1,313 @@
+# μ‚¬μš©μž μ •μ˜ μ‘λ‹΅ - HTML, Stream, νŒŒμΌ, κΈ°νƒ€
+
+기본적으둜, **FastAPI** μ‘닡을 `JSONResponse`λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€.
+
+이λ₯Ό μž¬μ •μ˜ ν•˜λ €λ©΄ [응닡을 μ§μ ‘ λ°˜ν™˜ν•˜κΈ°](response-directly.md){.internal-link target=_blank}μ—μ„œ λ³Έ κ²ƒμ²˜λŸΌ `Response`λ₯Ό μ§μ ‘ λ°˜ν™˜ν•˜λ©΄ λ©λ‹ˆλ‹€.
+
+κ·ΈλŸ¬λ‚˜ `Response` (λ˜λŠ” `JSONResponse`와 κ°™μ€ ν•˜μœ„ ν΄λž˜μŠ€)λ₯Ό μ§μ ‘ λ°˜ν™˜ν•˜λ©΄, λ°μ΄ν„°κ°€ μžλ™μœΌλ‘œ λ³€ν™˜λ˜μ§€ μ•ŠμœΌλ©° (심지어 `response_model`을 μ„ μ–Έν–ˆλ”라도), λ¬Έμ„œν™”κ°€ μžλ™μœΌλ‘œ μƒμ„±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(예λ₯Ό λ“€μ–΄, μƒμ„±λœ OpenAPI의 μΌλΆ€λ‘œ HTTP ν—€λ” `Content-Type`에 νŠΉμ • "λ―Έλ””μ–΄ νƒ€μž…"을 ν¬ν•¨ν•˜λŠ” κ²½μš°).
+
+ν•˜μ§€λ§Œ *경둜 μž‘μ—… λ°μ½”λ ˆμ΄ν„°*μ—μ„œ `response_class` λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ›ν•˜λŠ” `Response`(예: λͺ¨λ“  `Response` ν•˜μœ„ ν΄λž˜μŠ€)λ₯Ό μ„ μ–Έν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
+
+*경둜 μž‘μ—… ν•¨μˆ˜*μ—μ„œ λ°˜ν™˜ν•˜λŠ” λ‚΄μš©μ€ ν•΄λ‹Ή `Response`μ•ˆμ— ν¬ν•¨λ©λ‹ˆλ‹€.
+
+그리고 λ§Œμ•½ κ·Έ `Response`κ°€ `JSONResponse`와 `UJSONResponse`의 κ²½μš° μ²˜λŸΌ JSON λ―Έλ””μ–΄ νƒ€μž…(`application/json`)을 κ°€μ§€κ³  μžˆλ‹€λ©΄, *경둜 μž‘μ—… λ°μ½”λ ˆμ΄ν„°*μ—μ„œ μ„ μ–Έν•œ Pydantic의 `response_model`을 μ‚¬μš©ν•΄ μžλ™μœΌλ‘œ λ³€ν™˜(및 ν•„터링) λ©λ‹ˆλ‹€.
+
+/// note | μ°Έκ³ 
+
+λ―Έλ””μ–΄ νƒ€μž…이 μ—†λŠ” μ‘λ‹΅ ν΄λž˜μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°, FastAPIλŠ” μ‘닡에 λ‚΄μš©μ΄ μ—†μ„ κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜λ―€λ‘œ μƒμ„±λœ OpenAPI λ¬Έμ„œμ—μ„œ μ‘λ‹΅ ν˜•식을 λ¬Έμ„œν™”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
+
+///
+
+## `ORJSONResponse` μ‚¬μš©ν•˜κΈ°
+
+예λ₯Ό λ“€μ–΄, μ„±λŠ₯을 κ·ΉλŒ€ν™”ν•˜λ €λŠ” κ²½μš°, <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">orjson</a>을 μ„€μΉ˜ν•˜μ—¬ μ‚¬μš©ν•˜κ³  μ‘닡을 `ORJSONResponse`둜 μ„€μ •ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” `Response` ν΄λž˜μŠ€(ν•˜μœ„ ν΄λž˜μŠ€)λ₯Ό μž„ν¬νŠΈν•œ ν›„, **경둜 μž‘μ—… λ°μ½”λ ˆμ΄ν„°*μ—μ„œ μ„ μ–Έν•˜μ„Έμš”.
+
+λŒ€κ·œλͺ¨ μ‘λ‹΅μ˜ κ²½μš°, λ”•μ…”λ„ˆλ¦¬λ₯Ό λ°˜ν™˜ν•˜λŠ” κ²ƒλ³΄λ‹€ `Response`λ₯Ό λ°˜ν™˜ν•˜λŠ” κ²ƒμ΄ ν›¨μ”¬ λΉ λ¦…λ‹ˆλ‹€.
+
+μ΄μœ λŠ” κΈ°λ³Έμ μœΌλ‘œ, FastAPIκ°€ λ‚΄λΆ€μ˜ λͺ¨λ“  ν•­λͺ©μ„ κ²€μ‚¬ν•˜κ³  JSON으둜 μ§λ ¬ν™”ν•  μˆ˜ μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ΄λŠ” μ‚¬μš©μž μ•ˆλ‚΄μ„œμ—μ„œ μ„€λͺ…λœ [JSON ν˜Έν™˜ κ°€λŠ₯ μΈμ½”더](../tutorial/encoder.md){.internal-link target=_blank}λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©μ‹κ³Ό λ™μΌν•©λ‹ˆλ‹€. μ΄λ₯Ό ν†΅ν•΄ λ°μ΄ν„°λ² μ΄μŠ€ λͺ¨λΈκ³Ό κ°™μ€ **μž„μ˜μ˜ κ°μ²΄**λ₯Ό λ°˜ν™˜ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+ν•˜μ§€λ§Œ λ°˜ν™˜ν•˜λŠ” λ‚΄μš©μ΄ **JSON으둜 μ§λ ¬ν™” κ°€λŠ₯**ν•˜λ‹€κ³  ν™•μ‹ ν•˜λŠ” κ²½μš°, ν•΄λ‹Ή λ‚΄μš©μ„ μ‘λ‹΅ ν΄λž˜μŠ€μ— μ§μ ‘ μ „달할 μˆ˜ μžˆμœΌλ©°, FastAPIκ°€ λ°˜ν™˜ λ‚΄μš©μ„ `jsonable_encoder`λ₯Ό ν†΅ν•΄ μ²˜λ¦¬ν•œ λ’€ μ‘λ‹΅ ν΄λž˜μŠ€μ— μ „λ‹¬ν•˜λŠ” μ˜€λ²„ν—€λ“œλ₯Ό ν”Όν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+{* ../../docs_src/custom_response/tutorial001b.py hl[2,7] *}
+
+/// info | μ •보
+
+`response_class` λ§€κ°œλ³€μˆ˜λŠ” μ‘λ‹΅μ˜ "λ―Έλ””μ–΄ νƒ€μž…"을 μ •μ˜ν•˜λŠ” λ°μ—λ„ μ‚¬μš©λ©λ‹ˆλ‹€.
+
+이 κ²½μš°, HTTP ν—€λ” `Content-Type`은 `application/json`으둜 μ„€μ •λ©λ‹ˆλ‹€.
+
+그리고 μ΄λŠ” OpenAPI에 κ·ΈλŒ€λ‘œ λ¬Έμ„œν™”λ©λ‹ˆλ‹€.
+
+///
+
+/// tip | νŒ
+
+`ORJSONResponse`λŠ” FastAPIμ—μ„œλ§Œ μ‚¬μš©ν•  μˆ˜ μžˆκ³  Starletteμ—μ„œλŠ” μ‚¬μš©ν•  μˆ˜ μ—†μŠ΅λ‹ˆλ‹€.
+
+///
+
+## HTML μ‘λ‹΅
+
+**FastAPI**μ—μ„œ HTML μ‘닡을 μ§μ ‘ λ°˜ν™˜ν•˜λ €λ©΄ `HTMLResponse`λ₯Ό μ‚¬μš©ν•˜μ„Έμš”.
+
+* `HTMLResponse`λ₯Ό μž„ν¬νŠΈ ν•©λ‹ˆλ‹€.
+* *경둜 μž‘μ—… λ°μ½”λ ˆμ΄ν„°*의 `response_class` λ§€κ°œλ³€μˆ˜λ‘œ `HTMLResponse`λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.
+
+{* ../../docs_src/custom_response/tutorial002.py hl[2,7] *}
+
+/// info | μ •보
+
+`response_class` λ§€κ°œλ³€μˆ˜λŠ” μ‘λ‹΅μ˜ "λ―Έλ””μ–΄ νƒ€μž…"을 μ •μ˜ν•˜λŠ” λ°μ—λ„ μ‚¬μš©λ©λ‹ˆλ‹€.
+
+이 κ²½μš°, HTTP ν—€λ” `Content-Type`은 `text/html`둜 μ„€μ •λ©λ‹ˆλ‹€.
+
+그리고 μ΄λŠ” OpenAPI에 κ·ΈλŒ€λ‘œ λ¬Έμ„œν™” λ©λ‹ˆλ‹€.
+
+///
+
+### `Response` λ°˜ν™˜ν•˜κΈ°
+
+[응닡을 μ§μ ‘ λ°˜ν™˜ν•˜κΈ°](response-directly.md){.internal-link target=_blank}μ—μ„œ λ³Έ κ²ƒ μ²˜λŸΌ, *경둜 μž‘μ—…*μ—μ„œ μ‘닡을 μ§μ ‘ λ°˜ν™˜ν•˜μ—¬ μž¬μ •μ˜ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
+
+μœ„μ˜ μ˜ˆμ œμ™€ λ™μΌν•˜κ²Œ `HTMLResponse`λ₯Ό λ°˜ν™˜ν•˜λŠ” μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+{* ../../docs_src/custom_response/tutorial003.py hl[2,7,19] *}
+
+/// warning | κ²½κ³ 
+
+*경둜 μž‘μ—… ν•¨μˆ˜*μ—μ„œ μ§μ ‘ λ°˜ν™˜λœ `Response`λŠ” OpenAPI에 λ¬Έμ„œν™”λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(예λ₯Όλ“€μ–΄, `Content-Type`이 λ¬Έμ„œν™”λ˜μ§€ μ•ŠμŒ) μžλ™ λŒ€ν™”ν˜• λ¬Έμ„œμ—μ„œλ„ ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
+
+///
+
+/// info | μ •보
+
+λ¬Όλ‘  μ‹€μ œ `Content-Type` ν—€λ”, μƒνƒœ μ½”λ“œ λ“±μ€ λ°˜ν™˜λœ `Response` κ°μ²΄μ—μ„œ κ°€μ Έμ˜΅λ‹ˆλ‹€.
+
+///
+
+### OpenAPI에 λ¬Έμ„œν™”ν•˜κ³  `Response` μž¬μ •μ˜ ν•˜κΈ°
+
+ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ‘닡을 μž¬μ •μ˜ν•˜λ©΄μ„œ λ™μ‹œμ— OpenAPIμ—μ„œ "λ―Έλ””μ–΄ νƒ€μž…"을 λ¬Έμ„œν™”ν•˜κ³  μ‹Άλ‹€λ©΄, `response_class` λ§€κ²Œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ `Response` κ°μ²΄λ₯Ό λ°˜ν™˜ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+이 κ²½μš° `response_class`λŠ” OpenAPI *경둜 μž‘μ—…*을 λ¬Έμ„œν™”ν•˜λŠ” λ°λ§Œ μ‚¬μš©λ˜κ³ , μ‹€μ œλ‘œλŠ” μ—¬λŸ¬λΆ„이 λ°˜ν™˜ν•œ `Response`κ°€ κ·ΈλŒ€λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.
+
+### `HTMLResponse`직접 λ°˜ν™˜ν•˜κΈ°
+
+예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό κ°™μ΄ μž‘μ„±ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+{* ../../docs_src/custom_response/tutorial004.py hl[7,21,23] *}
+
+이 μ˜ˆμ œμ—μ„œ, `generate_html_response()` ν•¨μˆ˜λŠ” HTML을 `str`둜 λ°˜ν™˜ν•˜λŠ” λŒ€μ‹  μ΄λ―Έ `Response`λ₯Ό μƒμ„±ν•˜κ³  λ°˜ν™˜ν•©λ‹ˆλ‹€.
+
+`generate_html_response()`λ₯Ό ν˜ΈμΆœν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•¨μœΌλ‘œμ¨, κΈ°λ³Έμ μΈ **FastAPI** κΈ°λ³Έ λ™μž‘을 μž¬μ •μ˜ ν•˜λŠ” `Response`λ₯Ό μ΄λ―Έ λ°˜ν™˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
+
+ν•˜μ§€λ§Œ `response_class`에 `HTMLResponse`λ₯Ό ν•¨κ»˜ μ „λ‹¬ν–ˆκΈ° λ•Œλ¬Έμ—, FastAPIλŠ” μ΄λ₯Ό OpenAPI λ° λŒ€ν™”ν˜• λ¬Έμ„œμ—μ„œ `text/html`둜 HTML을 λ¬Έμ„œν™” ν•˜λŠ” λ°©λ²•을 μ•Œ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+<img src="/img/tutorial/custom-response/image01.png">
+
+## μ‚¬μš© κ°€λŠ₯ν•œ μ‘λ‹΅λ“€
+
+λ‹€μŒμ€ μ‚¬μš©ν•  μˆ˜ μžˆλŠ” λͺ‡κ°€μ§€ μ‘λ‹΅λ“€ μž…λ‹ˆλ‹€.
+
+`Response`λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€λ₯Έ μ–΄λ–€ κ²ƒλ„ λ°˜ν™˜ ν• μˆ˜ μžˆμœΌλ©°, μ§μ ‘ ν•˜μœ„ ν΄λž˜μŠ€λ₯Ό λ§Œλ“€ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
+
+/// note | κΈ°μˆ  μ„ΈλΆ€μ‚¬ν•­
+
+`from starlette.responses import HTMLResponse`λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
+
+**FastAPI**λŠ” κ°œλ°œμžμΈ μ—¬λŸ¬λΆ„μ˜ νŽΈμ˜λ₯Ό μœ„ν•΄ `starlette.responses`λ₯Ό `fastapi.responses`둜 μ œκ³΅ ν•˜μ§€λ§Œ, λŒ€λΆ€λΆ„μ˜ μ‚¬μš© κ°€λŠ₯ν•œ μ‘닡은 Starletteμ—μ„œ μ§μ ‘ κ°€μ Έμ˜΅λ‹ˆλ‹€.
+
+///
+
+### `Response`
+
+κΈ°λ³Έ `Response` ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ λͺ¨λ“  μ‘λ‹΅ ν΄λž˜μŠ€μ˜ λΆ€λͺ¨ ν΄λž˜μŠ€ μž…λ‹ˆλ‹€.
+
+이 ν΄λž˜μŠ€λ₯Ό μ§μ ‘ λ°˜ν™˜ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+λ‹€μŒ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›μ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+* `content` - `str` λ˜λŠ” `bytes`.
+* `status_code` - HTTP μƒνƒœμ½”λ“œλ₯Ό λ‚˜νƒ€λ‚΄λŠ”  `int`.
+* `headers` - λ¬Έμžμ—΄λ‘œ μ΄λ£¨μ–΄μ§„ `dict`.
+* `media_type` - λ―Έλ””μ–΄ νƒ€μž…을 λ‚˜νƒ€λ‚΄λŠ” `str` μ˜ˆ: `"text/html"`.
+
+FastAPI (μ‹€μ œλ‘œλŠ” Starlette)κ°€ μžλ™μœΌλ‘œ `Content-Length` ν—€λ”λ₯Ό ν¬ν•¨μ‹œν‚΅λ‹ˆλ‹€. λ˜ν•œ `media_type`에 κΈ°λ°˜ν•˜μ—¬ `Content-Type` ν—€λ”λ₯Ό ν¬ν•¨ν•˜λ©°, ν…μŠ€νŠΈ νƒ€μž…μ˜ κ²½μš° λ¬Έμž μ§‘합을 μΆ”κ°€ ν•©λ‹ˆλ‹€.
+
+{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
+
+### `HTMLResponse`
+
+ν…μŠ€νŠΈ λ˜λŠ” λ°”μ΄νŠΈλ₯Ό λ°›μ•„ HTML μ‘닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. μœ„μ—μ„œ μ„€λͺ…ν•œ λ‚΄μš©κ³Ό κ°™μŠ΅λ‹ˆλ‹€.
+
+### `PlainTextResponse`
+
+ν…μŠ€νŠΈ λ˜λŠ” λ°”μ΄νŠΈλ₯Ό λ°›μ•„ μΌλ°˜ ν…μŠ€νŠΈ μ‘닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
+
+{* ../../docs_src/custom_response/tutorial005.py hl[2,7,9] *}
+
+### `JSONResponse`
+
+데이터λ₯Ό λ°›μ•„ `application/json`으둜 μΈμ½”λ”©λœ μ‘닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
+
+μ΄λŠ” μœ„μ—μ„œ μ„€λͺ…ν–ˆλ“―이 **FastAPI**μ—μ„œ κΈ°λ³Έμ μœΌλ‘œ μ‚¬μš©λ˜λŠ” μ‘λ‹΅ ν˜•μ‹μž…λ‹ˆλ‹€.
+
+### `ORJSONResponse`
+
+ <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a>을 μ‚¬μš©ν•˜μ—¬ λΉ λ₯Έ JSON μ‘닡을 μ œκ³΅ν•˜λŠ” λŒ€μ•ˆμž…λ‹ˆλ‹€. μœ„μ—μ„œ μ„€λͺ…ν•œ λ‚΄μš©κ³Ό κ°™μŠ΅λ‹ˆλ‹€.
+
+/// info | μ •보
+
+이λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ `orjson`을 μ„€μΉ˜ν•΄μ•Όν•©λ‹ˆλ‹€. μ˜ˆ: `pip install orjson`.
+
+///
+
+### `UJSONResponse`
+
+<a href="https://github.com/ultrajson/ultrajson" class="external-link" target="_blank">`ujson`</a>을 μ‚¬μš©ν•œ λ˜ λ‹€λ₯Έ JSON μ‘λ‹΅ ν˜•μ‹μž…λ‹ˆλ‹€.
+
+/// info | μ •보
+
+이 μ‘닡을 μ‚¬μš©ν•˜λ €λ©΄ `ujson`을 μ„€μΉ˜ν•΄μ•Όν•©λ‹ˆλ‹€. μ˜ˆ: 'pip install ujson`.
+
+///
+
+/// warning | κ²½κ³ 
+
+`ujson` μ€ μΌλΆ€ μ˜ˆμ™Έ κ²½μš°λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ° μžˆμ–΄ Python λ‚΄μž₯ κ΅¬ν˜„보닀 λœ μ—„κ²©ν•©λ‹ˆλ‹€.
+
+///
+
+{* ../../docs_src/custom_response/tutorial001.py hl[2,7] *}
+
+/// tip | νŒ
+
+`ORJSONResponse`κ°€ λ” λΉ λ₯Έ λŒ€μ•ˆμΌ κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.
+
+///
+
+### `RedirectResponse`
+
+HTTP λ¦¬λ””λ ‰μ…˜ μ‘닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. κΈ°λ³Έμ μœΌλ‘œ μƒνƒœ μ½”λ“œλŠ” 307(μž„μ‹œ λ¦¬λ””λ ‰μ…˜)으둜 μ„€μ •λ©λ‹ˆλ‹€.
+
+`RedirectResponse`λ₯Ό μ§μ ‘ λ°˜ν™˜ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+{* ../../docs_src/custom_response/tutorial006.py hl[2,9] *}
+
+---
+
+λ˜λŠ” `response_class` λ§€κ°œλ³€μˆ˜μ—μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:
+
+
+{* ../../docs_src/custom_response/tutorial006b.py hl[2,7,9] *}
+
+이 κ²½μš°, *경둜 μž‘μ—…* ν•¨μˆ˜μ—μ„œ URL을 μ§μ ‘ λ°˜ν™˜ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+이 κ²½μš°, μ‚¬μš©λ˜λŠ” `status_code`λŠ” `RedirectResponse`의 κΈ°λ³Έκ°’인 `307` μž…λ‹ˆλ‹€.
+
+---
+
+`status_code` λ§€κ°œλ³€μˆ˜λ₯Ό `response_class` λ§€κ°œλ³€μˆ˜μ™€ ν•¨κ»˜ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:
+
+{* ../../docs_src/custom_response/tutorial006c.py hl[2,7,9] *}
+
+### `StreamingResponse`
+
+비동기 μ œλ„ˆλ ˆμ΄ν„° λ˜λŠ” μΌλ°˜ μ œλ„ˆλ ˆμ΄ν„°/μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°›μ•„ μ‘λ‹΅ λ³Έλ¬Έμ„ μŠ€νŠΈλ¦¬λ° ν•©λ‹ˆλ‹€.
+
+{* ../../docs_src/custom_response/tutorial007.py hl[2,14] *}
+
+#### νŒŒμΌκ³Ό κ°™μ€ κ°μ²΄λ₯Ό μ‚¬μš©ν•œ `StreamingResponse`
+
+파일과 κ°™μ€ κ°μ²΄(예: `open()`으둜 λ°˜ν™˜λœ κ°μ²΄)κ°€ μžˆλŠ” κ²½μš°, ν•΄λ‹Ή νŒŒμΌκ³Ό κ°™μ€ κ°μ²΄λ₯Ό λ°˜λ³΅(iterate)ν•˜λŠ” μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λ₯Ό λ§Œλ“€ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+이 λ°©μ‹μœΌλ‘œ, νŒŒμΌ μ „체λ₯Ό λ©”λͺ¨λ¦¬μ— λ¨Όμ € μ½μ–΄λ“€μΌ ν•„μš” μ—†μ΄, μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λ₯Ό `StreamingResponse`에 μ „λ‹¬ν•˜μ—¬ λ°˜ν™˜ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+이 λ°©μ‹μ€ ν΄λΌμš°λ“œ μŠ€ν† λ¦¬μ§€, λΉ„λ””μ˜€ μ²˜λ¦¬ λ“±μ˜ λ‹€μ–‘ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ ν•¨κ»˜ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+{* ../../docs_src/custom_response/tutorial008.py hl[2,10:12,14] *}
+
+1. μ΄κ²ƒμ΄ μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜μž…λ‹ˆλ‹€. `yield` λ¬Έμ„ ν¬ν•¨ν•˜κ³  μžˆμœΌλ―€λ‘œ "μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜"μž…λ‹ˆλ‹€.
+2. `with` λΈ”둝을 μ‚¬μš©ν•¨μœΌλ‘œμ¨, μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜κ°€ μ™„λ£Œλœ ν›„ νŒŒμΌκ³Ό κ°™μ€ κ°μ²΄κ°€ λ‹«νžˆλ„둝 ν•©λ‹ˆλ‹€. μ¦‰, μ‘λ‹΅ μ „솑이 λλ‚œ ν›„ λ‹«νž™λ‹ˆλ‹€.
+3. μ΄ `yield from`은 ν•¨μˆ˜κ°€ `file_like`λΌλŠ” κ°μ²΄λ₯Ό λ°˜λ³΅(iterate)ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. λ°˜λ³΅λœ κ° λΆ€λΆ„은 μ΄ μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜(`iterfile`)μ—μ„œ μƒμ„±λœ κ²ƒμ²˜λŸΌ `yield` λ©λ‹ˆλ‹€.
+
+    μ΄λ ‡κ²Œ ν•˜λ©΄ "생성(generating)" μž‘업을 λ‚΄λΆ€μ μœΌλ‘œ λ‹€λ₯Έ λ¬΄μ–Έκ°€μ— μœ„μž„ν•˜λŠ” μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜κ°€ λ©λ‹ˆλ‹€.
+
+   μ΄ λ°©μ‹μ„ μ‚¬μš©ν•˜λ©΄ `with` λΈ”둝 μ•ˆμ—μ„œ νŒŒμΌμ„ μ—΄ μˆ˜ μžˆμ–΄, μž‘업이 μ™„λ£Œλœ ν›„ νŒŒμΌκ³Ό κ°™μ€ κ°μ²΄κ°€ λ‹«νžˆλŠ” κ²ƒμ„ λ³΄μž₯ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+/// tip | νŒ
+
+μ—¬κΈ°μ„œ ν‘œμ€€ `open()`을 μ‚¬μš©ν•˜κ³  μžˆκΈ° λ•Œλ¬Έμ— `async`와 `await`λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ κ²½λ‘œ μž‘업은 μΌλ°˜ `def`둜 μ„ μ–Έν•©λ‹ˆλ‹€.
+
+///
+
+### `FileResponse`
+
+νŒŒμΌμ„ λΉ„λ™κΈ°λ‘œ μŠ€νŠΈλ¦¬λ°ν•˜μ—¬ μ‘λ‹΅ν•©λ‹ˆλ‹€.
+
+λ‹€λ₯Έ μ‘λ‹΅ μœ ν˜•κ³ΌλŠ” λ‹€λ₯Έ μΈμˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°μ²΄λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€:
+
+* `path` - μŠ€νŠΈλ¦¬λ°ν•  νŒŒμΌμ˜ κ²½λ‘œ.
+* `headers` - λ”•μ…”λ„ˆλ¦¬ ν˜•μ‹μ˜ μ‚¬μš©μž μ •μ˜ ν—€λ”.
+* `media_type` - λ―Έλ””μ–΄ νƒ€μž…을 λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄. μ„€μ •λ˜μ§€ μ•Šμ€ κ²½μš° νŒŒμΌ μ΄λ¦„μ΄λ‚˜ κ²½λ‘œλ₯Ό μ‚¬μš©ν•˜μ—¬ μΆ”λ‘ ν•©λ‹ˆλ‹€.
+* `filename` - μ„€μ •λœ κ²½μš° μ‘λ‹΅μ˜ `Content-Disposition`에 ν¬ν•¨λ©λ‹ˆλ‹€.
+
+파일 μ‘λ‹΅μ—λŠ” μ μ ˆν•œ `Content-Length`, `Last-Modified`, λ° `ETag` ν—€λ”κ°€ ν¬ν•¨λ©λ‹ˆλ‹€.
+
+{* ../../docs_src/custom_response/tutorial009.py hl[2,10] *}
+
+λ˜ν•œ `response_class` λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:
+
+{* ../../docs_src/custom_response/tutorial009b.py hl[2,8,10] *}
+
+이 κ²½μš°, κ²½λ‘œ μž‘μ—… ν•¨μˆ˜μ—μ„œ νŒŒμΌ κ²½λ‘œλ₯Ό μ§μ ‘ λ°˜ν™˜ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+## μ‚¬μš©μž μ •μ˜ μ‘λ‹΅ ν΄λž˜μŠ€
+
+`Response`λ₯Ό μƒμ†λ°›μ•„ μ‚¬μš©μž μ •μ˜ μ‘λ‹΅ ν΄λž˜μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+예λ₯Ό λ“€μ–΄, ν¬ν•¨λœ `ORJSONResponse` ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μ„€μ •μœΌλ‘œ <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">orjson</a>을 μ‚¬μš©ν•˜κ³  μ‹Άλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€.
+
+λ§Œμ•½ λ“€μ—¬μ“°κΈ° λ° ν¬λ§·λœ JSON을 λ°˜ν™˜ν•˜κ³  μ‹Άλ‹€λ©΄, `orjson.OPT_INDENT_2` μ˜΅μ…˜μ„ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+`CustomORJSONResponse`λ₯Ό μƒμ„±ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ ν•΅μ‹¬μ€ `Response.render(content)` λ©”μ„œλ“œλ₯Ό μƒμ„±ν•˜μ—¬ λ‚΄μš©μ„ `bytes`둜 λ°˜ν™˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€:
+
+{* ../../docs_src/custom_response/tutorial009c.py hl[9:14,17] *}
+
+이제 λ‹€μŒ λŒ€μ‹ :
+
+```json
+{"message": "Hello World"}
+```
+
+이 μ‘닡은 μ΄λ ‡κ²Œ λ°˜ν™˜λ©λ‹ˆλ‹€:
+
+```json
+{
+  "message": "Hello World"
+}
+```
+
+λ¬Όλ‘  JSON ν¬λ§·νŒ…보닀 λ” μœ μš©ν•˜κ²Œ ν™œμš©ν•  λ°©λ²•을 μ°Ύμ„ μˆ˜ μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. πŸ˜‰
+
+## κΈ°λ³Έ μ‘λ‹΅ ν΄λž˜μŠ€
+
+**FastAPI** ν΄λž˜μŠ€ κ°μ²΄ λ˜λŠ” `APIRouter`λ₯Ό μƒμ„±ν•  λ•Œ κΈ°λ³Έμ μœΌλ‘œ μ‚¬μš©ν•  μ‘λ‹΅ ν΄λž˜μŠ€λ₯Ό μ§€μ •ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+이λ₯Ό μ •μ˜ν•˜λŠ” λ§€κ°œλ³€μˆ˜λŠ” `default_response_class`μž…λ‹ˆλ‹€.
+
+μ•„λž˜ μ˜ˆμ œμ—μ„œ **FastAPI**λŠ” λͺ¨λ“  κ²½λ‘œ μž‘μ—…μ—μ„œ κΈ°λ³Έμ μœΌλ‘œ `JSONResponse` λŒ€μ‹  `ORJSONResponse`λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
+
+{* ../../docs_src/custom_response/tutorial010.py hl[2,4] *}
+
+/// tip | νŒ
+
+μ—¬μ „νžˆ μ΄μ „μ²˜λŸΌ *경둜 μž‘μ—…*μ—μ„œ `response_class`λ₯Ό μž¬μ •μ˜ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+///
+
+## μΆ”κ°€ λ¬Έμ„œν™”
+
+OpenAPIμ—μ„œ `responses`λ₯Ό μ‚¬μš©ν•˜μ—¬ λ―Έλ””μ–΄ νƒ€μž… λ° κΈ°νƒ€ μ„ΈλΆ€ μ •보λ₯Ό μ„ μ–Έν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€: [OpenAPIμ—μ„œ μΆ”κ°€ μ‘λ‹΅](additional-responses.md){.internal-link target=_blank}.