์›น ์†Œ์ผ“๊ณผ Socket.io

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ Socket.io๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ๋‹ค. ์ƒ์†Œํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜€๊ณ , ์›น ์†Œ์ผ“์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‹ค.

๊ทธ๋™์•ˆ(์ง€๊ธˆ๋„) ์–ด๋ ค์›€์„ ์ฃผ์—ˆ๋˜ ์›น ์†Œ์ผ“๊ณผ Socket.io์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์ž.

 

 


 

์›น ์†Œ์ผ“์ด๋ž€?

 

์›น ์†Œ์ผ“์€ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ์‚ฌ์ด์˜ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ํ†ต์‹  ์„ธ์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์›น ์†Œ์ผ“ API๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ์œ„ํ•ด ์„œ๋ฒ„๋ฅผ ํด๋ง(polling) ์—†์ด๋„ ์ด๋ฒคํŠธ ์ค‘์‹ฌ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. — MDN ๋ฌธ์„œ

 

์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

 

 

REST API์™€์˜ ์ฐจ์ด์ 

REST API๋Š” ์š”์ฒญ → ์‘๋‹ต ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ตฌ์กฐ๋กœ, ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์ด๋‹ค.

์ด ๊ตฌ์กฐ๋Š” ํด๋ง(polling)์ด๋‚˜ ์ง€์—ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

Polling
Polling์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹

 

์ฑ„ํŒ… ๊ธฐ๋Šฅ ์˜ˆ์‹œ

์ฑ„ํŒ…๊ธฐ๋Šฅ์„ REST API๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

์ƒ๋Œ€์˜ ๋‹ต์žฅ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค. ์ด ๋ฐฉ์‹์€ ์š”์ฒญ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ์„œ๋ฒ„์— ๋ถ€๋‹ด์„ ์ฃผ๊ณ , ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

์›น ์†Œ์ผ“

์›น ์†Œ์ผ“์€ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์ง€์›ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋กœ ์—ฐ๊ฒฐ์ด ํ•œ๋ฒˆ ์„ค์ •๋˜๋ฉด, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ์ง€์†์ ์ธ ์—ฐ๊ฒฐ : ํ•œ ๋ฒˆ ์—ฐ๊ฒฐ๋˜๋ฉด ๋Š์–ด์ง€์ง€ ์•Š๊ณ  ์œ ์ง€๋œ๋‹ค.
  • ์–‘๋ฐฉํ–ฅ ํ†ต์‹  : ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‚ฎ์€ ์˜ค๋ฒ„ํ—ค๋“œ : HTTP ์š”์ฒญ/์‘๋‹ต์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์•„ ๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ๋‹ค.

 

 

Socket.io

Socket.io๋Š” ์›น ์†Œ์ผ“์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

๋‹จ์ˆœํžˆ ์›น ์†Œ์ผ“์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Socket.io๋Š” ์›น ์†Œ์ผ“ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

Socket.io๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์›น ์†Œ์ผ“์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • ์ž๋™ ์žฌ์—ฐ๊ฒฐ : ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ์ž๋™์œผ๋กœ ์žฌ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•œ๋‹ค.
  • ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… : ํ•˜๋‚˜์˜ ๋ฉ”์„ธ์ง€๋ฅผ ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ์— ๋™์‹œ์— ์ „์†กํ•œ๋‹ค
  • ํด๋ฐฑ ์ง€์› : ์›น ์†Œ์ผ“์ด ์ง€์›๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, HTTP Long Polling์œผ๋กœ ์ „ํ™˜ํ•œ๋‹ค.

HTTP Long Polling
๋กฑ ํด๋ง์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์„œ๋ฒ„๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์‘๋‹ต์„ ์ง€์—ฐ์‹œํ‚จ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์‘๋‹ต์„ ๋ณด๋‚ด๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ”๋กœ ๋‹ค์Œ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
๋กฑ ํด๋ง์€ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์‚ฌ์šฉ ์‚ฌ๋ก€

  • WebSocket : ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ๊ฒŒ์ž„, ์ฃผ์‹ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ
  • HTTP Polling : ๊ฐ„๋‹จํ•œ ์ƒํƒœ ์ฒดํฌ
  • Long Polling : ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๊ธธ๊ณ  ๊ฐ„ํ—์ ์ธ ์—…๋ฐ์ดํŠธ

 

 


Socket.io ํ™œ์šฉ

Socket.io๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

์„œ๋ฒ„๋‚˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ํŠน์ • ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ(emit) ์‹œํ‚ค๊ณ , ์ด๋ฅผ ์ˆ˜์‹ (on)ํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฑ„ํŒ… ๊ธฐ๋Šฅ ์˜ˆ์‹œ

 

1.socket ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ

import { io } from "socket.io-client"; 
const socket = io("URL");

 

2.์ด๋ฒคํŠธ๋ฅผ ์ •์˜, ๋ฐœ์ƒ(emit)

socket.emit("์ฑ„ํŒ…","์•ˆ๋…•ํ•˜์„ธ์š”!") // "์ฑ„ํŒ…"์ด๋ผ๋Š” ์ด๋ฒคํŠธ ์ •์˜, emit์œผ๋กœ ์ด๋ฒคํŠธ ๋ฐœ์ƒ

 

3.์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ ์ˆ˜์‹ (on)

socket.on("์ฑ„ํŒ…", (data) => { 
	console.log('์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ๋œ ๋ฉ”์‹œ์ง€:', data); 
});

 

4.์—ฐ๊ฒฐ ํ•ด์ œ(off)

socket.off('์ฑ„ํŒ…');

 

 

 


๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ Socket.io๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์— ๋Œ€ํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ๋งŽ์ง€๋งŒ, ์•ž์œผ๋กœ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

์ฐธ๊ณ  ์ž๋ฃŒ

https://velog.io/@eunddodi/์ฑ„ํŒ…-๊ฐœ๋ฐœ์„-์œ„ํ•œ-Socket.IO-์ดํ•ดํ•˜๊ธฐ

https://socket.io/docs/v4/#what-socketio-is

https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API

https://blog.stackademic.com/20-concepts-about-socket-io-every-developer-should-master-902ffcb19e63