<aside>

</aside>

์•ˆ๋…•ํ•˜์„ธ์š”! 7๋ถ€ '๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”'์˜ ๋„ค ๋ฒˆ์งธ ์‹œ๊ฐ„, 35๊ฐ•์ž…๋‹ˆ๋‹ค! ๐Ÿ’ฌ

์ง€๋‚œ 34๊ฐ•์—์„œ๋Š” BackgroundTasks๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ํ›„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ถ”๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์ฃ .

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” API ํ†ต์‹  ๋ฐฉ์‹ ์ž์ฒด์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋ด…๋‹ˆ๋‹ค! ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜ HTTP ์š”์ฒญ-์‘๋‹ต ๋ชจ๋ธ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ์ ์ธ ๊ตฌ์กฐ์˜€์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ฒ˜๋Ÿผ ์„œ๋ฒ„๊ฐ€ ๋จผ์ € ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ฃผ๊ณ ๋ฐ›์•„์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ๐Ÿค”

์ด๋Ÿฐ ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ธฐ์ˆ ์ด ๋ฐ”๋กœ WebSocket์ž…๋‹ˆ๋‹ค! ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” WebSocket ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ , FastAPI์—์„œ @app.websocket ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WebSocket ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์™€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ๊ธฐ๋Šฅ ๊ตฌํ˜„์˜ ์ฒซ๊ฑธ์Œ์„ ํ•จ๊ป˜ ๋‚ด๋”›์–ด ๋ด…์‹œ๋‹ค! โ†”๏ธโœจ


๐Ÿ“š ์ฑ•ํ„ฐ ์†Œ๊ฐœ

๊ธฐ์กด HTTP ์š”์ฒญ-์‘๋‹ต ๋ชจ๋ธ์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„ ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ(Full-duplex) ํ†ต์‹ ์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” WebSocket ํ”„๋กœํ† ์ฝœ์˜ FastAPI ํ™œ์šฉ๋ฒ• ํ•™์Šต.

๋จผ์ €, ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ HTTP ์š”์ฒญ-์‘๋‹ต ๋ฐฉ์‹(ํด๋ง ๋“ฑ)์˜ ๋น„ํšจ์œจ์„ฑ ํŒŒ์•…. WebSocket์˜ **์ง€์†์ ์ธ ์—ฐ๊ฒฐ(Persistent Connection)**์„ ํ†ตํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ ์›๋ฆฌ ์ดํ•ด.

๋‹ค์Œ์œผ๋กœ, FastAPI @app.websocket() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•œ WebSocket ์—”๋“œํฌ์ธํŠธ ์ •์˜ ๋ฐฉ๋ฒ• ํ•™์Šต. WebSocket ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ ์—ฐ๊ฒฐ ์ˆ˜๋ฝ(accept) ๋ฐ ํ…์ŠคํŠธ/JSON ๋ฐ์ดํ„ฐ ๋น„๋™๊ธฐ ์†ก์ˆ˜์‹  ์‹ค์Šต.

๋˜ํ•œ, WebSocketDisconnect ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ์ •์ƒ์ ์ธ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ๊ด€๋ฆฌ๋ฒ• ํ•™์Šต. ๊ฐ„๋‹จํ•œ ์—์ฝ”(Echo) ์„œ๋ฒ„ ์˜ˆ์ œ๋กœ ๊ธฐ๋ณธ ํ†ต์‹  ํ๋ฆ„ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ค์ค‘ ํด๋ผ์ด์–ธํŠธ ๊ด€๋ฆฌ ๋ฐ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ(Broadcast) ๊ฐœ๋… ๊ฐ„๋žต ์†Œ๊ฐœ.


๐ŸŽฏ ์ฑ•ํ„ฐ ๋ชฉํ‘œ

์ด ๊ฐ•์˜๋ฅผ ๋งˆ์น˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์€ ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:

  1. ์‹ค์‹œ๊ฐ„ ์›น ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‹œ HTTP ์š”์ฒญ-์‘๋‹ต ๋ฐฉ์‹์˜ ํ•œ๊ณ„ ์ดํ•ด.
  2. WebSocket ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋ณธ ํŠน์ง•(์ง€์†์  ์—ฐ๊ฒฐ, ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ) ์„ค๋ช….
  3. FastAPI์—์„œ @app.websocket() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ WebSocket ์—”๋“œํฌ์ธํŠธ ์ •์˜.
  4. WebSocket ๊ฐ์ฒด์˜ accept() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ˆ˜๋ฝ.
  5. WebSocket ๊ฐ์ฒด์˜ send_text(), receive_text(), send_json(), receive_json() ๋“ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ .
  6. WebSocketDisconnect ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ๊ด€๋ฆฌ.