[ ๋ฌด๋ฌผ ] ๊ทผ์ฒ˜ ์‚ฌ์šฉ์ž ์ฐพ๊ธฐ #1 : ์œ„๋„ / ๊ฒฝ๋„ GPS ๊ธฐ๋ฐ˜ WebSocket ์„ธํŒ…ํ•˜๊ธฐ

2025. 10. 21. 00:51ยท๐Ÿงก Projects/๐Ÿงก Projects: Web
728x90
์‚ฌ์šฉ์ž A์™€ B๊ฐ€ ์„œ๋กœ 100m ์ด๋‚ด์— ์žˆ์œผ๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์ง€๋˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด WebSocket์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ฒซ๋ฒˆ์งธ๋กœ ์›น์†Œ์ผ“์„ ์„ธํŒ…ํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ์ดˆ๊ธฐ์„ธํŒ… ๊ณผ์ •์ž…๋‹ˆ๋‹ค. 

๋ชจํ‹ฐ๋ธŒ์ธ ํ† ์Šค ์ฃผ๋ณ€ ์นœ๊ตฌ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

 

๐Ÿงญ ์ „์ฒด ๋ชฉํ‘œ ๊ธฐ๋Šฅ

‘๋ฌด๋ฌผ’ ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‚ด ์ฃผ๋ณ€ 100m ์ด๋‚ด์˜ ์‚ฌ์šฉ์ž ํƒ์ƒ‰
  • ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‚ฌ์šฉ์ž ์œ„์น˜ ๊ฐฑ์‹  ๋ฐ ์‹œ๊ฐํ™”
  • ์‚ฌ์šฉ์ž ํด๋ฆญ ์‹œ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์ „์†ก
  • ๋ฉ€ํ‹ฐ ๋””๋ฐ”์ด์Šค ๊ฐ„ ํ†ต์‹  ๊ฐ€๋Šฅ (์˜ˆ: ํ•ธ๋“œํฐ ↔ ๋…ธํŠธ๋ถ)

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก ์™œ WebSocket์ธ๊ฐ€?

  • HTTP๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•ด์•ผ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋Š” ๊ตฌ์กฐ๋ผ, ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ์–ด๋ ต๊ณ 
  • WebSocket์€ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ํ†ตํ•ด ์„œ๋ฒ„ → ํด๋ผ์ด์–ธํŠธ๋กœ๋„ ๋ฉ”์‹œ์ง€๋ฅผ ์ฆ‰์‹œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ์ž์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์— ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. 

๊ฒฐ๋ก ์ ์œผ๋กœ WebSocket์€ ์‹ค์‹œ๊ฐ„ ์œ„์น˜ ๊ธฐ๋ฐ˜ ํ†ต์‹ ์— ์ตœ์ ํ™”๋œ ๊ธฐ์ˆ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 


์ฒ˜์Œ ์‹œ๋„๋Š” ๋ธ”๋ฃจํˆฌ์Šค, ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ์€ ์œ„๋„/๊ฒฝ๋„๋กœ ์ „ํ™˜ํ•œ ๊ณผ์ •

์ดˆ๊ธฐ ๊ธฐํš ๋‹จ๊ณ„์—์„œ๋Š” "๊ทผ๊ฑฐ๋ฆฌ ํ†ต์‹ "์ด๋ผ๋Š” ๋‹จ์–ด ๊ทธ๋Œ€๋กœ, ๊ธฐ๊ธฐ ๊ฐ„์˜ ๋ฌผ๋ฆฌ์  ๊ทผ์ ‘์„ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ Bluetooth Low Energy (BLE) ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ตฌํ˜„๊ณผ ์กฐ์‚ฌ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ํ˜„์‹ค์ ์ธ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด GPS ๊ธฐ๋ฐ˜ ์œ„๋„/๊ฒฝ๋„ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

  • โŒ ๋ธ”๋ฃจํˆฌ์Šค๋Š” ๋ธŒ๋ผ์šฐ์ € ์ง€์› ์ œ์•ฝ์ด ํผ (ํŠนํžˆ ๋ชจ๋ฐ”์ผ์—์„œ)
  • โŒ ์›น ๊ธฐ๋ฐ˜ ์•ฑ์—์„œ ๊ถŒํ•œ ์ฒ˜๋ฆฌ์™€ ์Šค์บ” API ์ œ์•ฝ์ด ํผ
  • โœ… ์œ„์น˜ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์€ ๋ชจ๋ฐ”์ผ ์›น, ์›น ์•ฑ, PWA์—์„œ ๋ชจ๋‘ ์•ˆ์ •์ ์œผ๋กœ ์ง€์›
  • โœ… GPS ์ •๋ณด๋Š” ์‚ฌ์šฉ์ž๊ฐ„ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์ด ๋ช…ํ™•ํ•จ

 

โŒ ๋ธ”๋ฃจํˆฌ์Šค๋ฅผ ํฌ๊ธฐํ•œ ์ด์œ  1: ๋ธŒ๋ผ์šฐ์ € ์ง€์›์˜ ํ•œ๊ณ„

Chrome (Desktop) โœ… ์ง€์› ์‹คํ—˜์  ๊ธฐ๋Šฅ์œผ๋กœ ํ™œ์„ฑํ™” ํ•„์š”
Chrome (Android) โœ… ์ œํ•œ์  ์ง€์› ๊ธฐ๊ธฐ/OS์— ๋”ฐ๋ผ ์ฐจ์ด ์žˆ์Œ
Safari (iOS) โŒ ๋ฏธ์ง€์› Web Bluetooth ๋ฏธ์ง€์› (2025๋…„ ํ˜„์žฌ ๊ธฐ์ค€)
Firefox โŒ ๋ฏธ์ง€์› ๋ณด์•ˆ ๋ฌธ์ œ๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐจ๋‹จ
Samsung Internet โŒ ๋ฏธ์ง€์› Web Bluetooth ์ง€์›ํ•˜์ง€ ์•Š์Œ

 

์šฐ์„  ๋ธ”๋ฃจํˆฌ์Šค๋Š” ์น˜๋ช…์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ๋ณ„ ์ œ์•ฝ์ด ์ปธ์Šต๋‹ˆ๋‹ค.

iOS Safari์—์„œ๋Š” ์•„์˜ˆ ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์•ˆ๋“œ๋กœ์ด๋“œ๋ผ๊ณ  ํ•ด๋„ WebView, PWA ๋“ฑ์—์„œ BLE ์ ‘๊ทผ์ด ๋ถˆ์•ˆ์ •ํ•˜๊ฑฐ๋‚˜ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

์ €ํฌ๋Š” ์›น ๊ฐœ๋ฐœ์ด์ง€๋งŒ ๋ชจ๋ฐ”์ผ ํ™”๋ฉด๋งŒ ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ (์‹œ๊ฐ„ ์ œ์•ฝ ์ƒ ๋ฐ˜์‘ํ˜•์€ ์ƒ๋žต) ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ์ œ์•ฝ์ด ํฐ ๋ธ”๋ฃจํˆฌ์Šค๋Š” ๊ณค๋ž€ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

โŒ ๋ธ”๋ฃจํˆฌ์Šค๋ฅผ ํฌ๊ธฐํ•œ ์ด์œ  2: ๊ถŒํ•œ ๋ฐ ๊ธฐ๊ธฐ ํƒ์ƒ‰ ๋ณต์žก์„ฑ

 

๋˜ ๋ธ”๋ฃจํˆฌ์Šค๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์œ„์น˜๋ฅผ ์ธ์‹ํ•  ๋•Œ ํ•ด๋‹น ๊ธฐ๊ธฐ๋ฅผ ์ธ์‹ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ณต์žกํ•˜๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

๋ธ”๋ฃจํˆฌ์Šค๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๊ณ ๋ คํ–ˆ์„ ๋‹น์‹œ, ์•„๋ž˜์˜ ํ”Œ๋กœ์šฐ๋ฅผ ๋”ฐ๋ผ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

    1. ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๊ธฐ ๊ฒ€์ƒ‰ ๊ถŒํ•œ์„ ์ˆ˜๋™์œผ๋กœ ํ—ˆ์šฉ
    2. ์Šค์บ” ๊ฐ€๋Šฅํ•œ BLE ๊ธฐ๊ธฐ๊ฐ€ ํŠน์ • ์„œ๋น„์Šค UUID๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•จ
    3. ํ•ด๋‹น ๊ธฐ๊ธฐ๋ฅผ ์Šค์บ”ํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜, ์ •๋ณด๋ฅผ ์ฝ์–ด์•ผ ํ•จ
  • ๊ทธ๋Ÿฌ๋‚˜ ์ €ํฌ์˜ ๋ชฉํ‘œ๋Š” '๋ˆ„๊ตฐ๊ฐ€ ๊ทผ์ฒ˜์— ์žˆ๋‹ค'๋Š” ๊ฒƒ์„ ์ฆ‰์‹œ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์œ„ ๊ณผ์ •์€ ๋„ˆ๋ฌด ๋ฒˆ๊ฑฐ๋กญ๊ณ ,
    • ๊ธฐ๊ธฐ๋งˆ๋‹ค BLE ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๊ณ 
    • ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ๋‘˜ ๊ฒฝ์šฐ BLE ์ธ์‹์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Œ
    • ๊ธฐ๊ธฐ ๊ฐ„ ํŽ˜์–ด๋ง์ด๋‚˜ BLE Advertising ์„ธํŒ…๋„ ํ•„์š”ํ•ด ์‚ฌ์šฉ์ž UX ์ €ํ•˜ ์š”์ธ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค

 

 

๋ฐ˜๋ฉด์— ์œ„๋„/๊ฒฝ๋„๋Š” ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ข‹๊ณ , ์‹ค์‹œ๊ฐ„ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์ด ์•ˆ์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„๋„/๊ฒฝ๋„ GPS ๊ธฐ๋ฐ˜ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๋ฐฉ์‹์„ ์ตœ์ข…์ ์œผ๋กœ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ โœ… ๋ชจ๋“  ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์› (PWA ํฌํ•จ)
๊ถŒํ•œ ์ฒ˜๋ฆฌ โœ… ์‚ฌ์šฉ์ž ์œ„์น˜ ๊ถŒํ•œ๋งŒ ์š”์ฒญํ•˜๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
๊ฑฐ๋ฆฌ ์ธก์ • โœ… ์œ„๋„/๊ฒฝ๋„๋ฅผ ํ†ตํ•ด ๋ช…ํ™•ํ•œ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๊ฐ€๋Šฅ
์‹ค์‹œ๊ฐ„์„ฑ โœ… WebSocket๊ณผ ๊ฒฐํ•ฉํ•ด ์‹ค์‹œ๊ฐ„ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ˜ ๋งค์นญ ๊ฐ€๋Šฅ

 

 

๐Ÿ”ง WebSocket ์–ด๋–ค ๊ธฐ์ˆ  ์Šคํƒ์œผ๋กœ ๊ฐœ๋ฐœํ• ๊นŒ?

ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์ด๋ฏธ NextJS (typescript ๊ธฐ๋ฐ˜) ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์—ˆ๊ณ , ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋ชจ๋‘ JS/TS ์ƒํƒœ๊ณ„๋ฅผ ๊ณต์œ ํ•˜๋ฉด ํ†ตํ•ฉ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์› ๊ธฐ ๋•Œ๋ฌธ์—, WebSocket ์„œ๋ฒ„ ๊ฐœ๋ฐœ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Node.js + Express: ๋น ๋ฅธ ๊ฐœ๋ฐœ๊ณผ ๋†’์€ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ
  • ws ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: Node.js์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๋Š” WebSocket ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ด์™ธ์—๋„ ๋ฐฐํฌ๋Š” Render๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

WebSocket ์„œ๋ฒ„๊ฐ€ ์ง€์†์ ์œผ๋กœ ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ , ๋ฌด๋ฃŒ ์š”๊ธˆ์ œ์—์„œ๋„ NodeJS ์„œ๋ฒ„ ๋ฐฐํฌ๊ฐ€ ๊ฐ„ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์— Render ๋ฐฐํฌ๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

 


 

๐Ÿ›  ์ดˆ๊ธฐ WebSocket ์„œ๋ฒ„ ์„ธํŒ…

์ฒ˜์Œ์—๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋กœ WebSocket ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์—†์ด, ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋ผ๋ฆฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

 

๋ชฉํ‘œ ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

  • ๋ธŒ๋ผ์šฐ์ € ํƒญ A์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ„ → ํƒญ B, C์—์„œ๋„ ์ฆ‰์‹œ console.log๋กœ ์ถœ๋ ฅ๋จ

 

1๏ธโƒฃ ์ดˆ๊ธฐ ์„œ๋ฒ„ ์ฝ”๋“œ ๊ตฌ์„ฑ

const express = require("express");
const http = require("http");
const WebSocket = require("ws");
const cors = require("cors");

const app = express();
app.use(cors()); // CORS ํ—ˆ์šฉ

const server = http.createServer(app); // HTTP ์„œ๋ฒ„ ๋ž˜ํ•‘
const wss = new WebSocket.Server({ server }); // WebSocket ์„œ๋ฒ„ ์ƒ์„ฑ

const clients = new Set(); // ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ ๋ชฉ๋ก ์ €์žฅ

 

 

  • clients๋Š” ํ˜„์žฌ ์—ฐ๊ฒฐ๋œ WebSocket ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” Set์ž…๋‹ˆ๋‹ค.
  • CORS ์„ค์ •์€ ํ”„๋ก ํŠธ์—”๋“œ (Next.js)์—์„œ ์ด ์„œ๋ฒ„์— ์ž์œ ๋กญ๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

 

2๏ธโƒฃ WebSocket ์—ฐ๊ฒฐ ๋ฐ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ

wss.on("connection", (ws) => {
  console.log("๐Ÿ”— New client connected");
  clients.add(ws);

  ws.on("message", (message) => {
    console.log("๐Ÿ“ฉ Received:", message.toString());

    // ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ
    for (const client of clients) {
      if (client.readyState === WebSocket.OPEN) {
        client.send(message.toString());
      }
    }
  });

  ws.on("close", () => {
    console.log("โŒ Client disconnected");
    clients.delete(ws);
  });
});

 

 

  • wss๋Š” new WebSocket.Server({ server })๋กœ ์ƒ์„ฑ๋œ WebSocket ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.
  • wss.on("connection", (ws) => {...}): ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋  ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ws๋Š” ์—ฐ๊ฒฐ๋œ ๊ฐœ๋ณ„ ํด๋ผ์ด์–ธํŠธ WebSocket ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•˜๋ฉด .on("connection") ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฐ๊ฒฐ๋œ ws ์ธ์Šคํ„ด์Šค๋ฅผ clients Set์— ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
ws.on("message", (message) => {
  console.log("๐Ÿ“ฉ Received:", message.toString());
  ...
});
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด, ๋‹ค๋ฅธ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

 

  • ํ˜„์žฌ ์ ‘์† ์ค‘์ธ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ readyState๊ฐ€ OPEN์ธ ๊ฒฝ์šฐ์—๋งŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, ํด๋ผ์ด์–ธํŠธ A๊ฐ€ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€๋ฅผ ์„œ๋ฒ„๊ฐ€ ๋ฐ›์•„์„œ B, C, D ๋“ฑ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋™์ผํ•˜๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
for (const client of clients) {
  if (client.readyState === WebSocket.OPEN) {
    client.send(message.toString());
  }
}

 

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ ํ•ด์ œ๋˜๋ฉด Set์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
ws.on("close", () => {
  console.log("โŒ Client disconnected");
  clients.delete(ws);
});

 

3๏ธโƒฃ ์„œ๋ฒ„ ์‹คํ–‰

const PORT = process.env.PORT || 8080;
server.listen(PORT, () => {
  console.log(`๐Ÿš€ WebSocket server running on http://localhost:${PORT}`);
});

 

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋ฉด .on("close")๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„์—์„œ๋Š” ํ•ด๋‹น WebSocket ๊ฐ์ฒด๋ฅผ clients Set์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ๋‚˜ ์ „์†ก ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ฆฐ์—… ์ž‘์—…์ž…๋‹ˆ๋‹ค.

 

์ „์ฒด์ฝ”๋“œ

const express = require("express");Add commentMore actions
const http = require("http");
const WebSocket = require("ws");
const cors = require("cors");

const app = express();
app.use(cors());

const server = http.createServer(app);
const wss = new WebSocket.Server({ server });

const clients = new Set();

wss.on("connection", (ws) => {
  console.log("๐Ÿ”— New client connected");
  clients.add(ws);

  ws.on("message", (message) => {
    console.log("๐Ÿ“ฉ Received:", message.toString());

    // ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ
    for (const client of clients) {
      if (client.readyState === WebSocket.OPEN) {
        client.send(message.toString());
      }
    }
  });

  ws.on("close", () => {
    console.log("โŒ Client disconnected");
    clients.delete(ws);
  });
});

const PORT = process.env.PORT || 8080;
server.listen(PORT, () => {
  console.log(๐Ÿš€ WebSocket server running on http://localhost:${PORT});
});

 

๊ธฐ์ดˆ ์›น ์†Œ์ผ“ ์„œ๋ฒ„๋ฅผ ์„ธํŒ…ํ•œ ๋‹ค์Œ, ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ํ•ด๋‹น ์œ ์ €์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„์œผ๋กœ ์•„๋ฐ”ํƒ€๋ฅผ ๋„์šฐ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

 

๋ฌด๋ฌผ ์„œ๋ฒ„ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

GitHub - Ureka-Middle-Team1/nearby-wss-server: ๊ทผ๊ฑฐ๋ฆฌ ์œ„์น˜ ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ์„œ๋ฒ„ ๋ ˆํฌ

๊ทผ๊ฑฐ๋ฆฌ ์œ„์น˜ ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ์„œ๋ฒ„ ๋ ˆํฌ. Contribute to Ureka-Middle-Team1/nearby-wss-server development by creating an account on GitHub.

github.com

 

 

728x90
'๐Ÿงก Projects/๐Ÿงก Projects: Web' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [ React ] ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ตฌํ˜„ ์ค‘ ์ˆ˜๋Ÿ‰์— ๋”ฐ๋ฅธ ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ ์˜ค๋ฅ˜ ์ด์Šˆ ํ•ด๊ฒฐ
  • [ ๋ฌด๋ฌผ ] ๊ทผ์ฒ˜ ์‚ฌ์šฉ์ž ์ฐพ๊ธฐ #2 : ์‹ค์‹œ๊ฐ„ ์‚ฌ์šฉ์ž ๊ฐ์ง€ ๋ฐ ์‚ฌ์šฉ์ž ์•„๋ฐ”ํƒ€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
  • [ ๋ฌด๋ฌผ ] ๊ทผ์ฒ˜ ์‚ฌ์šฉ์ž ์ฐพ๊ธฐ #3 : ๋‚˜์™€ ๋™์ผํ•œ ํ”„๋กœํ•„ ์œ ํ˜• ํด๋ฆญํ•˜๋ฉด ์Šคํƒฌํ”„ ์ ๋ฆฝ ๋ฐ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์• ๋‹ˆ๋ฉ”์ด์…˜
  • [ ๋ฌด๋ฌผ ] Prisma ORM ์œผ๋กœ NextJS ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•˜๊ธฐ
eyes from es
eyes from es
  • eyes from es
    eyes from es
    eyes from es
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • โค๏ธ ๊ฟ€ํŒ ๋ชจ์Œ
        • โค๏ธ ๊ฐ“์ƒ ๊ฟ€ํŒ
        • โค๏ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      • ๐Ÿงก Projects
        • ๐Ÿงก Projects: Web
        • ๐ŸŽคPreterview
        • ๐Ÿงก Projects: App
        • ๐Ÿงก๋Œ€์™ธํ™œ๋™
        • ๐Ÿงก OSCCA ์˜คํ”ˆ์†Œ์Šค ์ปจํŠธ๋ฆฌ๋ทฐ์…˜ ์•„์นด๋ฐ๋ฏธ
      • ๐Ÿ’› Frontend
        • ๐Ÿ’› Frontend : React
        • ๐Ÿ’› Frontend : JavaScript
        • ๐Ÿ’› Frontend : TypeScript
      • ๐Ÿ’š Backend
      • ๐Ÿ’™ OS: ์šด์˜์ฒด์ œ
        • ๐Ÿ’™ Linux
      • ๐Ÿ’œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
        • ๐Ÿ’œ ์ž๋ฃŒ๊ตฌ์กฐ
        • ๐Ÿ’œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
        • ๐Ÿ’œ ๋ฐฑ์ค€
        • ๐Ÿ’œSWEA
        • ๐Ÿ’œํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
      • ๐Ÿ”ด Study
        • ๐Ÿ”ด๋ฉด์ ‘ ์Šคํ„ฐ๋””
        • ๐Ÿ”ด ๊ธฐ์—…๋ถ„์„
        • ๐Ÿ”ด ์—๋Ÿฌ๋…ธํŠธ(Error Note)๐Ÿงฑ
        • ๐Ÿ”ด ITNews(Coding)
        • ๐Ÿ”ด ITNews(Tech)
      • ๐ŸŸ  ์ธ์ƒ ๊ณ„ํš
        • ๐ŸŸ  ์˜ฌํ•ด ๋ชฉํ‘œ
      • ๐ŸŸก TIL
        • ๐ŸŸก TIL ์ผ๊ธฐ
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    css
    ๋™ํ–ฅ๋ถ„์„
    ์›น๊ฐœ๋ฐœ
    IT์ด์Šˆ
    ๋ฐฉํ•™์Šคํ„ฐ๋””
    ์ฝ”๋“œ๋ฆฌ๋ทฐ
    ๊ธฐ์—…๋ถ„์„
    ๋ถ„์„๋ ˆํฌํŠธ
    SW์ด์Šˆ
    ์ฝ”๋”ฉ
    ๋„ค์นด๋ผ์ฟ ๋ฐฐ
    ์ž๋ฃŒ๊ตฌ์กฐ
    html
    ์ฝ”ํ…Œ
    ์Šคํ„ฐ๋””
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ์ตœ๊ทผ์ด์Šˆ
    ์‚ผ์„ฑ์ „์ž
    C
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    ๋ฐฑ์ค€
    ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ
    ๋‰ด์Šค์Šคํฌ๋žฉ
    ๋‰ด์Šค๋ฃธ
    Ai
    ๊ฐœ๋ฐœ
    ๋ฌธ์ œํ’€์ด
    ๊ฐœ๋ฐœ๊ณต๋ถ€
    ์Šค๋งˆํŠธ์‹ฑ์Šค
    ์ฝ”๋“œ์Šคํ„ฐ๋””
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
eyes from es
[ ๋ฌด๋ฌผ ] ๊ทผ์ฒ˜ ์‚ฌ์šฉ์ž ์ฐพ๊ธฐ #1 : ์œ„๋„ / ๊ฒฝ๋„ GPS ๊ธฐ๋ฐ˜ WebSocket ์„ธํŒ…ํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”