-
Notifications
You must be signed in to change notification settings - Fork 3
๐ ๏ธ [ํธ๋ฌ๋ธ์ํ ] socket.io ๊ฒฝ๋ก๋ก ์ง์์ ์ผ๋ก HTTP ์์ฒญ์ ๋ณด๋ด๋ ๋ฌธ์
๊ณต๋ถ๋ฐฉ ํ์ด์ง์ ์ ์ ํ /socket.io
๊ฒฝ๋ก๋ก ์ง์์ ์ผ๋ก HTTP ์์ฒญ์ ๋ณด๋ด๋ ํ์์ด ๋ฐ์ํ๋ค.
๊ณต๋ถ๋ฐฉ ๋ฆฌ์คํธ ํ์ด์ง๋ก ๋๊ฐ ํ์๋ /socket.io
๊ฒฝ๋ก๋ก ์ง์์ ์ผ๋ก HTTP ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ค.
HTTP ์์ฒญ ํค๋
์์ฒญ ํ์: XMLHttpRequest
GET /socket.io/?EIO=4&transport=polling&t=lxrjhd23 HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: ko,en;q=0.9
Connection: keep-alive
Host: gomz.kr
Referer: https://gomz.kr/study-room/114
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
์ฟผ๋ฆฌ ๋ฌธ์์ด ๋งค๊ฐ๋ณ์
- EIO: 4
- transport: polling
- t: lxrjhd23
HTTP ์๋ต ํค๋
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Sat, 30 Nov 2024 08:05:04 GMT
Content-Type: text/html
Last-Modified: Sat, 30 Nov 2024 04:03:55 GMT
Transfer-Encoding: chunked
Connection: keep-alive
ETag: W/"674a8eab-3d7"
Content-Encoding: gzip
HTTP ์๋ต
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>GOMZ - ์ค์๊ฐ ์จ๋ผ์ธ ํ์ต ํ๋ซํผ</title>
<link rel="icon" href="/images/gomz-logo.png" />
<meta
name="description"
content="์บ ์ ์ผ๊ณ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ํจ๊ป ๊ณต๋ถํ๋ ์๊ฐ์ ๊ธฐ๋กํ ์ ์๋ ์จ๋ผ์ธ ํ์ต ํ๋ซํผ์
๋๋ค."
/>
<meta name="keywords" content="๋น๋๋ฉด, ๊ณต๋ถ๋ฐฉ, ํ์ต, ํ์ด๋จธ, ํ์ ํ์, ํ์ต ์๊ฐ ๊ธฐ๋ก" />
<link
rel="stylesheet"
as="style"
crossorigin
href="https://cdn.jsdelivr.net/gh/orioncactus/[email protected]/dist/web/variable/pretendardvariable-dynamic-subset.min.css"
/>
<script type="module" crossorigin src="/assets/index-wKdhJbca.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-C6ivelCl.css">
</head>
<body>
<div id="root"></div>
</body>
</html>
useWebRTC
์์ signaling ์๋ฒ์ ์ฐ๊ฒฐ๋๋ socket
์ ๋ค์๊ณผ ๊ฐ์ด useRef
๋ก ๊ด๋ฆฌํ๊ณ , ์ด๊ธฐ๊ฐ์ผ๋ก io()
๋ก ์์ฑํด์ ๋ฃ์ด์ฃผ๊ณ ์์๋ค.
// useWebRTC.ts
const useWebRTC = (): [WebRTCState, WebRTCControls] => {
const socket = useRef(io());
...
const joinRoom = async (roomId: string) => {
...
socket.current = signalingClient(configuration, localStreamRef.current, webRTCMap.current);
socket.current.emit('joinRoom', { roomId });
return socket.current;
};
...
๊ณต๋ถ๋ฐฉ ํ์ด์ง์ ์
์ฅํ๋ฉด joinRoom
ํจ์๊ฐ ์คํ๋๊ณ signalingClient
ํจ์์ ๋ฐํ๊ฐ์ผ๋ก socket
์ ๊ฐ์ ธ์์ ์ ์ฅํ๋ค.
signalingClient
์์๋ ์์ผ URL์ https://gomz.kr:3000
๋ก ์ค์ ํด์ ์์ฑํ๊ณ ์๋ค.
// signalingClient.ts
const signalingClient = (...[configuration, localStream, webRTCMap]: SignalingClientParams) => {
const socket = io(import.meta.env.VITE_SIGNALING_SERVER_URL);
// ์ฌ๊ธฐ์ import.meta.env.VITE_SIGNALING_SERVER_URL์ https://gomz.kr:3000์ด๋ค.
...
signalingClient
๊ฐ ์คํ๋๋ฉด socket.current
์ ์ฐธ์กฐ๊ฐ์ด ์๋ก์ด ์์ผ์ผ๋ก ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ์์ผ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์
๋์์ด ๋์ด ์ฌ๋ผ์ง ๊ฒ์ผ๋ก ์๊ฐํ๋ค.
โ ๊ฒฐ๋ก : ์ฌ๋ผ์ง์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผํ๊ณ ์์๋ค. ์ฌ๋ผ์ง์ง ์๋ ์ด์ ๋ ์ด์ด์ ์ค๋ช
.
Socket.IO - Client API๋ฅผ ํ์ธํด๋ณด๋ฉด io()
๋ก ์์ฑํ ๋ URL์ ์ง์ ํ์ง ์๊ณ ์์ฑํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ฉ์ธ์ ๋ฃจํธ(/
) ๊ฒฝ๋ก๋ก ์ฐ๊ฒฐ์ ์๋ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
Socket.IO - How it works๋ฅผ ํ์ธํด๋ณด๋ฉด WebSocket
์ฐ๊ฒฐ์ด ๋คํธ์ํฌ ํ๊ฒฝ, ๋ฐฉํ๋ฒฝ ๋๋ ํ๋ก์ ์ค์ ๋๋ฌธ์ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ Socket.IO๋ ์๋์ผ๋ก HTTP Long-polling
๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฑธ ์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ Socket.IO๋ ๊ธฐ๋ณธ์ ์ผ๋ก HTTP Long-Polling
๋ฐฉ์์ผ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ์ฐ๊ฒฐ์ ์์ํ ํ, WebSocket
์ผ๋ก ์
๊ทธ๋ ์ด๋๋ฅผ ์๋ํ๋ค.
๋ธ๋ผ์ฐ์ ์ ๋คํธ์ํฌ ๋ชจ๋ํฐ์์ ํ์ธํ Socket.IO ์ ๊ทธ๋ ์ด๋ ๋ฉ์ปค๋์ฆ
3000๋ฒ ํฌํธ๋ก๋ ๊ณต์๋ฌธ์์ ๋์จ๋ฐ๋ก HTTP Long-polling
๋ฐฉ์์ผ๋ก ์์ํด์ WebSocket
์ผ๋ก ์
๊ทธ๋ ์ด๋๋๊ณ ์์๋ค.
์ดํ์ ๊ณ์๋๋ ์์ฒญ์ ๊ฒฝ๋ก๋ฅผ ๋ณด๋ฉด 3000๋ฒ ํฌํธ์ ๋ฃจํธ(https://gomz.kr:3000/
)๊ฐ ์๋ ๋๋ฉ์ธ์ ๋ฃจํธ(https://gomz.kr/
) ๊ฒฝ๋ก๋ก GET ์์ฒญ์ ๊ณ์ ๋ณด๋ด๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฆ, ๋งจ ์ฒ์์ ์ด๊ธฐ๊ฐ์ผ๋ก ์์ฑํ ์์ผ์ด ์ฐ๊ฒฐ์ ๊ณ์ ์๋ํ๊ณ ์๋ ๊ฒ์ด์๋ค.
์ฒซ ๋ฒ์งธ GET ์์ฒญ(ํธ๋์์ดํฌ)์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์ ๊ณ์ํด์ ์ฌ์๋ํ๋ ๊ฒ์ผ๋ก ์ถ์ ํ๋ค.
socket.current
์ ์ฐธ์กฐ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ๊ธฐ์กด ์์ผ์ ๋ํด disconnect()
, close()
๋ฑ์ ์กฐ์น๋ฅผ ์ทจํด๋ ์ฐ๊ฒฐ ์๋๋ฅผ ๋ฉ์ถ ์ ์์๋ค.
๊ฒฐ๋ก :
-
socket.current
์ ์ด๊ธฐ๊ฐ์ผ๋ก ์์ฑํ ์์ผ์ด ์๋ชป๋ ๊ฒฝ๋ก๋ก ๊ณ์ํด์ ์ฐ๊ฒฐ ์๋๋ฅผ ํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์์ด ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ ์์ฃผํ๊ณ ์์๋ค. - ๊ณต๋ถ๋ฐฉ ๋ฆฌ์คํธ ํ์ด์ง๋ก ์ด๋ํด๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผํ๋ฉฐ ๊ณ์ํด์ ์ฐ๊ฒฐ ์๋๋ฅผ ํ๊ณ ์์๋ค.
- ์ด๊ธฐ๊ฐ์ผ๋ก ์ด๋ค ์์ผ๋ ์์ฑํ์ง ์๋ ๊ฒ์ด ๋์ ๊ฒ ๊ฐ๋ค.
์ด๊ธฐ๊ฐ์ผ๋ก ์์ผ์ ์์ฑํ์ง ์๋๋ค.
// ์์ ์
const useWebRTC = (): [WebRTCState, WebRTCControls] => {
const socket = useRef(io());
...
// ์์ ํ
const useWebRTC = (): [WebRTCState, WebRTCControls] => {
const socket = useRef<Socket>();
...
- ๐ง ํ ๋น๋ฉ ๋ฐ ๋ธ๋์น ์ ๋ต
- ๐ง ์ฃผ์ ์ ์ ๋ฐ ํ ํ๋ฆฟ ์์ฑ
- ๐ป ํ๋ก์ ํธ ์ด๋ฆ ๋ฐ ๋ก๊ณ ์ ํ๊ธฐ
- ๐ป ๊ธฐํ ์ธ๋ถ์ฌํญ ์ ํ๊ธฐ
- ๐ป ๊ธฐ์ ์คํ ์์
- ๐ป ๋ฐฑ๋ก๊ทธ ์ด์ ์์ฑ
- ๐ป ๊นํ๋ธ ์ํค
- ๐ ๊ธฐํ ๋ฐ MVP ์ ์ง ํ์
- 2๏ธโฃ ์คํ๋ฆฐํธ 2 ์ฃผ๊ฐ ๊ณํ
- ๐งญ ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ
- ๐ฆบ ์ด๋ฒคํธ ํ๋ฆ๋
- ๐ฅ ๋ฐฑ์๋ ์๊ทธ๋๋ง ์๋ฒ ๋ฌธ์
- ๐ฝ ์คํ๋ฆฐํธ 5โ 6 ๋ฐฉํฅ์ฑ
- ๐ ์ต์ข ๋ฐํ ์ค๋น
- ๐ฟ Github Actions CD(์๋๋ฐฐํฌ)
- ๐ API
- โซ forEach๋ async๋ฅผ ๊ธฐ๋ค๋ ค์ฃผ์ง ์๋๋ค
- ๐งช WebRTC SFU ๋ฐ๋ชจ
- ๐ TURN ์๋ฒ ์ธ์ฆ ๋ฐฉ์
- ๐ ๏ธ [ํธ๋ฌ๋ธ์ํ ] /socket.io ๊ฒฝ๋ก๋ก ์ง์์ ์ผ๋ก HTTP ์์ฒญ์ ๋ณด๋ด๋ ๋ฌธ์
- ๐น WebRTC ํ์ํ์์์ ์นด๋ฉ๋ผ ์ํ์ ๋ฐ๋ฅธ ์์คํ ์์ ์ฌ์ฉ๋ ๋ถ์
- ๐ฅ ๋์นญ NAT์์์ WebRTC ์ฐ๊ฒฐ ์๋ฆฝ ๊ณผ์
- ๐ ํ ์คํธ ์ฝ๋์ ๋ชจํน