1. ๋ชจ๋ฐ”์ผ ์›๊ฒฉ์ œ์–ด์˜ ๊ธฐ์ˆ ์  ๋‚œ์ œ: ์ง€์—ฐ ์‹œ๊ฐ„(Latency)๊ณผ NAT ํŠธ๋ž˜๋ฒ„์„ค

์›๊ฒฉ ์ œ์–ด ์†Œํ”„ํŠธ์›จ์–ด์˜ ์™„์„ฑ๋„๋ฅผ ๊ฒฐ์ •์ง“๋Š” ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ์ง€ํ‘œ๋Š” '์ง€์—ฐ ์‹œ๊ฐ„(Latency)'์ž…๋‹ˆ๋‹ค. ์กฐ์ž‘์ž๊ฐ€ ๋งˆ์šฐ์Šค๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํ™”๋ฉด์„ ์Šค์™€์ดํ”„ํ–ˆ์„ ๋•Œ, ํ”ผ์ œ์–ด ๋‹จ๋ง์ด ๋ฐ˜์‘ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ ํ™”๋ฉด์ด ๋‹ค์‹œ ์กฐ์ž‘์ž์˜ ๋ˆˆ์— ๋“ค์–ด์˜ค๊ธฐ๊นŒ์ง€์˜ ์™•๋ณต ์‹œ๊ฐ„(RTT: Round-Trip Time)์ด 150ms๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ฆ‰์‹œ ์‹ฌ๊ฐํ•œ ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ๊ณผ ๋ฉ€๋ฏธ๊ฐ์„ ๋А๋ผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์›๊ฒฉ ์†”๋ฃจ์…˜๋“ค์€ ์ค‘์•™ ์ค‘๊ณ„ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜๋Š” TCP ๊ธฐ๋ฐ˜ ์†Œ์ผ“ ํ†ต์‹ ์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ท ์†์‹ค ์‹œ ์žฌ์ „์†ก ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ์ธํ•ด ํ™”๋ฉด ๋Š๊น€ ํ˜„์ƒ์ด ๋นˆ๋ฒˆํ–ˆ์Šต๋‹ˆ๋‹ค. KODARI๋Š” WebRTC(Web Real-Time Communication)์™€ WebSocket ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฉ”์‹œ์ง• ํŒŒ์ดํ”„๋ผ์ธ์„ ์ฑ„ํƒํ•˜์—ฌ ์ „ ์„ธ๊ณ„ ์–ด๋””์„œ๋‚˜ 100ms ๋ฏธ๋งŒ์˜ ์‹ค์‹œ๊ฐ„ 60FPS ๋ฌด์„  ์›๊ฒฉ ์ œ์–ด๋ฅผ ์‹คํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

2. KODARI ํ•˜์ด๋ธŒ๋ฆฌ๋“œ 3๊ณ„์ธต ์ŠคํŠธ๋ฆฌ๋ฐ ์•„ํ‚คํ…์ฒ˜

  1. ์‹œ๊ทธ๋„๋ง ๋ ˆ์ด์–ด (Signaling Layer - WebSocket): ์กฐ์ž‘์ž ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ํ”ผ์ œ์–ด ์•ˆ๋“œ๋กœ์ด๋“œ ๋‹จ๋ง ๊ฐ„์— SDP(Session Description Protocol) ์˜คํผ์™€ ์•ค์„œ, ICE Candidate ํŒจํ‚ท์„ 10ms ๋‹จ์œ„๋กœ ์ดˆ๊ณ ์† ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฏธ๋””์–ด ๋ฏธ๋Ÿฌ๋ง ๋ ˆ์ด์–ด (Media Streaming - WebRTC UDP): H.264 / VP8 ํ•˜๋“œ์›จ์–ด ์ธ์ฝ”๋”๋ฅผ ๊ฐ€๋™ํ•˜์—ฌ ์•ˆ๋“œ๋กœ์ด๋“œ ํ™”๋ฉด ํ”„๋ ˆ์ž„์„ ์••์ถ•ํ•œ ํ›„, P2P DTLS/SRTP ์•”ํ˜ธํ™” ํ„ฐ๋„์„ ํ†ตํ•ด ์ƒ๋Œ€๋ฐฉ ํ™”๋ฉด์œผ๋กœ ๋‹ค์ด๋ ‰ํŠธ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท ์†์‹ค ์‹œ์—๋„ ์ง€์—ฐ์„ ์œ ๋ฐœํ•˜๋Š” TCP ์žฌ์ „์†ก ๋Œ€์‹  ์œ ์—ฐํ•œ ํ”„๋ ˆ์ž„ ์Šคํ‚ต ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜์—ฌ ํ•ญ์ƒ ์‹ค์‹œ๊ฐ„ ๋ผ์ด๋ธŒ ํ™”๋ฉด์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ„ฐ์น˜ ์ฃผ์ž… ๋ ˆ์ด์–ด (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 ๋‚ด๋ถ€๋กœ ์™„์ „ ์€๋‹‰ํ•˜์—ฌ, ๊ธˆ์œต ์•ฑ, ์ด์ปค๋จธ์Šค ์•ฑ, ์‹ค๋ฒ„ ํ—ฌ์Šค์ผ€์–ด ์•ฑ ๊ฐœ๋ฐœํŒ€์ด ๋‹จ ํ•˜๋ฃจ ๋งŒ์— ์ธ์•ฑ ์›๊ฒฉ ๊ณ ๊ฐ์ง€์› ๊ธฐ๋Šฅ์„ ๋Ÿฐ์นญํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ•๋ ฅํ•œ ์ƒ์‚ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.