committed by
GitHub
1 changed files with 186 additions and 0 deletions
@ -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>. |
Loadingโฆ
Reference in new issue