]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
๐ŸŒ Update translations for ko (add-missing) (#15168)
authorSebastiรกn Ramรญrez <tiangolo@gmail.com>
Thu, 19 Mar 2026 18:56:39 +0000 (19:56 +0100)
committerGitHub <noreply@github.com>
Thu, 19 Mar 2026 18:56:39 +0000 (18:56 +0000)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
docs/ko/docs/advanced/json-base64-bytes.md [new file with mode: 0644]
docs/ko/docs/advanced/stream-data.md [new file with mode: 0644]
docs/ko/docs/advanced/strict-content-type.md [new file with mode: 0644]
docs/ko/docs/editor-support.md [new file with mode: 0644]
docs/ko/docs/tutorial/server-sent-events.md [new file with mode: 0644]
docs/ko/docs/tutorial/stream-json-lines.md [new file with mode: 0644]

diff --git a/docs/ko/docs/advanced/json-base64-bytes.md b/docs/ko/docs/advanced/json-base64-bytes.md
new file mode 100644 (file)
index 0000000..b5e55a4
--- /dev/null
@@ -0,0 +1,63 @@
+# ๋ฐ”์ดํŠธ๋ฅผ Base64๋กœ ํฌํ•จํ•˜๋Š” JSON { #json-with-bytes-as-base64 }
+
+์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•„์•ผ ํ•˜์ง€๋งŒ ๊ทธ ์•ˆ์— ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค๋ฉด, base64๋กœ ์ธ์ฝ”๋”ฉํ•ด์„œ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+## Base64์™€ ํŒŒ์ผ { #base64-vs-files }
+
+๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ์—๋Š” [์š”์ฒญ ํŒŒ์ผ](../tutorial/request-files.md)์„, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์ „์†ก์—๋Š” [์ปค์Šคํ…€ ์‘๋‹ต - FileResponse](./custom-response.md#fileresponse--fileresponse-)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋จผ์ € ๊ณ ๋ คํ•˜์„ธ์š”. JSON์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹  ๋ง์ž…๋‹ˆ๋‹ค.
+
+JSON์€ UTF-8๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์›์‹œ ๋ฐ”์ดํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‹ด์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
+
+Base64๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ฅผ ์œ„ํ•ด ์›๋ž˜์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฌธ์ž ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ ํŒŒ์ผ ์ „์†ก๋ณด๋‹ค ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+๋ฐ˜๋“œ์‹œ JSON ์•ˆ์— ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜๊ณ , ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ๋งŒ base64๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
+
+## Pydantic `bytes` { #pydantic-bytes }
+
+`bytes` ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ Pydantic ๋ชจ๋ธ์„ ์„ ์–ธํ•˜๊ณ , ๋ชจ๋ธ ์„ค์ •์—์„œ `val_json_bytes`๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•˜๋ฉด ์ž…๋ ฅ JSON ๋ฐ์ดํ„ฐ๋ฅผ base64๋กœ โ€œ๊ฒ€์ฆโ€ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒ€์ฆ ๊ณผ์ •์˜ ์ผ๋ถ€๋กœ base64 ๋ฌธ์ž์—ด์„ ๋ฐ”์ดํŠธ๋กœ ๋””์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.
+
+{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *}
+
+`/docs`๋ฅผ ํ™•์ธํ•˜๋ฉด `data` ํ•„๋“œ๊ฐ€ base64๋กœ ์ธ์ฝ”๋”ฉ๋œ bytes๋ฅผ ๊ธฐ๋Œ€ํ•œ๋‹ค๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค:
+
+<div class="screenshot">
+<img src="/img/tutorial/json-base64-bytes/image01.png">
+</div>
+
+์•„๋ž˜์™€ ๊ฐ™์€ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+```json
+{
+    "description": "Some data",
+    "data": "aGVsbG8="
+}
+```
+
+/// tip | ํŒ
+
+`aGVsbG8=`๋Š” `hello`์˜ base64 ์ธ์ฝ”๋”ฉ์ž…๋‹ˆ๋‹ค.
+
+///
+
+๊ทธ๋Ÿฌ๋ฉด Pydantic์ด base64 ๋ฌธ์ž์—ด์„ ๋””์ฝ”๋”ฉํ•˜์—ฌ ๋ชจ๋ธ์˜ `data` ํ•„๋“œ์— ์›๋ž˜ ๋ฐ”์ดํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
+
+๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
+
+```json
+{
+  "description": "Some data",
+  "content": "hello"
+}
+```
+
+## ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ์šฉ Pydantic `bytes` { #pydantic-bytes-for-output-data }
+
+์ถœ๋ ฅ ๋ฐ์ดํ„ฐ์—๋„ ๋ชจ๋ธ ์„ค์ •์—์„œ `ser_json_bytes`์™€ ํ•จ๊ป˜ `bytes` ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Pydantic์ด JSON ์‘๋‹ต์„ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ”์ดํŠธ๋ฅผ base64๋กœ โ€œ์ง๋ ฌํ™”โ€ํ•ฉ๋‹ˆ๋‹ค.
+
+{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *}
+
+## ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ์šฉ Pydantic `bytes` { #pydantic-bytes-for-input-and-output-data }
+
+๋ฌผ๋ก , ๋™์ผํ•œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ๋•Œ๋Š” `val_json_bytes`๋กœ ์ž…๋ ฅ์„ โ€œ๊ฒ€์ฆโ€ํ•˜๊ณ , JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ๋Š” `ser_json_bytes`๋กœ ์ถœ๋ ฅ์„ โ€œ์ง๋ ฌํ™”โ€ํ•˜๋„๋ก base64๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *}
diff --git a/docs/ko/docs/advanced/stream-data.md b/docs/ko/docs/advanced/stream-data.md
new file mode 100644 (file)
index 0000000..5eda170
--- /dev/null
@@ -0,0 +1,117 @@
+# ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ { #stream-data }
+
+JSON์œผ๋กœ ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋ฉด [JSON Lines ์ŠคํŠธ๋ฆฌ๋ฐ](../tutorial/stream-json-lines.md)์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
+
+ํ•˜์ง€๋งŒ ์ˆœ์ˆ˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋‚˜ ๋ฌธ์ž์—ด์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
+
+/// info | ์ •๋ณด
+
+FastAPI 0.134.0์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
+
+///
+
+## ์‚ฌ์šฉ ์˜ˆ์‹œ { #use-cases }
+
+์˜ˆ๋ฅผ ๋“ค์–ด AI LLM ์„œ๋น„์Šค์˜ ์ถœ๋ ฅ์—์„œ ๋ฐ”๋กœ ์ˆœ์ˆ˜ ๋ฌธ์ž์—ด์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+๋˜ํ•œ ํฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ฝ์ง€ ์•Š๊ณ , ์ฝ๋Š” ์ฆ‰์‹œ ๋ฐ์ดํ„ฐ ์ฒญํฌ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•ฉ๋‹ˆ๋‹ค.
+
+์ด ๋ฐฉ์‹์œผ๋กœ ๋น„๋””์˜ค๋‚˜ ์˜ค๋””์˜ค๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณง๋ฐ”๋กœ ์ „์†กํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+## `yield`์™€ ํ•จ๊ป˜ `StreamingResponse` ์‚ฌ์šฉํ•˜๊ธฐ { #a-streamingresponse-with-yield }
+
+๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์—์„œ `response_class=StreamingResponse`๋ฅผ ์„ ์–ธํ•˜๋ฉด `yield`๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ฒญํฌ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
+
+FastAPI๋Š” ๊ฐ ๋ฐ์ดํ„ฐ ์ฒญํฌ๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ `StreamingResponse`์— ์ „๋‹ฌํ•˜๋ฉฐ, JSON ๋“ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
+
+### async๊ฐ€ ์•„๋‹Œ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ { #non-async-path-operation-functions }
+
+`async`๊ฐ€ ์—†๋Š” ์ผ๋ฐ˜ `def` ํ•จ์ˆ˜์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ `yield`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *}
+
+### ํƒ€์ž… ์• ๋„ˆํ…Œ์ด์…˜ ์ƒ๋žตํ•˜๊ธฐ { #no-annotation }
+
+๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ๋•Œ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž… ์• ๋„ˆํ…Œ์ด์…˜์„ ๊ตณ์ด ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
+
+FastAPI๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Pydantic์œผ๋กœ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์ง๋ ฌํ™”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ด ๊ฒฝ์šฐ ํƒ€์ž… ์• ๋„ˆํ…Œ์ด์…˜์€ ํŽธ์ง‘๊ธฐ๋‚˜ ๋„๊ตฌ๋ฅผ ์œ„ํ•œ ์šฉ๋„์ผ ๋ฟ์ด๋ฉฐ FastAPI์—์„œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
+
+์ด๋Š” ๊ณง `StreamingResponse`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํƒ€์ž… ์• ๋„ˆํ…Œ์ด์…˜๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ, ์ „์†ก ๊ธฐ์ค€์— ๋งž์ถฐ ๋ฐ”์ดํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธ์ฝ”๋”ฉํ•  ์ž์œ ์™€ ์ฑ…์ž„์ด ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค“
+
+### ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ { #stream-bytes }
+
+์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฌธ์ž์—ด ๋Œ€์‹  `bytes`๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *}
+
+## ์‚ฌ์šฉ์ž ์ •์˜ `PNGStreamingResponse` { #a-custom-pngstreamingresponse }
+
+์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ๋ฐ”์ดํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ–ˆ์ง€๋งŒ, ์‘๋‹ต์— `Content-Type` ํ—ค๋”๊ฐ€ ์—†์–ด ํด๋ผ์ด์–ธํŠธ๋Š” ์–ด๋–ค ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
+
+์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋งž์ถฐ `Content-Type` ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜๋Š” `StreamingResponse`์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+์˜ˆ๋ฅผ ๋“ค์–ด `media_type` ์†์„ฑ์„ ์‚ฌ์šฉํ•ด `Content-Type` ํ—ค๋”๋ฅผ `image/png`๋กœ ์„ค์ •ํ•˜๋Š” `PNGStreamingResponse`๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
+
+๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์—์„œ `response_class=PNGStreamingResponse`๋กœ ์ด ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
+
+### ํŒŒ์ผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ { #simulate-a-file }
+
+์ด ์˜ˆ์‹œ์—์„œ๋Š” `io.BytesIO`๋กœ ํŒŒ์ผ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋งŒ ์กด์žฌํ•˜์ง€๋งŒ ํŒŒ์ผ๊ณผ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŒŒ์ผ ์œ ์‚ฌ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
+
+์˜ˆ๋ฅผ ๋“ค์–ด ์‹ค์ œ ํŒŒ์ผ์ฒ˜๋Ÿผ ๋‚ด์šฉ์„ ์†Œ๋น„ํ•˜๊ธฐ ์œ„ํ•ด ์ˆœํšŒ(iterate)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *}
+
+/// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
+
+๋‹ค๋ฅธ ๋‘ ๋ณ€์ˆ˜ `image_base64`์™€ `binary_image`๋Š” ์ด๋ฏธ์ง€๋ฅผ Base64๋กœ ์ธ์ฝ”๋”ฉํ•œ ๋’ค ๋ฐ”์ดํŠธ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ์ด๋ฉฐ, ์ด๋ฅผ `io.BytesIO`์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
+
+์ด ์˜ˆ์‹œ์—์„œ ํ•˜๋‚˜์˜ ํŒŒ์ผ ์•ˆ์— ๋ชจ๋‘ ๋‹ด์•„, ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. ๐Ÿฅš
+
+///
+
+`with` ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜(`yield`๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜)๊ฐ€ ๋๋‚œ ๋’ค, ์ฆ‰ ์‘๋‹ต ์ „์†ก์ด ์™„๋ฃŒ๋œ ํ›„ ํŒŒ์ผ ์œ ์‚ฌ ๊ฐ์ฒด๊ฐ€ ๋‹ซํžˆ๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
+
+์ด ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๊ฐ€์งœ ํŒŒ์ผ(`io.BytesIO`)์ด๋ผ๋ฉด ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ, ์‹ค์ œ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ ์ž‘์—…์ด ๋๋‚œ ๋’ค ํŒŒ์ผ์„ ๋‹ซ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
+
+### ํŒŒ์ผ๊ณผ ๋น„๋™๊ธฐ { #files-and-async }
+
+๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํŒŒ์ผ ์œ ์‚ฌ ๊ฐ์ฒด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ async/await์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
+
+์˜ˆ๋ฅผ ๋“ค์–ด `await file.read()`๋‚˜ `async for chunk in file`๊ณผ ๊ฐ™์€ ํŒจํ„ด์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
+
+๋˜ํ•œ ๋””์Šคํฌ๋‚˜ ๋„คํŠธ์›Œํฌ์—์„œ ์ฝ๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ ๊ฒฝ์šฐ ์ฝ๊ธฐ ์ž‘์—…์€ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๋ธ”๋กœํ‚น ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค.
+
+/// info | ์ •๋ณด
+
+์œ„์˜ ์˜ˆ์‹œ๋Š” ์˜ˆ์™ธ์ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. `io.BytesIO` ๊ฐ์ฒด๋Š” ์ด๋ฏธ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ์œผ๋ฏ€๋กœ ์ฝ๊ธฐ๊ฐ€ ์•„๋ฌด ๊ฒƒ๋„ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
+
+ํ•˜์ง€๋งŒ ์‹ค์ œ ํŒŒ์ผ์ด๋‚˜ ํŒŒ์ผ ์œ ์‚ฌ ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ๋Š” ๋ธ”๋กœํ‚น๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
+
+///
+
+์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋ธ”๋กœํ‚น๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋ ค๋ฉด ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ `async def` ๋Œ€์‹  ์ผ๋ฐ˜ `def`๋กœ ์„ ์–ธํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด FastAPI๊ฐ€ ์Šค๋ ˆ๋“œํ’€ ์›Œ์ปค์—์„œ ์‹คํ–‰ํ•˜์—ฌ ๋ฉ”์ธ ๋ฃจํ”„๊ฐ€ ๋ง‰ํžˆ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
+
+/// tip | ํŒ
+
+๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋ธ”๋กœํ‚น ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ๋ฐ˜๋Œ€๋กœ ๋ธ”๋กœํ‚น ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๋ฉด FastAPI์˜ ํ˜•์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ [Asyncer](https://asyncer.tiangolo.com)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+///
+
+### `yield from` { #yield-from }
+
+ํŒŒ์ผ ์œ ์‚ฌ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์–ด๋–ค ๊ฒƒ์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ํ•ญ๋ชฉ๋งˆ๋‹ค `yield`๋ฅผ ํ•˜๋Š” ๋Œ€์‹ , `yield from`์„ ์‚ฌ์šฉํ•ด ๊ฐ ํ•ญ๋ชฉ์„ ์ง์ ‘ ์ „๋‹ฌํ•˜๊ณ  `for` ๋ฃจํ”„๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+์ด๋Š” FastAPI์— ํŠนํ™”๋œ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ ์ˆœ์ˆ˜ํ•œ ํŒŒ์ด์ฌ ๊ธฐ๋Šฅ์ด์ง€๋งŒ, ์•Œ์•„๋‘๋ฉด ์œ ์šฉํ•œ ํŠธ๋ฆญ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜Ž
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *}
diff --git a/docs/ko/docs/advanced/strict-content-type.md b/docs/ko/docs/advanced/strict-content-type.md
new file mode 100644 (file)
index 0000000..82683e1
--- /dev/null
@@ -0,0 +1,88 @@
+# ์—„๊ฒฉํ•œ Content-Type ํ™•์ธ { #strict-content-type-checking }
+
+๊ธฐ๋ณธ์ ์œผ๋กœ **FastAPI**๋Š” JSON ์š”์ฒญ ๋ณธ๋ฌธ์— ๋Œ€ํ•ด ์—„๊ฒฉํ•œ `Content-Type` ํ—ค๋” ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” JSON ์š”์ฒญ์˜ ๋ณธ๋ฌธ์„ JSON์œผ๋กœ ํŒŒ์‹ฑํ•˜๋ ค๋ฉด ์œ ํšจํ•œ `Content-Type` ํ—ค๋”(์˜ˆ: `application/json`)๋ฅผ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
+
+## CSRF ์œ„ํ—˜ { #csrf-risk }
+
+์ด ๊ธฐ๋ณธ ๋™์ž‘์€ ๋งค์šฐ ํŠน์ •ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ **Cross-Site Request Forgery (CSRF)** ๊ณต๊ฒฉ์˜ ํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ณดํ˜ธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
+
+์ด๋Ÿฌํ•œ ๊ณต๊ฒฉ์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ CORS ์‚ฌ์ „ ์š”์ฒญ(preflight) ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์ ์„ ์•…์šฉํ•ฉ๋‹ˆ๋‹ค:
+
+- `Content-Type` ํ—ค๋”๊ฐ€ ์—†์Œ(์˜ˆ: `Blob` ๋ณธ๋ฌธ๊ณผ ํ•จ๊ป˜ `fetch()` ์‚ฌ์šฉ)
+- ๊ทธ๋ฆฌ๊ณ  ์–ด๋– ํ•œ ์ธ์ฆ ์ž๊ฒฉ ์ฆ๋ช…๋„ ๋ณด๋‚ด์ง€ ์•Š์Œ
+
+์ด ์œ ํ˜•์˜ ๊ณต๊ฒฉ์€ ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค:
+
+- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋กœ์ปฌ(์˜ˆ: `localhost`) ๋˜๋Š” ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์—์„œ ์‹คํ–‰ ์ค‘์ด๊ณ 
+- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ธ์ฆ์ด ์—†์–ด ๊ฐ™์€ ๋„คํŠธ์›Œํฌ์—์„œ ์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ์‹ ๋ขฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒฝ์šฐ
+
+## ๊ณต๊ฒฉ ์˜ˆ์‹œ { #example-attack }
+
+๋กœ์ปฌ AI ์—์ด์ „ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.
+
+์ด ์—์ด์ „ํŠธ๋Š” ๋‹ค์Œ ์œ„์น˜์— API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:
+
+```
+http://localhost:8000/v1/agents/multivac
+```
+
+๋˜ํ•œ ๋‹ค์Œ ์œ„์น˜์— ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+```
+http://localhost:8000
+```
+
+/// tip | ํŒ
+
+๋‘ ์ฃผ์†Œ ๋ชจ๋‘ ๊ฐ™์€ ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
+
+///
+
+๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ํ†ตํ•ด AI ์—์ด์ „ํŠธ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์„ ๋Œ€์‹ ํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+์ด๋Š” ๊ณต๊ฐœ ์ธํ„ฐ๋„ท์ด ์•„๋‹ˆ๋ผ ๋กœ์ปฌ์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ, ์—ฌ๋Ÿฌ๋ถ„์€ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ๋งŒ์„ ์‹ ๋ขฐํ•˜๊ณ  ๋ณ„๋„์˜ ์ธ์ฆ์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
+
+๊ทธ ํ›„ ์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ์„ค์น˜ํ•ด ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•…์„ฑ ์›น์‚ฌ์ดํŠธ๋ฅผ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+```
+https://evilhackers.example.com
+```
+
+๊ทธ ์•…์„ฑ ์›น์‚ฌ์ดํŠธ๊ฐ€ `Blob` ๋ณธ๋ฌธ์œผ๋กœ `fetch()`๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ์ปฌ API๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค:
+
+```
+http://localhost:8000/v1/agents/multivac
+```
+
+์•…์„ฑ ์›น์‚ฌ์ดํŠธ์˜ ํ˜ธ์ŠคํŠธ์™€ ๋กœ์ปฌ ์•ฑ์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„, ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ CORS ์‚ฌ์ „ ์š”์ฒญ(preflight)์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:
+
+- ์ธ์ฆ ์—†์ด ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ž๊ฒฉ ์ฆ๋ช…์„ ๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
+- ๋ธŒ๋ผ์šฐ์ €๋Š” JSON์„ ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค(`Content-Type` ํ—ค๋”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ).
+
+๊ทธ๋Ÿฌ๋ฉด ์•…์„ฑ ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋กœ์ปฌ AI ์—์ด์ „ํŠธ๋กœ ํ•˜์—ฌ๊ธˆ ์‚ฌ์šฉ์ž์˜ ์ „ ์ง์žฅ ์ƒ์‚ฌ์—๊ฒŒ ํ™”๋‚œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ฒŒ ํ•˜๊ฑฐ๋‚˜... ๋” ๋‚˜์œ ์ผ์„ ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜…
+
+## ๊ณต๊ฐœ ์ธํ„ฐ๋„ท { #open-internet }
+
+์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด ๊ณต๊ฐœ ์ธํ„ฐ๋„ท์— ์žˆ๋‹ค๋ฉด, '๋„คํŠธ์›Œํฌ๋ฅผ ์‹ ๋ขฐ'ํ•˜์—ฌ ๋ˆ„๊ตฌ๋‚˜ ์ธ์ฆ ์—†์ด ๊ถŒํ•œ ์žˆ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ๋‘์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+
+๊ณต๊ฒฉ์ž๋Š” ๋ธŒ๋ผ์šฐ์ € ์ƒํ˜ธ์ž‘์šฉ ์—†์ด๋„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด ์—ฌ๋Ÿฌ๋ถ„์˜ API๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์•„๋งˆ ์ด๋ฏธ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ์—”๋“œํฌ์ธํŠธ๋Š” ๋ณดํ˜ธํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+
+๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ด ๊ณต๊ฒฉ/์œ„ํ—˜์€ ํ•ด๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
+
+์ด ์œ„ํ—˜๊ณผ ๊ณต๊ฒฉ์€ ์ฃผ๋กœ ์•ฑ์ด **๋กœ์ปฌ ๋„คํŠธ์›Œํฌ**์—์„œ ์‹คํ–‰๋˜๊ณ  ๊ทธ๊ฒƒ์ด **์œ ์ผํ•œ ๋ณดํ˜ธ์ˆ˜๋‹จ**์ด๋ผ๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
+
+## Content-Type ์—†์ด ์š”์ฒญ ํ—ˆ์šฉํ•˜๊ธฐ { #allowing-requests-without-content-type }
+
+๋งŒ์•ฝ `Content-Type` ํ—ค๋”๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, `strict_content_type=False`๋กœ ์„ค์ •ํ•ด ์—„๊ฒฉํ•œ ๊ฒ€์‚ฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *}
+
+์ด ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ฉด `Content-Type` ํ—ค๋”๊ฐ€ ์—†๋Š” ์š”์ฒญ๋„ ๋ณธ๋ฌธ์ด JSON์œผ๋กœ ํŒŒ์‹ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ „ ๋ฒ„์ „์˜ FastAPI์™€ ๋™์ผํ•œ ๋™์ž‘์ž…๋‹ˆ๋‹ค.
+
+/// info | ์ •๋ณด
+
+์ด ๋™์ž‘๊ณผ ์„ค์ •์€ FastAPI 0.132.0์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
+
+///
diff --git a/docs/ko/docs/editor-support.md b/docs/ko/docs/editor-support.md
new file mode 100644 (file)
index 0000000..6a6069d
--- /dev/null
@@ -0,0 +1,23 @@
+# ์—๋””ํ„ฐ ์ง€์› { #editor-support }
+
+๊ณต์‹ [FastAPI ํ™•์žฅ](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode)์€ FastAPI ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ฐ•ํ™”ํ•ด ์ค๋‹ˆ๋‹ค. *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ํƒ์ƒ‰ ๋ฐ ์ด๋™, FastAPI Cloud ๋ฐฐํฌ, ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
+
+ํ™•์žฅ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [GitHub ์ €์žฅ์†Œ](https://github.com/fastapi/fastapi-vscode)์˜ README๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
+
+## ์„ค์น˜ ๋ฐ ์„ค์ • { #setup-and-installation }
+
+**FastAPI ํ™•์žฅ**์€ [VS Code](https://code.visualstudio.com/)์™€ [Cursor](https://www.cursor.com/)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์—๋””ํ„ฐ์˜ ํ™•์žฅ(Extensions) ํŒจ๋„์—์„œ "FastAPI"๋กœ ๊ฒ€์ƒ‰ํ•œ ๋’ค **FastAPI Labs**๊ฐ€ ๋ฐฐํฌํ•œ ํ™•์žฅ์„ ์„ ํƒํ•ด ๋ฐ”๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ [vscode.dev](https://vscode.dev), [github.dev](https://github.dev) ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ์—๋””ํ„ฐ์—์„œ๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
+
+### ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž๋™ ๊ฐ์ง€ { #application-discovery }
+
+๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ํ™•์žฅ์€ ์ž‘์—… ๊ณต๊ฐ„์—์„œ `FastAPI()`๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒŒ์ผ์„ ์Šค์บ”ํ•˜์—ฌ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์ƒ ์ž๋™ ๊ฐ์ง€๊ฐ€ ์–ด๋ ค์šด ๊ฒฝ์šฐ, `pyproject.toml`์˜ `[tool.fastapi]` ํ•ญ๋ชฉ์ด๋‚˜ VS Code ์„ค์ • `fastapi.entryPoint`์— ๋ชจ๋“ˆ ํ‘œ๊ธฐ(์˜ˆ: `myapp.main:app`)๋กœ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+## ๊ธฐ๋Šฅ { #features }
+
+- **๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํƒ์ƒ‰๊ธฐ** - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  <dfn title="๊ฒฝ๋กœ, ์—”๋“œํฌ์ธํŠธ">*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*</dfn>๋ฅผ ์‚ฌ์ด๋“œ๋ฐ” ํŠธ๋ฆฌ ๋ทฐ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ ๋˜๋Š” ๋ผ์šฐํ„ฐ ์ •์˜๋กœ ๋ฐ”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
+- **๊ฒฝ๋กœ ๊ฒ€์ƒ‰** - <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd> (macOS: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd>)๋กœ ๊ฒฝ๋กœ, ๋ฉ”์„œ๋“œ, ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
+- **CodeLens ํƒ์ƒ‰** - ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ถœ(์˜ˆ: `client.get('/items')`) ์œ„์˜ ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ๋งํฌ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋กœ ์ฆ‰์‹œ ์ด๋™ํ•˜์—ฌ ํ…Œ์ŠคํŠธ์™€ ๊ตฌํ˜„ ๊ฐ„์„ ๋น ๋ฅด๊ฒŒ ์˜ค๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+- **FastAPI Cloud์— ๋ฐฐํฌ** - [FastAPI Cloud](https://fastapicloud.com/)๋กœ ์›ํด๋ฆญ ๋ฐฐํฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
+- **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ ์ŠคํŠธ๋ฆฌ๋ฐ** - FastAPI Cloud์— ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๊ทธ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ฉฐ, ๋ ˆ๋ฒจ ํ•„ํ„ฐ๋ง๊ณผ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
+
+ํ™•์žฅ์˜ ๊ธฐ๋Šฅ์„ ๋จผ์ € ์ตํ˜€๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ๋ช…๋ น ํŒ”๋ ˆํŠธ(<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>, macOS: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>)๋ฅผ ์—ด๊ณ  "Welcome: Open walkthrough..."๋ฅผ ์„ ํƒํ•œ ๋’ค "Get started with FastAPI" walkthrough๋ฅผ ์„ ํƒํ•ด ๋ณด์„ธ์š”.
diff --git a/docs/ko/docs/tutorial/server-sent-events.md b/docs/ko/docs/tutorial/server-sent-events.md
new file mode 100644 (file)
index 0000000..a8ae118
--- /dev/null
@@ -0,0 +1,120 @@
+# ์„œ๋ฒ„ ์ „์†ก ์ด๋ฒคํŠธ(SSE) { #server-sent-events-sse }
+
+๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋ฉด **Server-Sent Events**(SSE)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+์ด๋Š” [JSON Lines ์ŠคํŠธ๋ฆฌ๋ฐ](stream-json-lines.md)๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource)๋ฅผ ํ†ตํ•ด ์ง€์›ํ•˜๋Š” `text/event-stream` ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
+
+/// info | ์ •๋ณด
+
+FastAPI 0.135.0์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
+
+///
+
+## Server-Sent Events๋ž€ { #what-are-server-sent-events }
+
+SSE๋Š” ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ HTTP๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค.
+
+๊ฐ ์ด๋ฒคํŠธ๋Š” `data`, `event`, `id`, `retry`์™€ ๊ฐ™์€ "ํ•„๋“œ"๋ฅผ ๊ฐ€์ง„ ์ž‘์€ ํ…์ŠคํŠธ ๋ธ”๋ก์ด๋ฉฐ, ๋นˆ ์ค„๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.
+
+๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
+
+```
+data: {"name": "Portal Gun", "price": 999.99}
+
+data: {"name": "Plumbus", "price": 32.99}
+
+```
+
+SSE๋Š” AI ์ฑ„ํŒ… ์ŠคํŠธ๋ฆฌ๋ฐ, ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, ๋กœ๊ทธ์™€ ๊ด€์ธก์„ฑ, ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ‘ธ์‹œํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ์— ํ”ํžˆ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
+
+/// tip | ํŒ
+
+๋น„๋””์˜ค๋‚˜ ์˜ค๋””์˜ค์ฒ˜๋Ÿผ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋ฉด ๊ณ ๊ธ‰ ๊ฐ€์ด๋“œ: [๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ](../advanced/stream-data.md)์„ ํ™•์ธํ•˜์„ธ์š”.
+
+///
+
+## FastAPI๋กœ SSE ์ŠคํŠธ๋ฆฌ๋ฐ { #stream-sse-with-fastapi }
+
+FastAPI์—์„œ SSE๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋ฉด, ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์—์„œ `yield`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  `response_class=EventSourceResponse`๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.
+
+`EventSourceResponse`๋Š” `fastapi.sse`์—์„œ ์ž„ํฌํŠธํ•ฉ๋‹ˆ๋‹ค:
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *}
+
+๊ฐ `yield`๋œ ํ•ญ๋ชฉ์€ JSON์œผ๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด SSE ์ด๋ฒคํŠธ์˜ `data:` ํ•„๋“œ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
+
+๋ฐ˜ํ™˜ ํƒ€์ž…์„ `AsyncIterable[Item]`์œผ๋กœ ์„ ์–ธํ•˜๋ฉด FastAPI๊ฐ€ ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ Pydantic์œผ๋กœ **๊ฒ€์ฆ**, **๋ฌธ์„œํ™”**, **์ง๋ ฌํ™”**ํ•ฉ๋‹ˆ๋‹ค.
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *}
+
+/// tip | ํŒ
+
+Pydantic์ด **Rust** ์ชฝ์—์„œ ์ง๋ ฌํ™”ํ•˜๋ฏ€๋กœ, ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์„ ์–ธํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋†’์€ **์„ฑ๋Šฅ**์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+///
+
+### ๋น„ async *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜* { #non-async-path-operation-functions }
+
+`async`๊ฐ€ ์—†๋Š” ์ผ๋ฐ˜ `def` ํ•จ์ˆ˜๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋™์ผํ•˜๊ฒŒ `yield`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+FastAPI๊ฐ€ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋ง‰์ง€ ์•Š๋„๋ก ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
+
+์ด ๊ฒฝ์šฐ ํ•จ์ˆ˜๊ฐ€ async๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ ์ ˆํ•œ ๋ฐ˜ํ™˜ ํƒ€์ž…์€ `Iterable[Item]`์ž…๋‹ˆ๋‹ค:
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *}
+
+### ๋ฐ˜ํ™˜ ํƒ€์ž… ์—†์Œ { #no-return-type }
+
+๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. FastAPI๋Š” [`jsonable_encoder`](./encoder.md)๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ  ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *}
+
+## `ServerSentEvent` { #serversentevent }
+
+`event`, `id`, `retry`, `comment` ๊ฐ™์€ SSE ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๋Œ€์‹  `ServerSentEvent` ๊ฐ์ฒด๋ฅผ `yield`ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+`ServerSentEvent`๋Š” `fastapi.sse`์—์„œ ์ž„ํฌํŠธํ•ฉ๋‹ˆ๋‹ค:
+
+{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *}
+
+`data` ํ•„๋“œ๋Š” ํ•ญ์ƒ JSON์œผ๋กœ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค. Pydantic ๋ชจ๋ธ์„ ํฌํ•จํ•ด JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ๋ชจ๋‘ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+## ์›์‹œ ๋ฐ์ดํ„ฐ { #raw-data }
+
+JSON ์ธ์ฝ”๋”ฉ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค๋ฉด, `data` ๋Œ€์‹  `raw_data`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
+
+๋ฏธ๋ฆฌ ํฌ๋งท๋œ ํ…์ŠคํŠธ, ๋กœ๊ทธ ๋ผ์ธ, ๋˜๋Š” `[DONE]`๊ณผ ๊ฐ™์€ ํŠน์ˆ˜ํ•œ <dfn title="ํŠน์ˆ˜ํ•œ ์กฐ๊ฑด์ด๋‚˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’">"์„ผํ‹ฐ๋„"</dfn> ๊ฐ’์„ ๋ณด๋‚ผ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
+
+{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *}
+
+/// note | ์ฐธ๊ณ 
+
+`data`์™€ `raw_data`๋Š” ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค. ๊ฐ `ServerSentEvent`์—๋Š” ์ด ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+///
+
+## `Last-Event-ID`๋กœ ์žฌ๊ฐœํ•˜๊ธฐ { #resuming-with-last-event-id }
+
+๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—ฐ๊ฒฐ์ด ๋Š๊ธด ํ›„ ์žฌ์—ฐ๊ฒฐํ•  ๋•Œ, ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ›์€ `id`๋ฅผ `Last-Event-ID` ํ—ค๋”์— ๋‹ด์•„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
+
+ํ—ค๋” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ด๋ฅผ ์ฝ์–ด์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ค‘๋‹จํ•œ ์ง€์ ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *}
+
+## POST๋กœ SSE ์‚ฌ์šฉํ•˜๊ธฐ { #sse-with-post }
+
+SSE๋Š” `GET`๋ฟ๋งŒ ์•„๋‹ˆ๋ผ **๋ชจ๋“  HTTP ๋ฉ”์„œ๋“œ**์™€ ํ•จ๊ป˜ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
+
+์ด๋Š” `POST`๋กœ SSE๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” [MCP](https://modelcontextprotocol.io) ๊ฐ™์€ ํ”„๋กœํ† ์ฝœ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค:
+
+{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *}
+
+## ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ { #technical-details }
+
+FastAPI๋Š” ์ผ๋ถ€ SSE ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
+
+- ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์„ ๋•Œ๋Š” 15์ดˆ๋งˆ๋‹ค **"keep alive" `ping` ์ฃผ์„**์„ ๋ณด๋‚ด ์ผ๋ถ€ ํ”„๋ก์‹œ๊ฐ€ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. [HTML ์‚ฌ์–‘: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes)์—์„œ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
+- ์ŠคํŠธ๋ฆผ์ด **์บ์‹œ๋˜์ง€ ์•Š๋„๋ก** `Cache-Control: no-cache` ํ—ค๋”๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
+- Nginx ๊ฐ™์€ ์ผ๋ถ€ ํ”„๋ก์‹œ์—์„œ **๋ฒ„ํผ๋ง์„ ๋ฐฉ์ง€**ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ˆ˜ ํ—ค๋” `X-Accel-Buffering: no`๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
+
+์—ฌ๋Ÿฌ๋ถ„์ด ๋”ฐ๋กœ ํ•  ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค“
diff --git a/docs/ko/docs/tutorial/stream-json-lines.md b/docs/ko/docs/tutorial/stream-json-lines.md
new file mode 100644 (file)
index 0000000..816338d
--- /dev/null
@@ -0,0 +1,111 @@
+# JSON Lines ์ŠคํŠธ๋ฆฌ๋ฐ { #stream-json-lines }
+
+์—ฐ์†๋œ ๋ฐ์ดํ„ฐ๋ฅผ "**์ŠคํŠธ๋ฆผ**"์œผ๋กœ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด **JSON Lines**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+/// info
+
+FastAPI 0.134.0์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
+
+///
+
+## ์ŠคํŠธ๋ฆผ์ด๋ž€ { #what-is-a-stream }
+
+๋ฐ์ดํ„ฐ๋ฅผ "**์ŠคํŠธ๋ฆฌ๋ฐ**"ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ „์ฒด ํ•ญ๋ชฉ ์‹œํ€€์Šค๊ฐ€ ๋ชจ๋‘ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ ๋ณด๋‚ด๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
+
+์ฆ‰, ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋ณด๋‚ด๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๊ทธ๊ฒƒ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ , ๊ทธ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๊ณ„์† ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+```mermaid
+sequenceDiagram
+    participant App
+    participant Client
+
+    App->>App: Produce Item 1
+    App->>Client: Send Item 1
+    App->>App: Produce Item 2
+    Client->>Client: Process Item 1
+    App->>Client: Send Item 2
+    App->>App: Produce Item 3
+    Client->>Client: Process Item 2
+    App->>Client: Send Item 3
+    Client->>Client: Process Item 3
+    Note over App: Keeps producing...
+    Note over Client: Keeps consuming...
+```
+
+๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ๋ณด๋‚ด๋Š” ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+## JSON Lines { #json-lines }
+
+์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜์˜ JSON ๊ฐ์ฒด๋ฅผ ๋ณด๋‚ด๋Š” ํ˜•์‹์ธ "**JSON Lines**"๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.
+
+์‘๋‹ต์˜ ์ฝ˜ํ…์ธ  ํƒ€์ž…์€ `application/json` ๋Œ€์‹  `application/jsonl`์ด๊ณ , ๋ณธ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
+
+```json
+{"name": "Plumbus", "description": "A multi-purpose household device."}
+{"name": "Portal Gun", "description": "A portal opening device."}
+{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."}
+```
+
+JSON ๋ฐฐ์—ด(Python์˜ list์— ํ•ด๋‹น)๊ณผ ๋งค์šฐ ๋น„์Šทํ•˜์ง€๋งŒ, ํ•ญ๋ชฉ๋“ค์„ `[]`๋กœ ๊ฐ์‹ธ๊ณ  ํ•ญ๋ชฉ ์‚ฌ์ด์— `,`๋ฅผ ๋„ฃ๋Š” ๋Œ€์‹ , ์ค„๋งˆ๋‹ค ํ•˜๋‚˜์˜ JSON ๊ฐ์ฒด๊ฐ€ ์žˆ๊ณ , ์ƒˆ ์ค„ ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.
+
+/// info
+
+ํ•ต์‹ฌ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐ ์ค„์„ ์ฐจ๋ก€๋กœ ์ƒ์„ฑํ•˜๋Š” ๋™์•ˆ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ด์ „ ์ค„์„ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
+
+///
+
+/// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
+
+๊ฐ JSON ๊ฐ์ฒด๋Š” ์ƒˆ ์ค„๋กœ ๊ตฌ๋ถ„๋˜๋ฏ€๋กœ, ๋‚ด์šฉ์— ์‹ค์ œ ์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž๋ฅผ ํฌํ•จํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ JSON ํ‘œ์ค€์˜ ์ผ๋ถ€์ธ ์ด์Šค์ผ€์ดํ”„๋œ ์ค„๋ฐ”๊ฟˆ(`\n`)์€ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+๋ณดํ†ต์€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋‹ˆ ๊ณ„์† ์ฝ์–ด ์ฃผ์„ธ์š”. ๐Ÿค“
+
+///
+
+## ์‚ฌ์šฉ ์˜ˆ { #use-cases }
+
+์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด **AI LLM** ์„œ๋น„์Šค, **๋กœ๊ทธ** ๋˜๋Š” **telemetry**์—์„œ ์˜ค๋Š” ๋ฐ์ดํ„ฐ, ํ˜น์€ **JSON** ํ•ญ๋ชฉ์œผ๋กœ ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+/// tip
+
+๋น„๋””์˜ค๋‚˜ ์˜ค๋””์˜ค์ฒ˜๋Ÿผ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋ฉด ๊ณ ๊ธ‰ ๊ฐ€์ด๋“œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”: [์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ](../advanced/stream-data.md).
+
+///
+
+## FastAPI๋กœ JSON Lines ์ŠคํŠธ๋ฆฌ๋ฐ { #stream-json-lines-with-fastapi }
+
+FastAPI์—์„œ JSON Lines๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋ฉด, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ `return`์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  `yield`๋กœ ๊ฐ ํ•ญ๋ชฉ์„ ์ฐจ๋ก€๋กœ ์ƒ์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *}
+
+๋ณด๋‚ด๋ ค๋Š” ๊ฐ JSON ํ•ญ๋ชฉ์˜ ํƒ€์ž…์ด `Item`(Pydantic ๋ชจ๋ธ)์ด๊ณ  ํ•จ์ˆ˜๊ฐ€ async๋ผ๋ฉด, ๋ฐ˜ํ™˜ ํƒ€์ž…์„ `AsyncIterable[Item]`๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *}
+
+๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์„ ์–ธํ•˜๋ฉด FastAPI๊ฐ€ ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ **๊ฒ€์ฆ**ํ•˜๊ณ , OpenAPI์— **๋ฌธ์„œํ™”**ํ•˜๊ณ , **ํ•„ํ„ฐ๋ง**ํ•˜๊ณ , Pydantic์œผ๋กœ **์ง๋ ฌํ™”**ํ•ฉ๋‹ˆ๋‹ค.
+
+/// tip
+
+Pydantic์ด **Rust** ์ธก์—์„œ ์ง๋ ฌํ™”ํ•˜๋ฏ€๋กœ, ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์„ ์–ธํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋ณด๋‹ค ํ›จ์”ฌ ๋†’์€ **์„ฑ๋Šฅ**์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
+
+///
+
+### ๋น„๋™๊ธฐ ์•„๋‹˜ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜* { #non-async-path-operation-functions }
+
+์ผ๋ฐ˜ `def` ํ•จ์ˆ˜(`async` ์—†์ด)๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋™์ผํ•˜๊ฒŒ `yield`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+FastAPI๊ฐ€ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋ง‰์ง€ ์•Š๋„๋ก ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰๋˜๊ฒŒ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
+
+์ด ๊ฒฝ์šฐ ํ•จ์ˆ˜๊ฐ€ async๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ, ์˜ฌ๋ฐ”๋ฅธ ๋ฐ˜ํ™˜ ํƒ€์ž…์€ `Iterable[Item]`์ž…๋‹ˆ๋‹ค:
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *}
+
+### ๋ฐ˜ํ™˜ ํƒ€์ž… ์ƒ๋žต { #no-return-type }
+
+๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด FastAPI๊ฐ€ [`jsonable_encoder`](./encoder.md)๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค JSON Lines๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *}
+
+## ์„œ๋ฒ„ ์ „์†ก ์ด๋ฒคํŠธ(SSE) { #server-sent-events-sse }
+
+FastAPI๋Š” Server-Sent Events(SSE)๋„ ์ผ๊ธ‰์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๋น„์Šทํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์„ธ๋ถ€์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์žฅ์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”: [Server-Sent Events (SSE)](server-sent-events.md). ๐Ÿค“