Skip to content

๐Ÿ“„์—๋ŸฌํŽ˜์ด์ง€ ๋‹ค๋ฃจ๊ธฐ

Changhyun-Hong edited this page Dec 5, 2024 · 1 revision

์—๋ŸฌํŽ˜์ด์ง€ ๋„์ž…๋ฐฐ๊ฒฝ

ํŠน์ • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—๋Ÿฌ์‹œ์— ๋ถ€๋ชจ๋กœ ์—๋Ÿฌ์ฒ˜๋ฆฌ์˜ ์—ญํ• ์„ ์œ„์ž„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ ๊ธฐ์กด์˜ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ํŽ˜์ด์ง€ ์ „์ฒด๊ฐ€ ์—๋Ÿฌ๋ฅผ ๋‹ค๋ค„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

  • ์ž˜๋ชป๋œ ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ
  • ์ž˜๋ชป๋œ 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๋ฅผ ์ถ”์ถœํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค.

image

์—ฌ๊ธฐ์„œ ID๊ฐ€ ์ž˜๋ชป๋˜๋Š” ๊ฒฝ์šฐ์— ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ• ์ง€ ๊ณ ๋ฏผํ–ˆ๋‹ค.

  • ๋น„๋””์˜ค๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ถ€๋ถ„๋งŒ AsyncBoundary๋กœ ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ
  • ์—๋ŸฌํŽ˜์ด์ง€๋กœ navigateํ•˜๊ธฐ

๊ฒฐ๋ก ์ ์œผ๋กœ ์—๋ŸฌํŽ˜์ด์ง€๋กœ navigateํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒ

  • ๋น„๋””์˜ค๋ถ€๋ฌธ๋งŒ ์—๋Ÿฌ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ฃผ์†Œ ์ž์ฒด๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋ผ ํŒ๋‹จํ•˜์—ฌ ์—๋ŸฌํŽ˜์ด์ง€๋กœ ๋„˜๊ธฐ๋Š”๊ฒŒ ๋งž๋‹ค ํŒ๋‹จ

๋˜ํ•œ, ์ž˜๋ชป๋œ ID๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์น˜ํ•ด์˜ค๋Š”๋ฐ ์‹คํŒจํ–ˆ์ง€๋งŒ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋Š” ID๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒƒ ๋•Œ๋ฌธ์ด๋ฏ€๋กœ

ID๊ฐ€ ์œ ํšจํ•œ์ง€ API๋กœ ์ดˆ๊ธฐ ์ฒดํฌ๋ฅผ ํ•  ํ•„์š”์„ฑ์„ ๋А๊ผˆ๋‹ค.

๊ณ ์ฐจํ•จ์ˆ˜๋กœ ์œ ํšจํ•œ IDํŒŒ์•…ํ•˜๊ธฐ

  • 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ํ•˜๋Š” ๋กœ์ง๊ณผ ๋ Œ๋”๋ง ๋กœ์ง์„ ๋ถ„๋ฆฌ

LiBoo

ํŒ€

๊ณตํ†ต

๋ฏผ์ง€

์˜๊ธธ

์ค€์„œ

์ง€์ˆ˜

์ฐฝํ˜„

๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ

ํšŒ์˜๋ก

๋ฐœํ‘œ

์ผ๊ธฐ์žฅ

Clone this wiki locally