๐Ÿ’ป์›น(Web)

[๊ณตํ†ตํ”„๋กœ์ ํŠธ]5์ฃผ์ฐจ: React Openvidu ๊ตฌํ˜„

stonesy 2024. 8. 11. 15:09
728x90

*Openvidu v2 ๊ธฐ์ค€

๐Ÿ“ŒOpenvidu์˜ ๊ตฌ์„ฑ์š”์†Œ

Openvidu์˜ ๊ตฌ์„ฑ์š”์†Œ๋Š” ํฌ๊ฒŒ Openvidu Server, Application Server(BE), Application Client(FE)๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Openvidu Server: ์‹ค์‹œ๊ฐ„ ์˜ค๋””์˜ค ๋ฐ ๋น„๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ธํ”„๋ผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ํ™”์ƒํšŒ์˜ ์„œ๋น„์Šค ๊ฐœ๋ฐœ์„ ์œ„ํ•ด์„œ ๋‹จ์ˆœํžˆ ๋ฐฐํฌ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.
  • Application Server(BE): client์˜ ์š”์ฒญ์— ๋”ฐ๋ผ openvidu server์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. Openvidu Server์—์„œ ์ œ๊ณตํ•˜๋Š” REST API๋ฅผ ํ†ตํ•ด์„œ Openvidu Server์™€ ํ†ต์‹ ํ•œ๋‹ค.
  • Application Client(FE): ์‚ฌ์šฉ์ž์™€ ์ง์ ‘ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, Openvidu library๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋””์˜ค ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

 

๐Ÿ“ŒSFU

webRTC์˜ ์—ฐ๊ฒฐ๋ฐฉ์‹์—๋Š” Mesh, MCU, SFU ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค. Openvidu๋Š” ์ด ์ค‘ SFU ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. SFU ๋ฐฉ์‹์—์„œ ๊ฐ peer๋Š” Server์—๊ฒŒ๋งŒ ์ž์‹ ์˜ stream์„ ๋ณด๋‚ด๋ฉฐ, ์„œ๋ฒ„๋Š” ํ•ด๋‹น stream์„ ๋‹ค๋ฅธ client๋“ค์—๊ฒŒ ๋ณด๋‚ธ๋Œœ. (1๊ฐœ์˜ uplink์™€ N-1๊ฐœ์— ํ•ด๋‹นํ•˜๋Š” downlink)

 

๐Ÿ“ŒOpenvidu with React

openvidu-react - OpenVidu Docs

 

1.์˜์กด์„ฑ ์„ค์น˜

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Openvidu library๋ฅผ ์ด์šฉํ•ด์„œ ๋น„๋””์˜ค ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ด€๋ จ๋œ library๋ฅผ ๋จผ์ € ์„ค์น˜ํ•œ๋‹ค.

npm i openvidu-browser

 

 

2.์„ธ์…˜ ์ƒ์„ฑ

  • Session → ํ™”์ƒํšŒ์˜ ๋ฐฉ
  • Connection → ๊ฐ ์ฐธ๊ฐ€์ž
  • Stream → ์ฐธ๊ฐ€์ž ๊ฐ„์˜ ์—ฐ๊ฒฐ
  • Token → ํ™”์ƒํšŒ์˜ ๋ฐฉ์— ์ž…์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•จ

๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค๊ณผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ€์žฅ ๋จผ์ € Session์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. Session์ด๋ž‘ ํ™”์ƒํšŒ์˜ ๋ฐฉ๊ณผ ๊ฐ™์€ ๊ฐœ๋…์ด๋‹ค. ํ™”์ƒํšŒ์˜ ๋ฐฉ์ด ๋จผ์ € ์ƒ์„ฑ๋˜์–ด์•ผ ์ฐธ๊ฐ€์ž๋“ค์ด ์ž…์žฅํ•  ์ˆ˜ ์žˆ๋‹ค~ ์ •๋„๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฅผ ์œ„ํ•ด FE์—์„œ๋Š” BE์— session ์ƒ์„ฑ์„ ์œ„ํ•œ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

 

3. Token ๋ฐœ๊ธ‰

ํ™”์ƒํšŒ์˜ ๋ฐฉ์ด ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋ฉด ์ด์ œ ์ฐธ๊ฐ€์ž๊ฐ€ ํ™”์ƒํšŒ์˜ ๋ฐฉ์— ์ž…์žฅํ•ด์•ผ ํ•œ๋‹ค. Openvidu์—์„œ๋Š” session(ํ™”์ƒํšŒ์˜ ๋ฐฉ) ์ž…์žฅ์„ ์œ„ํ•ด์„œ token ๋ฐœ๊ธ‰์„ ํ•„์š”๋กœ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด FE์—์„œ BE์— token ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•˜๊ณ  BE์—์„œ token์„ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค. ์ด์ œ ์ด token์„ ์ด์šฉํ•ด์„œ ์—ฐ๊ฒฐ์„ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. ์—ฐ๊ฒฐ ํ˜•์„ฑ

์—ฐ๊ฒฐ์„ ํ˜•์„ฑํ•  ๋•Œ Openvidu v2๋ฅผ ๊ธฐ์ค€์œผ๋กœ Publish์™€ Subscriber์˜ ๊ฐœ๋…์ด ๋‚˜์˜จ๋‹ค. ๋‚˜๋Š” Publish๋Š” ์ž์‹ ์˜ ์˜์ƒ์˜ uplink๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๊ณ , Subscribe๋Š” downlink๋“ค์„ ๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค.

์ฐธ๊ฐ€์ž A๊ฐ€ ์ฐธ๊ฐ€์ž B, ์ฐธ๊ฐ€์ž C๊ฐ€ ์žˆ๋Š” ํ™”์ƒํšŒ์˜ ๋ฐฉ์— ์ž…์žฅํ•œ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž.

์ฐธ๊ฐ€์ž A๊ฐ€ ์ž์‹ ์˜ stream์„ publish(๋ฐœํ–‰)ํ•œ๋‹ค.

→ ์ฐธ๊ฐ€์ž B์™€ ์ฐธ๊ฐ€์ž C: ์ด๋ฏธ ํ™”์ƒํšŒ์˜ ๋ฐฉ์— ์ฐธ์—ฌ ์ค‘์ด๋˜ ์ฐธ๊ฐ€์ž B์™€ ์ฐธ๊ฐ€์ž C๋Š” ์ƒˆ๋กœ์šด downlink๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋˜๊ณ , ์ฐธ๊ฐ€์ž A์˜ stream์„ Subscribe(๊ตฌ๋…)ํ•œ๋‹ค.

→ ์ฐธ๊ฐ€์ž A: ์ฐธ๊ฐ€์ž A ๋˜ํ•œ Openvidu Server๋กœ๋ถ€ํ„ฐ ์ฐธ๊ฐ€์ž B, ์ฐธ๊ฐ€์ž C์˜ downlink๋ฅผ ์ „๋‹ฌ๋ฐ›๊ฒŒ ๋˜๊ณ  ์ด๋“ค์˜ stream์„ Subscribe(๊ตฌ๋…)ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฐ๊ฒฐ์„ ํ˜•์„ฑํ•˜๋Š” ๋‹จ๊ณ„(session ์ƒ์„ฑ)์—์„œ ๋‚ด ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ custom(์ฑ„ํŒ… ๋“ฑ๋“ฑ)์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. session ์ƒ์„ฑ์‹œ event๋ฅผ ์ˆ˜์‹ ํ–ˆ์„ ๋•Œ ๋กœ์ง์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

var mySession = this.state.session;

// --- 3) Specify the actions when events take place in the session ---

// On every new Stream received...
mySession.on('streamCreated', (event) => {
    // Subscribe to the Stream to receive it. Second parameter is undefined
    // so OpenVidu doesn't create an HTML video by its own
    var subscriber = mySession.subscribe(event.stream, undefined);

    //We use an auxiliar array to push the new stream
    var subscribers = this.state.subscribers;

    subscribers.push(subscriber);

    // Update the state with the new subscribers
    this.setState({
        subscribers: subscribers,
    });
});

    // On every Stream destroyed...
mySession.on('streamDestroyed', (event) => {
    event.preventDefault();

    // Remove the stream from 'subscribers' array
    this.deleteSubscriber(event.stream.streamManager);
});

// On every asynchronous exception...
mySession.on('exception', (exception) => {
    console.warn(exception);
});

// See next step

 

 

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์ฑ„ํŒ… ๊ธฐ๋Šฅ์ด ์žˆ์—ˆ๋Š”๋ฐ Openvidu ๋‚ด์˜ ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ–ˆ๋‹ค. ์ฑ„ํŒ… ์ด๋ฒคํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ , ์„ธ์…˜ ์ƒ์„ฑ ๋‹จ๊ณ„์—์„œ ์ฑ„ํŒ… ์ด๋ฒคํŠธ ์ˆ˜์‹  ๋กœ์ง์„ ๋‹ฌ์•„์ฃผ๋ฉด ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠนํžˆ text messages์™€ ๊ด€๋ จํ•ด์„œ target๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , message์˜ type์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์–ด ์ด๋ฅผ ํ™œ์šฉํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค.

  • ๊ฐ•์‚ฌ๊ฐ€ ํƒ€์ด๋จธ๋ฅผ ์กฐ์ž‘ํ•˜๋ฉด ์ˆ˜๊ฐ•์ƒ๋“ค์˜ ํƒ€์ด๋จธ๊ฐ€ ์„ค์ •๋˜์–ด ๋Œ์•„๊ฐ„๋‹ค.
  • ์ˆ˜๊ฐ•์ƒ์ด ๋„์™€์ฃผ์„ธ์š”/์™„๋ฃŒํ–ˆ์–ด์š”๋ฅผ ํ‘œ์‹œํ•˜๋ฉด ๊ฐ•์‚ฌ๊ฐ€ ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ•์‚ฌ๊ฐ€ ๋‹ค์Œ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋ฉด ์ˆ˜๊ฐ•์ƒ์ด progress bar๋ฅผ ํ†ตํ•ด์„œ ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฑ„ํŒ…์‹œ ์ฐธ์—ฌ์ž ๋ชจ๋‘์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์ฑ„ํŒ…๊ณผ ํŠน์ • ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์ „๋‹ฌ๋˜๋Š” private ์ฑ„ํŒ…์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Send text messages - OpenVidu Docs

 

5. ์—ฐ๊ฒฐ ์ข…๋ฃŒ

์ฐธ๊ฐ€์ž๊ฐ€ ํ™”์ƒํšŒ์˜ ๋ฐฉ์—์„œ ๋‚˜๊ฐ€๋ฉด ์„ธ์…˜์ด ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด session ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ leaveSession์ด ํ˜ธ์ถœ๋˜์–ด ์—ฐ๊ฒฐ์„ ๋Š๊ณ  ์ฐธ๊ฐ€์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค.

useEffect(()=>{
   return () => {
     leaveSession();
   };
},[session]);

const leaveSession = async() => {
    if (session) {
      session.disconnect();
    }
}

์‚ฌ์‹ค ์ด๊ฒŒ ์ œ๋Œ€๋กœ ๊ตฌํ˜„์ด ์•ˆ๋˜์„œ 3์‹œ๊ฐ„์ •๋„๋ฅผ ๋‚ ๋ ธ๋‹ค.

 

๊ธฐ์กด ์ฝ”๋“œ

๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š” ์ž๊พธ session์ด ์†Œ๋ฉธ๋˜๊ณ , leaveSession์ด ํ˜ธ์ถœ๋˜์–ด ์ฐธ๊ฐ€์ž์˜ ์—ฐ๊ฒฐ์ด ์ œ๋Œ€๋กœ ๋Š์–ด์ง€์ง€๋ฅผ ์•Š์•˜๋‹ค.

useEffect(()=>{
   return () => {
     leaveSession();
   };
},[]);

 

๋ณ€๊ฒฝ ์ฝ”๋“œ

๋ณ€๊ฒฝ ์ฝ”๋“œ์—์„œ๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์— session์„ ๋„ฃ์–ด์คฌ๋‹ค. ์‚ฌ์‹ค ์ƒ๊ฐํ•ด๋ณด๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋‚˜๊ฐ€์„œ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount๋  ๋•Œ leaveSession์ด ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, session์ด ์‚ฌ๋ผ์งˆ ๋•Œ leaveSession์ด ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, session์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด์˜ session์„ ์ •๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

useEffect(()=>{
   return () => {
     leaveSession();
   };
},[session]);

 

 

๐Ÿ“Œํ™”์ƒํšŒ์˜

  • Openvidu v2๋ฅผ ํ™œ์šฉํ•ด์„œ ํ™”์ƒํšŒ์˜, ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ

  • session ์ข…๋ฃŒ: ์˜์กด์„ฑ ๋ฐฐ์—ด์— session์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฐธ๊ฐ€์ž๊ฐ€ ํ™”์ƒํšŒ์˜ ๋ฐฉ์—์„œ ๋‚˜๊ฐˆ ๋•Œ leaveSession์ด ํ˜ธ์ถœ๋˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
728x90

'๐Ÿ’ป์›น(Web)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

JSP(Jakarta Server Pages)  (0) 2024.12.01
Servlet  (0) 2024.12.01
[React]์ดˆ๊ธฐ์„ธํŒ…  (0) 2024.07.18
MVC, MVVM, Flux ํŒจํ„ด  (1) 2024.07.15
[React]React Router  (0) 2024.06.28