*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์ด ํธ์ถ๋๋๋ก ํ์์ต๋๋ค.
'๐ป์น(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 |