]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Add Korean translation for `docs/ko/docs/advanced/websockets.md` (#12991)
authorLKY <74170199+kwang1215@users.noreply.github.com>
Wed, 27 Nov 2024 20:03:29 +0000 (05:03 +0900)
committerGitHub <noreply@github.com>
Wed, 27 Nov 2024 20:03:29 +0000 (20:03 +0000)
docs/ko/docs/advanced/websockets.md [new file with mode: 0644]

diff --git a/docs/ko/docs/advanced/websockets.md b/docs/ko/docs/advanced/websockets.md
new file mode 100644 (file)
index 0000000..fa60a42
--- /dev/null
@@ -0,0 +1,186 @@
+# WebSockets
+
+μ—¬λŸ¬λΆ„μ€ **FastAPI**μ—μ„œ <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API" class="external-link" target="_blank">WebSockets</a>λ₯Ό μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+## `WebSockets` μ„€μΉ˜
+
+[가상 ν™˜κ²½](../virtual-environments.md){.internal-link target=_blank)λ₯Ό μƒμ„±ν•˜κ³  ν™œμ„±ν™”ν•œ λ‹€μŒ, `websockets`λ₯Ό μ„€μΉ˜ν•˜μ„Έμš”:
+
+<div class="termy">
+
+```console
+$ pip install websockets
+
+---> 100%
+```
+
+</div>
+
+## WebSockets ν΄λΌμ΄μ–ΈνŠΈ
+
+### ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ
+
+μ—¬λŸ¬λΆ„μ˜ ν”„λ‘œλ•μ…˜ μ‹œμŠ€ν…œμ—μ„œλŠ” React, Vue.js λ˜λŠ” Angular와 κ°™μ€ μ΅œμ‹  ν”„λ ˆμž„μ›Œν¬λ‘œ μƒμ„±λœ ν”„λŸ°νŠΈμ—”λ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ„ κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€.
+
+λ°±μ—”λ“œμ™€ WebSockets을 μ‚¬μš©ν•΄ ν†΅μ‹ ν•˜λ €λ©΄ μ•„λ§ˆλ„ ν”„λŸ°νŠΈμ—”λ“œμ˜ μœ ν‹Έλ¦¬ν‹°λ₯Ό μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€.
+
+λ˜λŠ” λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ WebSocket λ°±μ—”λ“œμ™€ μ§μ ‘ ν†΅μ‹ ν•˜λŠ” λ„€μ΄ν‹°λΈŒ λͺ¨λ°”일 μ‘μš© ν”„λ‘œκ·Έλž¨μ„ κ°€μ§ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
+
+ν˜Ήμ€ WebSocket μ—”λ“œν¬μΈνŠΈμ™€ ν†΅μ‹ ν•  μˆ˜ μžˆλŠ” λ‹€λ₯Έ λ°©λ²•이 μžˆμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
+
+---
+
+ν•˜μ§€λ§Œ μ΄λ²ˆ μ˜ˆμ œμ—μ„œλŠ” μΌλΆ€ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό ν¬ν•¨ν•œ κ°„λ‹¨ν•œ HTML λ¬Έμ„œλ₯Ό μ‚¬μš©ν•˜κ² μŠ΅λ‹ˆλ‹€. λͺ¨λ“  κ²ƒμ„ κΈ΄ λ¬Έμžμ—΄ μ•ˆμ— λ„£μŠ΅λ‹ˆλ‹€.
+
+λ¬Όλ‘ , μ΄λŠ” μ΅œμ μ˜ λ°©λ²•이 μ•„λ‹ˆλ©° ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” μ‚¬μš©ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.
+
+ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” μœ„μ—μ„œ μ„€λͺ…ν•œ μ˜΅μ…˜ μ€‘ ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ΄ μ’‹μŠ΅λ‹ˆλ‹€.
+
+κ·ΈλŸ¬λ‚˜ μ΄λŠ” WebSockets의 μ„œλ²„ μΈ‘에 μ§‘μ€‘ν•˜κ³  λ™μž‘ν•˜λŠ” μ˜ˆμ œλ₯Ό μ œκ³΅ν•˜λŠ” κ°€μž₯ κ°„λ‹¨ν•œ λ°©λ²•μž…λ‹ˆλ‹€:
+
+{* ../../docs_src/websockets/tutorial001.py hl[2,6:38,41:43] *}
+
+## `websocket` μƒμ„±ν•˜κΈ°
+
+**FastAPI** μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ `websocket`을 μƒμ„±ν•©λ‹ˆλ‹€:
+
+{* ../../docs_src/websockets/tutorial001.py hl[1,46:47] *}
+
+/// note | κΈ°μˆ μ  μ„ΈλΆ€μ‚¬ν•­
+
+`from starlette.websockets import WebSocket`을 μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
+
+**FastAPI**λŠ” κ°œλ°œμžλ₯Ό μœ„ν•œ νŽΈμ˜λ₯Ό μœ„ν•΄ λ™μΌν•œ `WebSocket`을 μ§μ ‘ μ œκ³΅ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΄λŠ” Starletteμ—μ„œ κ°€μ Έμ˜΅λ‹ˆλ‹€.
+
+///
+
+## λ©”μ‹œμ§€λ₯Ό λŒ€κΈ°ν•˜κ³  μ „μ†‘ν•˜κΈ°
+
+WebSocket κ²½λ‘œμ—μ„œ λ©”μ‹œμ§€λ₯Ό λŒ€κΈ°(`await`)ν•˜κ³  μ „솑할 μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+{* ../../docs_src/websockets/tutorial001.py hl[48:52] *}
+
+μ—¬λŸ¬λΆ„μ€ μ΄μ§„ λ°μ΄ν„°, ν…μŠ€νŠΈ, JSON λ°μ΄ν„°λ₯Ό λ°›μ„ μˆ˜ μžˆκ³  μ „솑할 μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+## μ‹œλ„해보기
+
+파일 μ΄λ¦„이 `main.py`라고 κ°€μ •ν•˜κ³  μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€:
+
+<div class="termy">
+
+```console
+$ fastapi dev main.py
+
+<span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+</div>
+
+λΈŒλΌμš°μ €μ—μ„œ <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000</a>을 μ—΄μ–΄λ³΄μ„Έμš”.
+
+κ°„λ‹¨ν•œ νŽ˜μ΄μ§€κ°€ λ‚˜νƒ€λ‚  κ²ƒμž…λ‹ˆλ‹€:
+
+<img src="/img/tutorial/websockets/image01.png">
+
+μž…λ ₯창에 λ©”μ‹œμ§€λ₯Ό μž…λ ₯ν•˜κ³  μ „솑할 μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+<img src="/img/tutorial/websockets/image02.png">
+
+**FastAPI** WebSocket μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ‘닡을 λŒλ €μ€„ κ²ƒμž…λ‹ˆλ‹€:
+
+<img src="/img/tutorial/websockets/image03.png">
+
+μ—¬λŸ¬ λ©”μ‹œμ§€λ₯Ό μ „솑(그리고 μˆ˜μ‹ )ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+<img src="/img/tutorial/websockets/image04.png">
+
+λͺ¨λ“  λ©”μ‹œμ§€λŠ” λ™μΌν•œ WebSocket μ—°κ²°μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
+
+## `Depends` λ° κΈ°νƒ€ μ‚¬μš©ν•˜κΈ°
+
+WebSocket μ—”λ“œν¬μΈνŠΈμ—μ„œ `fastapi`μ—μ„œ λ‹€μŒμ„ κ°€μ Έμ™€ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+* `Depends`
+* `Security`
+* `Cookie`
+* `Header`
+* `Path`
+* `Query`
+
+이듀은 λ‹€λ₯Έ FastAPI μ—”λ“œν¬μΈνŠΈ/*경둜 μž‘동*κ³Ό λ™μΌν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€:
+
+{* ../../docs_src/websockets/tutorial002_an_py310.py hl[68:69,82] *}
+
+/// info | μ •보
+
+WebSocketμ—μ„œλŠ” `HTTPException`을 λ°œμƒμ‹œν‚€λŠ” κ²ƒμ΄ μ ν•©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  `WebSocketException`을 λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.
+
+λͺ…μ„Έμ„œμ— μ •μ˜λœ <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1" class="external-link" target="_blank">μœ νš¨ν•œ μ½”λ“œ</a>λ₯Ό μ‚¬μš©ν•˜μ—¬ μ’…λ£Œ μ½”λ“œλ₯Ό μ„€μ •ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+///
+
+### μ’…속성을 κ°€μ§„ WebSockets ν…ŒμŠ€νŠΈ
+
+파일 μ΄λ¦„이 `main.py`라고 κ°€μ •ν•˜κ³  μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€:
+
+<div class="termy">
+
+```console
+$ fastapi dev main.py
+
+<span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+</div>
+
+λΈŒλΌμš°μ €μ—μ„œ <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000</a>을 μ—΄μ–΄λ³΄μ„Έμš”.
+
+λ‹€μŒκ³Ό κ°™μ€ κ°’을 μ„€μ •ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+* κ²½λ‘œμ— μ‚¬μš©λœ "Item ID".
+* μΏΌλ¦¬ λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©λœ "Token".
+
+/// tip | νŒ
+
+쿼리 `token`은 μ’…속성에 μ˜ν•΄ μ²˜λ¦¬λ©λ‹ˆλ‹€.
+
+///
+
+이제 WebSocket에 μ—°κ²°ν•˜κ³  λ©”μ‹œμ§€λ₯Ό μ „솑 λ° μˆ˜μ‹ ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+<img src="/img/tutorial/websockets/image05.png">
+
+## μ—°κ²° ν•΄μ œ λ° λ‹€μ€‘ ν΄λΌμ΄μ–ΈνŠΈ μ²˜λ¦¬
+
+WebSocket μ—°κ²°μ΄ λ‹«νžˆλ©΄, `await websocket.receive_text()`κ°€ `WebSocketDisconnect` μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. μ΄λ₯Ό μž‘μ•„ μ²˜λ¦¬ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+{* ../../docs_src/websockets/tutorial003_py39.py hl[79:81] *}
+
+ν…ŒμŠ€νŠΈν•΄λ³΄κΈ°:
+
+* μ—¬λŸ¬ λΈŒλΌμš°μ € νƒ­μ—μ„œ μ•±μ„ μ—½λ‹ˆλ‹€.
+* κ° νƒ­μ—μ„œ λ©”μ‹œμ§€λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
+* ν•œ νƒ­μ„ λ‹«μ•„λ³΄μ„Έμš”.
+
+`WebSocketDisconnect` μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©°, λ‹€λ₯Έ λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹€μŒκ³Ό κ°™μ€ λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•©λ‹ˆλ‹€:
+
+```
+Client #1596980209979 left the chat
+```
+
+/// tip | νŒ
+
+μœ„ μ‘μš© ν”„λ‘œκ·Έλž¨μ€ μ—¬λŸ¬ WebSocket μ—°κ²°μ— λ©”μ‹œμ§€λ₯Ό λΈŒλ‘œλ“œμΊμŠ€νŠΈν•˜λŠ” λ°©λ²•을 λ³΄μ—¬μ£ΌλŠ” κ°„λ‹¨ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€.
+
+κ·ΈλŸ¬λ‚˜ λͺ¨λ“  κ²ƒμ„ λ©”λͺ¨λ¦¬μ˜ λ‹¨μΌ λ¦¬μŠ€νŠΈλ‘œ μ²˜λ¦¬ν•˜λ―€λ‘œ, ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰ μ€‘인 λ™μ•ˆλ§Œ λ™μž‘ν•˜λ©° λ‹¨μΌ ν”„λ‘œμ„ΈμŠ€μ—μ„œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€.
+
+FastAPI와 μ‰½κ²Œ ν†΅ν•©ν•  μˆ˜ μžˆμœΌλ©΄μ„œ λ” κ²¬κ³ ν•˜κ³  Redis, PostgreSQL λ“±μ„ μ§€μ›ν•˜λŠ” λ„ꡬλ₯Ό μ°Ύκ³  μžˆλ‹€λ©΄, <a href="https://github.com/encode/broadcaster" class="external-link" target="_blank">encode/broadcaster</a>λ₯Ό ν™•μΈν•˜μ„Έμš”.
+
+///
+
+## μΆ”κ°€ μ •보
+
+λ‹€μŒ μ˜΅μ…˜μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ„ λ³΄λ €λ©΄ Starlette의 λ¬Έμ„œλ₯Ό ν™•μΈν•˜μ„Έμš”:
+
+* <a href="https://www.starlette.io/websockets/" class="external-link" target="_blank">`WebSocket` ν΄λž˜μŠ€</a>.
+* <a href="https://www.starlette.io/endpoints/#websocketendpoint" class="external-link" target="_blank">클래슀 κΈ°λ°˜ WebSocket μ²˜λ¦¬</a>.