--- /dev/null
+# 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>.