-
Notifications
You must be signed in to change notification settings - Fork 0
๐ข WebRTC Mesh โ ํ๋ํ ์ฌ์
Sequence Diagram(Two Clients) ์ ๊ธฐ/ํผ์น๊ธฐ
sequenceDiagram
participant C1 as Client 1
participant SS as Signaling Server
participant C2 as Client 2
Note over C1,C2: 1. ์์ฑ ์ฑํ
๋ฐฉ ์
์ฅ ๋จ๊ณ
C1->>C1: Request microphone permission
activate C1
Note right of C1: getUserMedia()๋ก<br/>๋ง์ดํฌ ๊ถํ ์์ฒญ
C1-->>C1: Setup local stream
deactivate C1
C1->>SS: join_room
activate SS
Note right of SS: ๋ฐฉ ์ ๋ณด์ Client 1 ์ถ๊ฐ
SS-->>C1: room_info
deactivate SS
Note right of C1: ๋ฐฉ ์ ๋ณด ์์ <br/>(ํ์ฌ๋ Client 1๋ง ์กด์ฌ)
C1->>SS: room_info_received
Note right of SS: Client 1์ด ๋ฐฉ ์ ๋ณด๋ฅผ<br/>์ ์์ ์ผ๋ก ์์ ํ์์ ํ์ธ
Note over C1,C2: 2. ๋ ๋ฒ์งธ ์ฌ์ฉ์ ์
์ฅ
C2->>C2: Request microphone permission
activate C2
Note right of C2: getUserMedia()๋ก<br/>๋ง์ดํฌ ๊ถํ ์์ฒญ
C2-->>C2: Setup local stream
deactivate C2
C2->>SS: join_room
activate SS
Note right of SS: ๋ฐฉ ์ ๋ณด์ Client 2 ์ถ๊ฐ
SS-->>C1: room_info
SS-->>C2: room_info
deactivate SS
Note right of C2: ์
๋ฐ์ดํธ๋ ๋ฐฉ ์ ๋ณด ์์ <br/>(Client 1, 2 ์ ๋ณด ํฌํจ)
C1->>SS: room_info_received
C2->>SS: room_info_received
Note right of SS: ๋ชจ๋ ํด๋ผ์ด์ธํธ๊ฐ<br/>๋ฐฉ ์ ๋ณด๋ฅผ ์์ ํ์์ ํ์ธ
Note over C1,C2: 3. P2P ์ฐ๊ฒฐ ์์
SS->>C1: start_connections
SS->>C2: start_connections
Note right of SS: ์๋ฒ๊ฐ ์ฐ๊ฒฐ ๊ณํ ์ ์ก<br/>(๋๊ฐ ๋๊ตฌ์๊ฒ Offerํ ์ง)
Note over C1,C2: 4. WebRTC ์๊ทธ๋๋ง ๋จ๊ณ
C1->>C1: Create RTCPeerConnection
activate C1
Note right of C1: STUN/TURN ์๋ฒ ์ค์ <br/>๋ก์ปฌ ์คํธ๋ฆผ ์ถ๊ฐ
C1-->>C1: Create Offer
deactivate C1
C1->>SS: webrtc_offer
SS->>C2: webrtc_offer
Note right of C2: Offer SDP ์์
C2->>C2: Create RTCPeerConnection
activate C2
Note right of C2: STUN/TURN ์๋ฒ ์ค์ <br/>๋ก์ปฌ ์คํธ๋ฆผ ์ถ๊ฐ
C2-->>C2: Create Answer
deactivate C2
C2->>SS: webrtc_answer
SS->>C1: webrtc_answer
Note right of C1: Answer SDP ์์
Note over C1,C2: 5. ICE Candidate ๊ตํ
par ICE Candidate Exchange
C1->>SS: webrtc_ice_candidate
SS->>C2: webrtc_ice_candidate
and
C2->>SS: webrtc_ice_candidate
SS->>C1: webrtc_ice_candidate
end
Note over C1,C2: ์๋ฐฉํฅ ICE Candidate ๊ตํ<br/>์ต์ ์ ๋คํธ์ํฌ ๊ฒฝ๋ก ์ค์
Note over C1,C2: 6. P2P ์ฐ๊ฒฐ ์๋ฃ
par Media Stream Exchange
C1-->>C2: Send audio stream
C2-->>C1: Send audio stream
end
Note over C1,C2: ์๋ฐฉํฅ ์์ฑ ์คํธ๋ฆผ ์ ์ก ์์<br/>์ค์๊ฐ ์์ฑ ํตํ ๊ฐ๋ฅ
Note over C1,C2: 7. ์ฐ๊ฒฐ ์ํ ๋ชจ๋ํฐ๋ง
loop Connection Monitoring
C1->>C1: Monitor connection state
C2->>C2: Monitor connection state
Note over C1,C2: connectionStateChange,<br/>iceConnectionStateChange<br/>์ด๋ฒคํธ ๋ชจ๋ํฐ๋ง
end
Note over C1,C2: 8. ์ฌ์ฉ์ ํด์ฅ ์๋๋ฆฌ์ค
C2->>SS: disconnect
activate SS
SS-->>C1: user_disconnected
deactivate SS
C1->>C1: Clean up connection
activate C1
Note right of C1: Peer Connection ์ ๋ฆฌ<br/>์ค๋์ค ์๋ฆฌ๋จผํธ ์ ๊ฑฐ
deactivate C1
Sequence Diagram(Three Clients) ์ ๊ธฐ/ํผ์น๊ธฐ
sequenceDiagram
participant C1 as Client 1
participant SS as Signaling Server
participant C2 as Client 2
participant C3 as Client 3
Note over C1,C2: 1. ์ด๊ธฐ ๋ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ์๋ฆฝ
C1->>SS: join_room
Note right of SS: Client 1 ๋ฐฉ ์ฐธ๊ฐ
SS-->>C1: room_info
C1->>SS: room_info_received
C2->>SS: join_room
Note right of SS: Client 2 ๋ฐฉ ์ฐธ๊ฐ
SS-->>C1: room_info
SS-->>C2: room_info
C1->>SS: room_info_received
C2->>SS: room_info_received
SS->>C1: start_connections
SS->>C2: start_connections
Note right of SS: C1 โ C2 ์ฐ๊ฒฐ ๊ณํ ์ ์ก
Note over C1,C2: WebRTC C1 โ C2 ์ฐ๊ฒฐ ์๋ฆฝ
C1->>SS: webrtc_offer (to C2)
SS->>C2: webrtc_offer (from C1)
C2->>SS: webrtc_answer (to C1)
SS->>C1: webrtc_answer (from C2)
par ICE Candidate Exchange C1 โ C2
C1->>SS: ice_candidate (to C2)
SS->>C2: ice_candidate (from C1)
and
C2->>SS: ice_candidate (to C1)
SS->>C1: ice_candidate (from C2)
end
Note over C1,C2: C1 โ C2 P2P ์ฐ๊ฒฐ ์๋ฃ
Note over C1,C3: 2. ์ธ ๋ฒ์งธ ํด๋ผ์ด์ธํธ ์
์ฅ
C3->>SS: join_room
Note right of SS: Client 3 ๋ฐฉ ์ฐธ๊ฐ
SS-->>C1: room_info
SS-->>C2: room_info
SS-->>C3: room_info
Note right of SS: 3๋ช
์ ํด๋ผ์ด์ธํธ ์ ๋ณด ํฌํจ
C1->>SS: room_info_received
C2->>SS: room_info_received
C3->>SS: room_info_received
SS->>C1: start_connections
SS->>C2: start_connections
SS->>C3: start_connections
Note right of SS: C1 โ C3, C2 โ C3<br/>์๋ก์ด ์ฐ๊ฒฐ ๊ณํ ์ ์ก
Note over C1,C3: WebRTC C1 โ C3 ์ฐ๊ฒฐ ์๋ฆฝ
C1->>SS: webrtc_offer (to C3)
SS->>C3: webrtc_offer (from C1)
C3->>SS: webrtc_answer (to C1)
SS->>C1: webrtc_answer (from C3)
par ICE Candidate Exchange C1 โ C3
C1->>SS: ice_candidate (to C3)
SS->>C3: ice_candidate (from C1)
and
C3->>SS: ice_candidate (to C1)
SS->>C1: ice_candidate (from C3)
end
Note over C2,C3: WebRTC C2 โ C3 ์ฐ๊ฒฐ ์๋ฆฝ
C2->>SS: webrtc_offer (to C3)
SS->>C3: webrtc_offer (from C2)
C3->>SS: webrtc_answer (to C2)
SS->>C2: webrtc_answer (from C3)
par ICE Candidate Exchange C2 โ C3
C2->>SS: ice_candidate (to C3)
SS->>C3: ice_candidate (from C2)
and
C3->>SS: ice_candidate (to C2)
SS->>C2: ice_candidate (from C3)
end
Note over C1,C3: 3๋ช
์ Full Mesh P2P ์ฐ๊ฒฐ ์๋ฃ
Note over C1,C3: 3. Client 2 ํด์ฅ
C2->>SS: disconnect
Note right of SS: Client 2 ์ฐ๊ฒฐ ํด์ ์ฒ๋ฆฌ
SS-->>C1: user_disconnected (C2)
SS-->>C3: user_disconnected (C2)
par Connection Cleanup
C1->>C1: Clean up C2 connection
Note right of C1: - C2์์ Peer Connection ์ข
๋ฃ<br/>- C2์ ์ค๋์ค ์๋ฆฌ๋จผํธ ์ ๊ฑฐ
and
C3->>C3: Clean up C2 connection
Note right of C3: - C2์์ Peer Connection ์ข
๋ฃ<br/>- C2์ ์ค๋์ค ์๋ฆฌ๋จผํธ ์ ๊ฑฐ
end
SS-->>C1: room_info
SS-->>C3: room_info
Note right of SS: 2๋ช
์ ํด๋ผ์ด์ธํธ ์ ๋ณด๋ก ์
๋ฐ์ดํธ
C1->>SS: room_info_received
C3->>SS: room_info_received
Note over C1,C3: C1 โ C3 P2P ์ฐ๊ฒฐ ์ ์ง<br/>2๋ช
์ ํด๋ผ์ด์ธํธ๋ก ์์ฑ ์ฑํ
๊ณ์
WebRTC ๊ธฐ๋ฐ์ ์์ฑ ํตํ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ฉด์, ์ ํฌ๋ Mesh ๋ฐฉ์์ ์ ํํ๊ฒ ๋์์ต๋๋ค.
Mesh ๋ฐฉ์์ ์ ํํ ์ด์ ์ ๊ทผ๊ฑฐ๋ ๐ WebRTC Mesh โ ํธ๋ํฝ ๊ณ์ฐ์ ์ฐธ๊ณ ํด ์ฃผ์ธ์!
์ด ๊ธ์์๋ ๊ฐ๋ฐ ๊ณผ์ ์์ ์ด๋ค ์ด๋ ค์์ด ์์๋์ง, ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง๋ฅผ ๊ณต์ ํ๊ณ ์ ํฉ๋๋ค.
๊ฐ๋ฐ์ ์งํํ๋ฉด์ ์์์น ๋ชปํ ๋ฌธ์ ๋ค์ด ๋ฐ์ํ์ต๋๋ค.
- ์๋ก์ด ์ฌ์ฉ์๊ฐ ๋ค์ด์ค๊ฑฐ๋ ๊ธฐ์กด ์ฌ์ฉ์๊ฐ ๋๊ฐ๋ ๋ฑ ๋ณํ๊ฐ ์ง์์ ์ผ๋ก ๋ฐ์ํ๋ ์ํฉ์์ Mesh ๋คํธ์ํฌ์ ์์ ์ฑ์ด ๋จ์ด์ง๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
- ํนํ, ํ์ด๋ฐ ์ด์๋ก ์ธํด ์ฐ๊ฒฐ ์ค์ ๋ฐ ํด์ ๊ฐ ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋น๋ฒํ์ต๋๋ค.
- LTE๋ 5G์ ๊ฐ์ ๋ชจ๋ฐ์ผ ๋คํธ์ํฌ์์๋ ์๋น์ค๊ฐ ์ ์์ ์ผ๋ก ๋์ํ์ง ์์์ต๋๋ค.
- ์ด๋ ISP์ ๋ฐฉํ๋ฒฝ ๋ฌธ์ ๋ก ์ถ์ธก๋์์ผ๋ฉฐ, TURN ์๋ฒ์ ํ์์ฑ์ ๋๋ผ๊ฒ ๋์์ต๋๋ค.
- ๋ฐฉ์ ๊ฐ์คํ ์ฌ์ฉ์๊ฐ ์ฌ์ ์ํ๋ฉด ๋ชจ๋ ์ฐ๊ฒฐ์ด ๋๊ธฐ๋ ํ์์ด ๋ฐ์ํ์ต๋๋ค.
- ์ด๋ ๋ฐฉ์ฅ์๊ฒ ํน์ ๊ถํ์ด๋ ์ญํ ์ด ๋ถ์ฌ๋์ด ์์ด ๋ฐ์ํ ๋ฌธ์ ๋ก ํ๋จ๋์์ต๋๋ค.
๋ชจ๋ฐ์ผ ๋คํธ์ํฌ์์์ ์ฐ๊ฒฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Coturn์ ํ์ฉํ์ฌ ์์ฒด์ ์ธ STUN/TURN ์๋ฒ๋ฅผ ๊ตฌ์ถํ์ต๋๋ค. ์ด๋ฅผ ํตํด NAT ๋ฐฉํ๋ฒฝ์ ์ฐํํ์ฌ ๋ชจ๋ฐ์ผ ๋คํธ์ํฌ์์๋ ์์ ์ ์ธ ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค.
- ํ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์ฒด์ ์ธ ์๊ทธ๋๋ง ๋ก์ง์ ๊ฐ์ ํ์ต๋๋ค.
- ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์์ ํ์ธ(ACK) ๋ฉ์ปค๋์ฆ์ ๋์ ํ์ฌ ๋ฉ์์ง ์ ๋ฌ์ ์ ๋ขฐ์ฑ์ ๋์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ์๋ก์ด ์ฌ์ฉ์์ ์ ์ฅ์ด๋ ๊ธฐ์กด ์ฌ์ฉ์์ ํด์ฅ ์ ๋ฐ์ํ๋ ๋ถ์์ ์ฑ์ ํด์ํ์ต๋๋ค.
- ๋ฐฉ์ฅ์๊ฒ ๋ถ์ฌ๋ ํน๋ณํ ์ญํ ์ ์ ๊ฑฐํ์ฌ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋๋ฑํ ์ญํ ์ ๊ฐ์ง๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
- ์ด๋ฅผ ํตํด ๋ฐฉ์ฅ์ด ์ฌ์ ์ํ๊ฑฐ๋ ํด์ฅํ๋๋ผ๋ ์ ์ฒด ์ฐ๊ฒฐ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ๊ฐ์ ํ์ต๋๋ค.
๊ฐ์ ๋ ๋ก์ง์ ๋ฐ๋ผ WebRTC P2P Mesh ์์ฑ ํตํ์ ์ ์ฒด์ ์ธ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํด๋ผ์ด์ธํธ ์ด๊ธฐํ: ๊ฐ ํด๋ผ์ด์ธํธ๋ ๋ง์ดํฌ ๊ถํ์ ์์ฒญํ๊ณ ๋ก์ปฌ ์คํธ๋ฆผ์ ์ค์ ํฉ๋๋ค.
-
๋ฐฉ ์ฐธ๊ฐ: ์๊ทธ๋๋ง ์๋ฒ์
join_room
์ด๋ฒคํธ๋ฅผ ํตํด ๋ฐฉ ์ฐธ๊ฐ๋ฅผ ์์ฒญํฉ๋๋ค. -
๋ฐฉ ์ ๋ณด ์์ ๋ฐ ํ์ธ: ์๋ฒ๋ก๋ถํฐ ๋ฐฉ ์ ๋ณด๋ฅผ ์์ ํ๊ณ
room_info_received
์ด๋ฒคํธ๋ก ์์ ํ์ธ์ ๋ณด๋ ๋๋ค. -
P2P ์ฐ๊ฒฐ ์ค์ : ์๋ฒ๋ก๋ถํฐ
start_connections
์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ฐ๊ฒฐ ๊ณํ์ ๋ฐ๋ผ Offer/Answer ๊ตํ์ ์์ํฉ๋๋ค. ์ฐ๊ฒฐ ๊ณํ์๋ ์ด๋ค ํด๋ผ์ด์ธํธ๊ฐ(From
) ์ด๋ค ํด๋ผ์ด์ธํธ(To
)์๊ฒ Offer๋ฅผ ๋ณด๋ผ์ง๊ฐ ๋ช ์๋์ด ์์ต๋๋ค. - ICE Candidate ๊ตํ: P2P ์ฐ๊ฒฐ์ ์ํ ์ต์ ์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๊ธฐ ์ํด ICE Candidate๋ฅผ ๊ตํํฉ๋๋ค.
- ๋ฏธ๋์ด ์คํธ๋ฆผ ๊ตํ: ์ฐ๊ฒฐ์ด ์๋ฃ๋๋ฉด ์๋ฐฉํฅ์ผ๋ก ์์ฑ ์คํธ๋ฆผ์ ์ ์กํ์ฌ ์ค์๊ฐ ํตํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ์ฐ๊ฒฐ ์ํ ๋ชจ๋ํฐ๋ง: ๊ฐ ํด๋ผ์ด์ธํธ๋ ์ฐ๊ฒฐ ์ํ์ ICE ์ํ ๋ณํ๋ฅผ ๋ชจ๋ํฐ๋งํ์ฌ ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์ฌ์ค์ ํฉ๋๋ค.
-
์ฌ์ฉ์ ํด์ฅ ์ฒ๋ฆฌ: ์ฌ์ฉ์๊ฐ ํด์ฅํ๋ฉด
user_disconnected
์ด๋ฒคํธ๋ฅผ ํตํด ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ์ฌ์ฉ์์์ ์ฐ๊ฒฐ์ ์ ๋ฆฌํฉ๋๋ค.
WebRTC P2P Mesh ๋ฐฉ์์ ํ์ฉํ ์์ฑ ํตํ ์๋น์ค๋ฅผ ๊ตฌํํ๋ฉด์ ๋ง์ ์ด๋ ค์์ด ์์์ง๋ง, ์ง์์ ์ธ ๋ฌธ์ ํด๊ฒฐ๊ณผ ๋ก์ง ๊ฐ์ ์ ํตํด ์์ ์ ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ๋์์ต๋๋ค. ํนํ, Coturn์ ํ์ฉํ STUN/TURN ์๋ฒ ๊ตฌ์ถ๊ณผ ํ์ด๋ฐ ๋ฌธ์ ํด๊ฒฐ์ ์ํ ๋ก์ง ๊ฐ์ ์ด ํฐ ์ญํ ์ ํ์ต๋๋ค.
์ด๋ฒ ๊ฒฝํ์ ํตํด ์ค์๊ฐ ํต์ ์๋น์ค์์์ ๋คํธ์ํฌ ํ๊ฒฝ๊ณผ ํ๋กํ ์ฝ์ ์ค์์ฑ์ ๋ค์ ํ๋ฒ ๋๋ ์ ์์์ต๋๋ค.
์ฌ๊ธฐ๊น์ง ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ํน์ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ๊ณ์๋ค๋ฉด ์ด ๊ธ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๐ค Ground Rule
๐ Convention
๐ณ Git Branch ์ ๋ต
๐ ๏ธ AGT - Automatic Git & Github Tool
๐ WebRTC Mesh โ ํธ๋ํฝ ๊ณ์ฐ
๐ข WebRTC Mesh - ํ๋ํ ์ฌ์
๐ฌ WebRTC๋ฅผ ์์๋ณด์
๐ฎ SSE(Server Sent Events)
๐ SSE Pagination
โณ Socket ํต์ ์์ ๋น๋๊ธฐ ์์
์์ ๋ณด์ฅ ๋ฐฉ๋ฒ
๐ก Redis pub/sub๋ฅผ ํ์ฉํ SSE ์ ์ฉ๊ธฐ
๐๏ธ Naver Cloud Platform์ ํ์ฉํ ๋ฐฐํฌ ์ ๋ต
โ๏ธ๐ ๋ถํ ํ
์คํธ: ๋จ์ผ ์ธ์คํด์ค VS NKS
๐ดโโ๏ธ Redis๋ก ๊ฒ์๋ฐฉ ๊ด๋ฆฌ ์ต์ ํ: ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ฑ๋ฅ ๊ฐ์
๐ ํ์๋ก ์บ๋ฆฐ๋
๐ค ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ ํ
ํ๋ฆฟ
๐ค ํ๊ณ ํ
ํ๋ฆฟ
0๏ธโฃ 0์ฃผ์ฐจ ๋ฉํ ๋ง ์ผ์ง
1๏ธโฃ 1์ฃผ์ฐจ ๋ฉํ ๋ง ์ผ์ง
2๏ธโฃ 2์ฃผ์ฐจ ๋ฉํ ๋ง ์ผ์ง
3๏ธโฃ 3์ฃผ์ฐจ ๋ฉํ ๋ง ์ผ์ง
4๏ธโฃ 4์ฃผ์ฐจ ๋ฉํ ๋ง ์ผ์ง
0๏ธโฃ 0์ฃผ์ฐจ ๋ฐํ
1๏ธโฃ 1์ฃผ์ฐจ ๋ฐํ
2๏ธโฃ 2์ฃผ์ฐจ ๋ฐํ
3๏ธโฃ 3์ฃผ์ฐจ ๋ฐํ
4๏ธโฃ 4์ฃผ์ฐจ ๋ฐํ
5๏ธโฃ ์ต์ข
๋ฐํ