1. ๋ชจ๋ฐ์ผ ์๊ฒฉ์ ์ด์ ๊ธฐ์ ์ ๋์ : ์ง์ฐ ์๊ฐ(Latency)๊ณผ NAT ํธ๋๋ฒ์ค
์๊ฒฉ ์ ์ด ์ํํธ์จ์ด์ ์์ฑ๋๋ฅผ ๊ฒฐ์ ์ง๋ ๊ฐ์ฅ ํต์ฌ์ ์ธ ์งํ๋ '์ง์ฐ ์๊ฐ(Latency)'์ ๋๋ค. ์กฐ์์๊ฐ ๋ง์ฐ์ค๋ฅผ ํด๋ฆญํ๊ฑฐ๋ ํ๋ฉด์ ์ค์์ดํํ์ ๋, ํผ์ ์ด ๋จ๋ง์ด ๋ฐ์ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ ํ๋ฉด์ด ๋ค์ ์กฐ์์์ ๋์ ๋ค์ด์ค๊ธฐ๊น์ง์ ์๋ณต ์๊ฐ(RTT: Round-Trip Time)์ด 150ms๋ฅผ ์ด๊ณผํ๋ฉด ์ฌ์ฉ์๋ ์ฆ์ ์ฌ๊ฐํ ๋ฒ๋ฒ ๊ฑฐ๋ฆผ๊ณผ ๋ฉ๋ฏธ๊ฐ์ ๋๋ผ๊ฒ ๋ฉ๋๋ค.
๊ธฐ์กด ๋ ๊ฑฐ์ ์๊ฒฉ ์๋ฃจ์ ๋ค์ ์ค์ ์ค๊ณ ์๋ฒ๋ฅผ ๊ฑฐ์น๋ TCP ๊ธฐ๋ฐ ์์ผ ํต์ ์ ์ฃผ๋ก ์ฌ์ฉํ์ฌ ํจํท ์์ค ์ ์ฌ์ ์ก ๋๊ธฐ ์๊ฐ์ผ๋ก ์ธํด ํ๋ฉด ๋๊น ํ์์ด ๋น๋ฒํ์ต๋๋ค. KODARI๋ WebRTC(Web Real-Time Communication)์ WebSocket ํ์ด๋ธ๋ฆฌ๋ ๋ฉ์์ง ํ์ดํ๋ผ์ธ์ ์ฑํํ์ฌ ์ ์ธ๊ณ ์ด๋์๋ 100ms ๋ฏธ๋ง์ ์ค์๊ฐ 60FPS ๋ฌด์ ์๊ฒฉ ์ ์ด๋ฅผ ์คํํ์ต๋๋ค.
2. KODARI ํ์ด๋ธ๋ฆฌ๋ 3๊ณ์ธต ์คํธ๋ฆฌ๋ฐ ์ํคํ ์ฒ
- ์๊ทธ๋๋ง ๋ ์ด์ด (Signaling Layer - WebSocket): ์กฐ์์ ์น ๋ธ๋ผ์ฐ์ ์ ํผ์ ์ด ์๋๋ก์ด๋ ๋จ๋ง ๊ฐ์ SDP(Session Description Protocol) ์คํผ์ ์ค์, ICE Candidate ํจํท์ 10ms ๋จ์๋ก ์ด๊ณ ์ ๊ตํํฉ๋๋ค.
- ๋ฏธ๋์ด ๋ฏธ๋ฌ๋ง ๋ ์ด์ด (Media Streaming - WebRTC UDP): H.264 / VP8 ํ๋์จ์ด ์ธ์ฝ๋๋ฅผ ๊ฐ๋ํ์ฌ ์๋๋ก์ด๋ ํ๋ฉด ํ๋ ์์ ์์ถํ ํ, P2P DTLS/SRTP ์ํธํ ํฐ๋์ ํตํด ์๋๋ฐฉ ํ๋ฉด์ผ๋ก ๋ค์ด๋ ํธ ์ ์กํฉ๋๋ค. ํจํท ์์ค ์์๋ ์ง์ฐ์ ์ ๋ฐํ๋ TCP ์ฌ์ ์ก ๋์ ์ ์ฐํ ํ๋ ์ ์คํต ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ํญ์ ์ค์๊ฐ ๋ผ์ด๋ธ ํ๋ฉด์ ์ ์งํฉ๋๋ค.
- ํฐ์น ์ฃผ์ ๋ ์ด์ด (Input Injection - Binary Protocol): ์กฐ์์์ ๋ง์ฐ์ค ์ขํ, ์คํฌ๋กค, ํ์น ํฌ ์ค ์ด๋ฒคํธ๋ฅผ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ก ๊ฒฝ๋ ์ง๋ ฌํํ์ฌ ์๋๋ก์ด๋ ๋ฌด์ฅ์ ์ ๊ทผ์ฑ ์๋น์ค(AccessibilityService)๋ก ์ฆ์ ์ฃผ์ (Inject)ํฉ๋๋ค.
3. ํต์ ์ฌ LTE/5G ๋์นญํ NAT๋ฅผ ๋ซ๋ ๊ณ ์ฑ๋ฅ P2P ํํ์นญ
์ค๋งํธํฐ์ ์ด๋ํต์ ์ฌ ๋ด๋ถ์ ์ฌ์ค IP(CGNAT) ํ๊ฒฝ์ ๋ฌผ๋ ค ์์ด ์๋ฐฉํฅ ์ง์ P2P ์ฐ๊ฒฐ์ด ๋งค์ฐ ๊น๋ค๋กญ์ต๋๋ค. KODARI๋ ๋ค์ค ๊ณ์ธต ICE(Interactive Connectivity Establishment) ์ ๋ต์ผ๋ก ์ฐ๊ฒฐ ์ฑ๊ณต๋ฅ 99.9%๋ฅผ ๋ฌ์ฑํฉ๋๋ค:
- STUN ์๋ฒ ํ: ๊ณต์ธ IP์ ํฌํธ ๋ฒํธ๋ฅผ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์์งํ์ฌ ์ง์ ์ฐ๊ฒฐ(Host & Server Reflexive)์ ์๋ํฉ๋๋ค.
- ์ค๋งํธ ๋ฆด๋ ์ด(TURN) ํด๋ฐฑ: ๋ํ ๋ณ์, ๊ธ์ต๊ถ, ํด์ธ ์ด๋ํต์ ๋ง ๋ฑ ์๊ฒฉํ ๋ฐฉํ๋ฒฝ์ด๋ ๋์นญํ NAT๊ฐ ๊ฐ์ง๋๋ฉด, ์ ์ธ๊ณ 5๊ฐ ๋๋ฅ์ ๋ถ์ฐ ๋ฐฐ์น๋ KODARI ์ ์ง์ฐ ๋ฆด๋ ์ด ๋ ธ๋๋ก 0.1์ด ๋ง์ ๋ฌด์ค๋จ ์ ํ(Seamless Fallback)ํ์ฌ ์ ์ ๋๊น์ ๋ฐฉ์งํฉ๋๋ค.
4. Model C: ํ์ฌ ๋ชจ๋ฐ์ผ ์ฑ์ ๋จ 3์ค๋ก ์ด์๋๋ ์๋ฒ ๋๋ SDK
์ฝ๋ค๋ฆฌ์ ๊ธฐ์ ๋ ฅ์ ๋ ์ ์ฑ์๋ง ๋จธ๋ฌด๋ฅด์ง ์๊ณ ๊ธฐ์ ์ฉ SDK๋ก ํ์ฅ๋ฉ๋๋ค: ```kotlin // ๊ณ ๊ฐ์ฌ ์ฑ Application ๋๋ Activity์์ ๋จ 3์ค ์ด๊ธฐํ val kodari = KodariRemoteSDK.init(context, "KODARI-LICENSE-KEY") kodari.setEventListener { status -> Log.d("KODARI", "Remote status: $status") } kodari.startSupportSession(counselorCode = "772819") ``` ๋ณต์กํ ํ๋ฉด ์บก์ฒ ๊ถํ ๊ด๋ฆฌ์ ํต์ ํ๋กํ ์ฝ ๊ตฌํ์ SDK ๋ด๋ถ๋ก ์์ ์๋ํ์ฌ, ๊ธ์ต ์ฑ, ์ด์ปค๋จธ์ค ์ฑ, ์ค๋ฒ ํฌ์ค์ผ์ด ์ฑ ๊ฐ๋ฐํ์ด ๋จ ํ๋ฃจ ๋ง์ ์ธ์ฑ ์๊ฒฉ ๊ณ ๊ฐ์ง์ ๊ธฐ๋ฅ์ ๋ฐ์นญํ ์ ์๋๋ก ๊ฐ๋ ฅํ ์์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.