์น๊ตฌ๋ค๊ณผ ์๊ท๋ชจ ํ์์ฑํ
์ ์ํ ์๋ฐํ ๊ณต๊ฐ!
๋ฉ๋ฆฌ์ฌ๋ ์น๊ตฌ๋ค๊ณผ ์ผ๊ตด๋ณด๊ณ ์ฌ๋ฏธ์๋ ์์์ด๋ ์ฌ์ง๋ณด๋ฉฐ ์๊ณ ๋ ๋ค๊ณ ์ถ์ด์ ๋ง๋ App
์ฝ๋ก๋๊ฐ ํ์ฐฝ ์ฌํ ๋ ์น๊ตฌ๋ค๊ณผ ๋ง๋์ง๋ ๋ชปํ๊ณ ์์ฌ์ด๋๋ก ์ค์ ์ด์ฉํ์ฌ ๋น๋๋ฉด ๋ง๋จ์ ๊ฐ์ง๊ฒฝํ์ ๋ฐํ์ผ๋ก ๊ฐ๋ฐ
์นํ์น๊ตฌ๋ผ๋ฆฌ ์๋ก ํ๋ฉด์ ์ผ๊ณ ์๋ค๋จ๊ณ ๊ฐ์ด ์ฌ๋ฏธ์๋ ์์์ ๋ณด๋ฉฐ ๋ ์ ์๋ ์ฐฝ๊ตฌ๋ฅผ ๋ง๋ จํ๊ณ ์ถ์ด ๋ง๋ค์ด๋ณด์์ต๋๋ค.
agora ๋ก๊ณ
๋๋ฌ๋ณด๊ธฐ Agora
ํด์ธ ์ ๋ช
์์
๋ฏธ๋์ด ClubHose ์์ ์ค์๊ฐ ์์ฑ์ฑํ
์ ์ํด ์ฌ์ฉ๋ ์๋น์ค
Agora์์๋ WebRtc ๊ธฐ๋ฐ ์ดํ๋ฆฌ์ผ์ด์
์ ์ข ๋ ๊ฐํธํ๊ฒ ๊ฐ๋ฐ ํ ์ ์๋๋ก ์์ฌ์ sdk๋ฅผ ์ ๊ณตํ๋ค.
์ค์๊ฐ ์์ ํตํ ์ฑ ๊ตฌํ์ ๊ณ ๋ฏผํ๋ ์ค ์๋ฒ์์ ํต์ ์ผ๋ก ์ ์ ๊ฐ ์๋ฐฉํฅ ํต์ ์ ํ๋ ๋ฐฉ์์ด ์๋ WebRtc ๊ธฐ์ ์ ๋ํด์ ํฅ๋ฏธ๊ฐ ์๊ฒผ๊ณ ์ด ๊ธฐ์ ์ ๊ณต๋ถํ๋ ์ค ์๊ฒ ๋ Agora์ rtc sdk๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋ค.
src
|__asset
| | videoChatIcon-96x96.png
|
|__ components
| | message -- ๋ฉ์ธ์ง ๋ด์ฉ๋ฌผ
| | messageCall -- agora Rtm event ๋ค๋ฃจ๋ ๊ณณ
| | privateRoute -- ์ ์ ๋ก๊ทธ์ธ ์ํ ๋ค๋ฃจ๋ ๊ณณ
| | roomForm -- lobby ์์์ room join & create๊ธฐ๋ฅ
| | roomInfo -- room ์ ๋ฐฉ์ ์ ๋ณด ํ์๋ถ๋ถ
| | roomList -- lobby์ ๋ด ๋ฐฉ ๋ฆฌ์คํธ ํ์
| | setting -- room ๋ฉ์ธ ์์ ๋ฐ๊พธ๋ ๊ธฐ๋ฅ
| | shareScreen -- ํ๋ฉด ๊ณต์ ๊ธฐ๋ฅ
| | signIn -- ๋ก๊ทธ์ธ ๊ธฐ๋ฅ
| | signUo -- ํ์๊ฐ์
๊ธฐ๋ฅ
| | videoCall -- agora Rtc event ๋ค๋ฃจ๋ ๊ณณ
| | videoControl -- ๋น๋์ค ์ปจํธ๋กค๋ฌ ๊ธฐ๋ฅ
| | videoPlayer -- ๊ฐ ๋น๋์ค UI
| | videos -- ์ ์ฒด ๋น๋์ค UI ์
ํ
|
|__ context
| | color.context.js -- ๋ฉ์ธ ์์ context
| | rtcContext.js
| | rtmContext.js
| | userContext.js
|
|__ pages -- react-router ๋ถ๋ถ
| | authentication
| | home
| | lobby
| | nav
| | room
|
|__ store -- redux & redux-saga ๋ถ๋ถ
| | room
| | rtc
| | rtm
| | user
| | rootReducer.js -- ๋ฆฌ๋์ ํตํฉ
| | rootSaga.js -- ์ฌ๊ฐ ํตํฉ
| | store.js -- redux store ์
ํ
(with redux-toolkit)
|
|__ UI -- ์ฌ์ฌ์ฉ UI component ๋ชจ์
| | button
| | formContainer
| | formInput
| | spinner
| | Icons.jsx -- mui ์์ด์ฝ
| | Theme.config.js -- styled-components ThemeProvider ๋ถ๋ถ
|
|__ utill
| | firebase -- firebase ์ด๊ธฐ config ์
ํ
& auth & fireStore ๋ถ๋ถ
| | reducer -- ์ก์
์์ฑ์
| | Agora.config.js -- agora rtc client ๊ธฐ๋ณธ ์
ํ
|
|__ App.js
|__ global.styles.js
|__ index.js
Local user ํ๋ฉด, Remote user ํ๋ฉด, Share ํ๋ฉด๊ณผ ๋ด, Local ์ฌ์ฉ์ ๊ทธ๋ฆฌ๊ณ remote์ฌ์ฉ์ ๋ฉ์ธ์ง์ ๋ฐ๋ฅธ ๋ค๋ฅธ UI ์ ์ฉ ๊ฐํธํ๋ฅผ ๊ณ ๋ คํ
๊ฐ ์ํฉ์ ๋ง๋ TYPE์ ์ง์ , prop์ผ๋ก ๋ค์ด์จ type์ ๋ง๋ style์ ๋ฐํํด์ฃผ๋ getType ์ฝ๋ ์ ์ฉ
VideoPlayer.jsx Code Snippet
export const VIDEO_TYPE_CLASS = {
base: "base",
local: "local",
share: "share",
small: "small",
};
const getVideoType = (VideoType = VIDEO_TYPE_CLASS.base, share) =>
({
[VIDEO_TYPE_CLASS.base]: share ? SmallVideoContainer : BaseVideoContainer,
[VIDEO_TYPE_CLASS.local]: LocalVideoContainer,
[VIDEO_TYPE_CLASS.share]: ShareVideoContainer,
[VIDEO_TYPE_CLASS.small]: SmallVideoContainer,
}[VideoType]);
function VideoPlayer({ rtcUser, track, videoType }) {
const CustomVideoContainer = getVideoType(videoType, share);
return (
<CustomVideoContainer>
{ video ์ฌ์์ ์ํ ์ฝ๋ }
</CustomVideoContainer>
);
}
export default VideoPlayer;
firebase/auth์ onAuthStateChanged ๊ด์ฐฐ์๋ฅผ ์ด์ฉ ์ ์ ์ ๋ก๊ทธ์ธ ๋ก๊ทธ์์ ์ํ๋ฅผ ๊ด๋ฆฌ
์ด๊ธฐ ๊ด์ฐฐ์ ์ฌ์ฉ๋ชจ์ต firebase.auth.js & userContext.js Code Snippet
// firebase.auth
export const onAuthStateChangedListener = (callback) => onAuthStateChanged(auth, callback);
// userContext
useEffect(() => {
const unsubscribe = onAuthStateChangedListener(async (user) => {
let userAuth = null;
if (user) {
const userSnapshot = await createUserDocumentFromAuth(user);
userAuth = { id: userSnapshot.id, ...userSnapshot.data() };
}
setCurrentUser(userAuth);
});
return unsubscribe;
}, []);
redux-saga ์ฌ์ฉ ํ ๋ชจ์ต firebase.auth.js Snippet
์ ์ auth ์ํ๊ด๋ฆฌ๋ฅผ ์ํด ์ ๋น๋๊ธฐ ํจ์๋ฅผ ํฉ์นจ
// firebase.auth
export const getCurrentUser = () => {
return new Promise((resolve, reject) => {
const unsubscribe = onAuthStateChanged(
auth,
(userAuth) => {
unsubscribe();
resolve(userAuth);
},
reject
);
});
};
-
Agora SDK ์ ๋ฐ์ดํธ์ ๋ฐ๋ฅธ ๊ฒฝ๊ณ ๋ฌธ์ด ๊ณ์ ๋ฐ์์ค์ ๋๋ค. ํ์ธ ์ค์ ์์ผ๋ ์๋ง ๋ฒ์ ์ ์ ๋ฐ์ดํธํ๊ณ ๊ทธ์๋ฐ๋ผ ์ฝ๋๋ฅผ ์์ ํด์ผํ ๊ฒ ๊ฐ์ต๋๋ค. (23.08)
-
Agora rtc SDK ์ ๋์ ํ์ ํตํ ์ง์์ธ์์ด ์ต๋ 17๋ช ์ผ๋ก ๋์ ์์ง๋ง ์ค์ 5๋ช ์ด์ ํตํ๋ฅผ ํ ๊ฒฐ๊ณผ ์๋๊ฐ ํ์ ํ ๋จ์ด์ง๋ ๊ฒ์ ๋๊ผ๋ค StackoverFlow์ Agora FAQ์ ๋ณด๋ฉด rtc v3 ์ดํ์์๋ 7๋ช ๋ฐ์ ์ธ์์ ์ถ์ฒํ๋ ๊ฒ์ผ๋ก ๋์ ์์ด ํ์ํตํ ์ธ์์ ๋๋ฆฌ๋ ๊ฒ์ ํ๋ค์ด๋ณด์ธ๋ค.
-
Agora ์์ฒด์ ์ธ ์ด์ ์ด์ธ์ room์ ์ ์ ๊ฐ ๋ค์ด์ฌ ๋๋ง๋ค Agora rtc๊ฐ ๋๋ฌด ๋ง์ด user publish & unpublish Event๋ฅผ ๋ฃ๊ณ ์์ด์ ์์ ์ค์ ์๋ค.
-
Join Room Error
์กด์ฌํ์ง ์๋ ๋ฐฉ id๋ฅผ ์ ๋ ฅํ๋ฉด ๋ฐฉ์ด ์กด์ฌํ์ง ์๋๋ค๋ ๋ฉํธ๊ฐ ๋์ค๊ณ ์๋ ๋ก๋น์ ์ํ๋ก ๋๋์๊ฐ์ผ ํ์ง๋ง ๋ก๋ฉ ํ๋ฉด์์ ๋์ด๊ฐ์ง ์๋ ์ค๋ฅ๋ฅผ ํ์ธํด์ ์์ ์๋ฃํ์ต๋๋ค. (22.10.12) -
Custom Room Error
lobby์์ ๊ฐ๋ณ๋ก ๋ฐฉ์ด๋ฆ์ ์ค์ ํ๋ ๊ธฐ๋ฅ์ด ์๋๋ฐ ์ฌ๊ธฐ์ ๋ฐฉ์ด๋ฆ์ ๋ฐ๊ฟ๋ lobby์ ์๋ ๋ชฉ๋ก์ ์ ์ฉ๋์ง ์๋ ์ค๋ฅ๋ฅผ ํ์ธํ๋ค.
์ด๋ฆ ์์ ์ user ์ปฌ๋ ์ ์์ myRooms ์ปฌ๋ ์ ์ ์ ์ฉ๋๋๋ฐ ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ๋ rooms ์ปฌ๋ ์ ์์ ๊ฐ์ ธ์์ ์๊ธด์ค๋ฅ์๊ณ ์์ ์๋ฃํ์ต๋๋ค. (22.10.24)
- ๊ธฐ์กด ๋ฐ์ํ ๋น๋์ค UI ๊ฐ์
- lobby์์ join๋ฒํผ ux ์์ & ์ ์ ์ room list ์ต์ ๋ฒ์ ์ผ๋ก fetch ํ ์ ์๋๋ก ๊ฐ์
- TypeScript๋ก ๋ณํํด์ ์ ์ ์ผ๋ก ํ์ ์ ๋ช ์ํ๊ณ ์ฌ๋ฌ ๋ณ์์ ํจ์์ ๋ชฉ์ ์ ๋ถ๋ช ํํ๊ธฐ
- ๋ฐฉ์ ์ฐธ์ฌํ ์ ์ ๋ค ์ด๋ฆ tag๋ฅผ video์ ๋ถ์ด๊ธฐ
- ์ ์ avatar ์ถ๊ฐ