diff --git a/public/assets/PageError.png b/public/assets/PageError.png
new file mode 100644
index 00000000..8b332c7e
Binary files /dev/null and b/public/assets/PageError.png differ
diff --git a/public/assets/UnknownError.png b/public/assets/UnknownError.png
new file mode 100644
index 00000000..fdc6d156
Binary files /dev/null and b/public/assets/UnknownError.png differ
diff --git a/src/App.tsx b/src/App.tsx
index 95eaf21f..59f8eb5f 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,7 +1,9 @@
import { Outlet } from 'react-router-dom';
+import { ErrorBoundary } from '@suspensive/react';
import clsx from 'clsx';
import { useRouteData, useTheme } from '@/core/hooks';
import { Navbar } from './shared/Navbar';
+import { UnknownFallback } from './shared/ErrorBoundary';
import 'swiper/css';
import 'swiper/css/bundle';
@@ -16,11 +18,13 @@ const App = () => {
'bg-light-main': theme !== 'dark'
})}
>
-
-
-
+ }>
+
+
+
- {navBarRequired && }
+ {navBarRequired && }
+
);
};
diff --git a/src/main.tsx b/src/main.tsx
index 6197fc3e..a214f3c9 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -17,7 +17,15 @@ const setupMSW = async () => {
return worker.start();
};
-const queryClient = new QueryClient();
+const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: {
+ retry: 1,
+ refetchOnReconnect: false,
+ refetchOnWindowFocus: false
+ }
+ }
+});
setupMSW().then(() => {
ReactDOM.createRoot(document.getElementById('root')!).render(
diff --git a/src/pages/RoomSettingPage.tsx b/src/pages/RoomSettingPage.tsx
index 49002ea5..fdc03d74 100644
--- a/src/pages/RoomSettingPage.tsx
+++ b/src/pages/RoomSettingPage.tsx
@@ -1,6 +1,6 @@
import { Suspense } from 'react';
-import { ErrorBoundary } from '@suspensive/react';
import { useRouteData } from '@/core/hooks';
+import { QueryErrorBoundary, NetworkFallback } from '@/shared/ErrorBoundary';
import { Header } from '@/shared/Header';
import { Tab, TabItem } from '@/shared/Tab';
import { RoomTab, MemberTab, RemoveTab, LoadingFallback } from '@/RoomSetting';
@@ -13,7 +13,7 @@ const RoomSettingPage = () => {
<>
- Error Occured in RoomSettingPage!}>
+ }>
{
-
+
>
);
};
diff --git a/src/shared/ErrorBoundary/components/NetworkFallback.tsx b/src/shared/ErrorBoundary/components/NetworkFallback.tsx
new file mode 100644
index 00000000..c7d127c3
--- /dev/null
+++ b/src/shared/ErrorBoundary/components/NetworkFallback.tsx
@@ -0,0 +1,26 @@
+import { useErrorBoundaryFallbackProps } from '@suspensive/react';
+
+const NetworkFallback = () => {
+ const { reset } = useErrorBoundaryFallbackProps();
+
+ return (
+
+
+
오류 발생
+
+ 정보를 불러올 수 없어요.
+
+
+
+ );
+};
+
+export default NetworkFallback;
diff --git a/src/shared/ErrorBoundary/components/QueryErrorBoundary.tsx b/src/shared/ErrorBoundary/components/QueryErrorBoundary.tsx
new file mode 100644
index 00000000..c5a9ca64
--- /dev/null
+++ b/src/shared/ErrorBoundary/components/QueryErrorBoundary.tsx
@@ -0,0 +1,33 @@
+import { FunctionComponent, ReactNode, PropsWithChildren } from 'react';
+import { ErrorBoundary, ErrorBoundaryFallbackProps } from '@suspensive/react';
+import { useQueryErrorResetBoundary } from '@tanstack/react-query';
+
+interface QueryErrorBoundaryProps {
+ fallback:
+ | FunctionComponent>
+ | NonNullable;
+}
+
+/**
+ * QueryErrorBoundary를 래핑한 ErrorBoundary 컴포넌트입니다.
+ * 쿼리 에러가 발생했을 때, 쿼리를 리셋하는 함수를 담고 fallback을 렌더링합니다.
+ * @param fallback - 오류 발생 시 렌더링할 컴포넌트.
+ * @param children - 성공 시 렌더링할 컴포넌트.
+ */
+const QueryErrorBoundary = ({
+ fallback,
+ children
+}: PropsWithChildren) => {
+ const { reset } = useQueryErrorResetBoundary();
+
+ return (
+
+ {children}
+
+ );
+};
+
+export default QueryErrorBoundary;
diff --git a/src/shared/ErrorBoundary/components/UnknownFallback.tsx b/src/shared/ErrorBoundary/components/UnknownFallback.tsx
new file mode 100644
index 00000000..11d8c6e5
--- /dev/null
+++ b/src/shared/ErrorBoundary/components/UnknownFallback.tsx
@@ -0,0 +1,24 @@
+import { Link } from 'react-router-dom';
+
+const UnknownFallback = () => {
+ return (
+
+
+
오류 발생
+
+ 내부적인 문제로 오류가 발생했어요.
+
+
+ 홈으로
+
+
+ );
+};
+
+export default UnknownFallback;
diff --git a/src/shared/ErrorBoundary/index.ts b/src/shared/ErrorBoundary/index.ts
new file mode 100644
index 00000000..77ea07ee
--- /dev/null
+++ b/src/shared/ErrorBoundary/index.ts
@@ -0,0 +1,3 @@
+export { default as QueryErrorBoundary } from './components/QueryErrorBoundary';
+export { default as NetworkFallback } from './components/NetworkFallback';
+export { default as UnknownFallback } from './components/UnknownFallback';