-
Notifications
You must be signed in to change notification settings - Fork 4
๐์๋ฌํ์ด์ง ๋ค๋ฃจ๊ธฐ
ํน์ ์ปดํฌ๋ํธ๊ฐ ์๋ฌ์์ ๋ถ๋ชจ๋ก ์๋ฌ์ฒ๋ฆฌ์ ์ญํ ์ ์์ํ์ฌ ์ฒ๋ฆฌํ ๊ธฐ์กด์ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ํ์ด์ง ์ ์ฒด๊ฐ ์๋ฌ๋ฅผ ๋ค๋ค์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
- ์๋ชป๋ ์ฃผ์๋ก ์ ๊ทผํ๋ ๊ฒฝ์ฐ
- ์๋ชป๋ ID๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ
์๋ชป๋ ์ฃผ์๋ก ์ ๊ทผํ๋ ๊ฒฝ์ฐ
<Routes>
<Route path="/" element={<MainPage />} />
<Route path="/live/:id" element={<ClientPage />} />
<Route path="/replay/:id" element={<ReplayPage />} />
<Route path="/host" element={<HostPage />} />
<Route path="*" element={<ErrorPage />} />
</Routes>ํน์ ๋ผ์ฐํ ์ ์ ์ธํ ํ์ด์ง๋ ์๋ฌํ์ด์ง๋ก ๊ฐ๋๋ก ์ฒ๋ฆฌ
์๋ชป๋ ID๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ
ํ์ด์ง์์ ๋ฐ์ดํฐ๋ฅผ ํ์นญํด์ฌ ๋ useParam์ผ๋ก ID๋ฅผ ์ถ์ถํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ๊ฐ ์์๋ค.

์ฌ๊ธฐ์ ID๊ฐ ์๋ชป๋๋ ๊ฒฝ์ฐ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ฅผ ํด์ผํ ์ง ๊ณ ๋ฏผํ๋ค.
- ๋น๋์ค๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ถ๋ถ๋ง
AsyncBoundary๋ก ์๋ฌ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ - ์๋ฌํ์ด์ง๋ก
navigateํ๊ธฐ
๊ฒฐ๋ก ์ ์ผ๋ก ์๋ฌํ์ด์ง๋ก navigateํ๋ ๋ฐฉ๋ฒ์ ์ ํ
- ๋น๋์ค๋ถ๋ฌธ๋ง ์๋ฌ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋ ์ฃผ์ ์์ฒด๊ฐ ์๋ชป๋ ๊ฒ์ด๋ผ ํ๋จํ์ฌ ์๋ฌํ์ด์ง๋ก ๋๊ธฐ๋๊ฒ ๋ง๋ค ํ๋จ
๋ํ, ์๋ชป๋ ID๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ํ์นํด์ค๋๋ฐ ์คํจํ์ง๋ง ๊ทผ๋ณธ์ ์ธ ์ด์ ๋ ID๊ฐ ์ ํจํ์ง ์์ ๊ฒ ๋๋ฌธ์ด๋ฏ๋ก
ID๊ฐ ์ ํจํ์ง API๋ก ์ด๊ธฐ ์ฒดํฌ๋ฅผ ํ ํ์์ฑ์ ๋๊ผ๋ค.
-
useCheckLiveExistํ ์ ํตํด id๊ฐ ์ ํจํ์ง ํ์ธํ๊ณ ์ ํจํ์ง ์์ผ๋ฉด ์๋ฌํ์ด์ง๋กnavigate์ฒ๋ฆฌ -
withLiveExistCheck๋ผ๋ ๊ณ ์ฐจํจ์๋ฅผ ํตํดClientPage์ ๊ฐ์ ํ์ด์ง ์ ์ฒด๋ฅผ ๊ฐ์ธ๋๋ก ๊ตฌํ
export default function withLiveExistCheck<P extends object>(WrappedComponent: ComponentType<P>) {
return function WithLiveExistCheckComponent(props: P) {
const { id: liveId } = useParams();
const navigate = useNavigate();
const { data: isLiveExistData } = useCheckLiveExist({ liveId: liveId as string });
const isLiveExist = isLiveExistData?.existed;
useEffect(() => {
if (!isLiveExist) {
navigate('/error');
}
}, [isLiveExistData]);
return <WrappedComponent {...props} />;
};
}function ClientPageComponent() {
return (
<>
<Header />
<ClientContainer>
<AsyncBoundary pendingFallback={<></>} rejectedFallback={() => <PlayerStreamError />}>
<ClientView />
<ClientChatRoom />
</AsyncBoundary>
</ClientContainer>
</>
);
}
const ClientPage = withLiveExistCheck(ClientPageComponent);
export default ClientPage;์ ๊ณ ์ฐจํจ์๋ก ํ์ด์ง๋ฅผ ๊ฐ์ธ๋ ์ ํ์ ํ์๊น
-
ClientPage๋ฟ๋ง์๋๋ผReplayPage์์๋ ID๊ฒ์ฆ์ด ํ์ํด์ ์ค๋ณต ๋ก์ง์ ์ ๊ฑฐ - ์ญํ ๋ถ๋ฆฌ : Id๋ฅผ ๊ฒ์ฆํ์ฌ ์๋ฌํ์ด์ง๋ก
navigateํ๋ ๋ก์ง๊ณผ ๋ ๋๋ง ๋ก์ง์ ๋ถ๋ฆฌ
- ๐ ์น ์์ผ์ ์ค์๊ฐ ์๋ฐฉํฅ ํต์ (feat. WS vs Socket.io)
- ๐คธโโ๏ธ ๋น์ ์ด ์ปดํฌ๋ํธ๋ก ๋ ๋๋ง ์ต์ ํ ํ๊ธฐ
- ๐ทโโ๏ธ Shared Worker๋ก ํด๋ผ์ด์ธํธ์ ์์ผ ํต์ ๊ฐ์ ํ๊ธฐ
- ๐จโ๐ฉโ๐งโ๐ฆ ๋ค์ค ํญ์์ ํ๋์ ์์ผ์ ๊ณต์ ํ ์ ์์๊น?
- ๐ [Socket.io] ํด๋ผ์ด์ธํธ์ ์ค์๊ฐ ์ฑํ ๊ตฌํ๊ธฐ
- ๐ฌ ์๋ฒ๋ฅผ docker swarm ์ผ๋ก ๊ด๋ฆฌํด๋ณด์
- ๐ฌ ์ปจํ ์ด๋๋ผ๋ฆฌ env ๊ณต์ ํ๊ธฐ
- ํ์ฅ์ฑ์ ๊ณ ๋ คํ ์๋ฒ ์ค๊ณ
- ncp ์๋ฒ ์ ํ
- ์ฑํ ์๋ฒ์ Redis ๋ฅผ ์ด ์ด์
- โ NestJS๋ฅผ ํตํ ์ผ๊ด์ ์ธ ์์คํ ์ค๊ณ
โ๏ธ ์ธ๋ถ์ ์ฌ์ฉ์๊ฐ Object Storage์ ์ ๊ทผํ์ง ๋ชปํ๋ ๊ถํ ์ ์ด- ๐ฆข nestjs์์ swagger ์ฌ์ฉํด๋ณด๊ธฐ
- ๐ NestJS Nginx Request Data Size ๋ฌธ์
- ๐ ๋ค์๋ณด๊ธฐ๋ฅผ ์ํ NodeโMediaโServer, FFMpeg ๋ถ์
- ๐ฆ ํจํค์ง ๋งค๋์ ๋ฐ ๋ชจ๋ ธ๋ ํฌ ์ ํ๊ธฐ
- ๐ฐ ์ปค์คํ ESLint ๋ง๋ค๊ธฐ
- ๐คบ ์ปค์คํ react ์ค๋ํซ ๋ง๋ค๊ธฐ
- ๐ธ ๋ฐ์ํ ๋น๋์ค ํ๋ ์ด์ด ๊ตฌํ: ํจ๋ฉ ํ ๊ธฐ๋ฒ
- ๋ฆฌ์กํธ ํ ํผ ๋ฅ๋ค์ด๋ธ