[Feature/#274] 에러 처리 안전망 구축 (에러 페이지 + Error Boundary) - #280
Conversation
- Error.tsx: useRouteError 기반으로 개선, 404/일반 에러 분기 및 재시도·홈 이동 액션 추가 - NotFound.tsx: 404 전용 페이지 신규 생성 (이전 페이지·홈 이동 액션) - Router: path "*" 라우트 추가, errorElement 업데이트 - react-error-boundary 설치 및 ErrorBoundary 컴포넌트 추가 - MetricErrorFallback / ChartErrorFallback fallback UI 제작 - OverviewDashboard 각 섹션을 ErrorBoundary로 래핑하여 위젯 에러 격리
- Error, NotFound: h-full min-h-[70vh] → min-h-screen으로 교체하여 완전 중앙 정렬 - ComingSoonPlaceholder: 임의값 클래스를 Tailwind 토큰으로 통일
- KPI 섹션: ErrorBoundary를 카드 그리드·트래픽 차트 내부로 이동 - Budget 섹션: 예산 카드 헤더 유지, 차트 콘텐츠 영역에만 ErrorBoundary 적용 - OverviewDashboard에서 KPI·Budget 바깥 ErrorBoundary 제거 - ChartErrorFallback: flex-1 추가 및 배경 투명도 조정 - MetricErrorFallback: min-h-28 추가
|
Warning Review limit reached
Next review available in: 51 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthrough에러 레이아웃, 차트/지표 폴백, 라우팅 오류 페이지를 추가하고, Overview 대시보드의 여러 섹션을 ErrorBoundary로 감싸도록 바뀌었습니다. 라우터는 새 ErrorPage와 NotFound를 연결합니다. Changes에러 처리 및 폴백 UI
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant Router
participant ErrorPage
participant NotFound
participant ErrorLayout
Router->>ErrorPage: errorElement 렌더
ErrorPage->>ErrorLayout: 제목/설명/액션 전달
Router->>NotFound: path="*" 매칭
NotFound->>ErrorLayout: 404 문구와 이동 버튼 전달
sequenceDiagram
participant OverviewDashboard
participant ErrorBoundary
participant ChartErrorFallback
participant MetricErrorFallback
OverviewDashboard->>ErrorBoundary: 섹션 렌더링 래핑
ErrorBoundary->>ChartErrorFallback: 차트 오류 fallback 표시
ErrorBoundary->>MetricErrorFallback: KPI 오류 fallback 표시
Possibly related issues
Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
📚 Storybook 배포 완료
|
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (7)
src/components/common/error/ChartErrorFallback.tsx (1)
9-32: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winChartErrorFallback / MetricErrorFallback 구조 중복
두 컴포넌트가 아이콘 + 제목/설명 + 재시도 버튼이라는 동일한 레이아웃을 거의 그대로 복사해서 쓰고 있습니다(컨테이너 클래스, 아이콘 크기, 텍스트만 다름). 앞으로 폴백 UI 종류가 늘어날 걸 감안하면 공통
BaseErrorFallback같은 컴포넌트로 추출해서 title/description/icon size 같은 props만 바꿔 쓰는 게 중복 관리 부담을 줄일 수 있습니다.♻️ 예시 리팩터 방향
// src/components/common/error/BaseErrorFallback.tsx type Props = FallbackProps & { title: string; description: string; containerClassName: string; iconClassName: string; }; export const BaseErrorFallback = memo(function BaseErrorFallback({ resetErrorBoundary, title, description, containerClassName, iconClassName, }: Props) { return ( <div role="alert" className={containerClassName}> <WarnCircleIcon className={iconClassName} aria-hidden="true" /> <div className="flex flex-col gap-1"> <p className="font-body1 text-text-title">{title}</p> <p className="font-body2 text-text-muted">{description}</p> </div> <Button variant="outline" size="small" onClick={resetErrorBoundary}> 다시 시도 </Button> </div> ); });🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/components/common/error/ChartErrorFallback.tsx` around lines 9 - 32, ChartErrorFallback and MetricErrorFallback duplicate the same error-fallback layout, so extract the shared UI into a reusable BaseErrorFallback component and pass only the varying pieces as props. Move the common container, WarnCircleIcon, title/description block, and resetErrorBoundary button logic into BaseErrorFallback, then update ChartErrorFallback to render it with its chart-specific text and classes. Keep the existing memo/FallbackProps pattern in the new shared component so both fallbacks can reuse it cleanly.src/pages/dashboard/overview/OverviewDashboard.tsx (1)
69-84: 🧹 Nitpick | 🔵 Trivial참고: 캐치된 에러 로깅(onError)도 고려해보세요.
지금은
FallbackComponent만 지정되어 있어 렌더 에러가 콘솔 외에는 어디에도 기록되지 않습니다. 대시보드 전반에 걸쳐ErrorBoundary를 도입하는 김에,onError로 모니터링 서비스에 로깅하는 방안을 함께 검토하면 운영 시 장애 파악에 도움이 될 것 같습니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/pages/dashboard/overview/OverviewDashboard.tsx` around lines 69 - 84, The OverviewDashboard ErrorBoundary setup only provides ChartErrorFallback, so caught render errors are not being recorded anywhere beyond the default console output. Update the ErrorBoundary usages around OverviewPlatformSection and DashboardAiSummarySection to include an onError handler, and route the caught error plus context into your monitoring/logging path. Use the existing ErrorBoundary, ChartErrorFallback, OverviewPlatformSection, and DashboardAiSummarySection symbols to place the logging alongside the fallback configuration.src/pages/dashboard/overview/sections/OverviewKpiSection.tsx (1)
38-58: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low valueKPI ErrorBoundary에
resetKeys를 추가해 자동 복구를 열어두면 좋겠습니다.
kpis가 새로 들어오면 경계가 함께 리셋되도록resetKeys={[kpis]}를 붙여두면, 데이터 갱신 뒤에도 렌더 에러 상태가 덜 오래 남습니다. 지금도 수동 재시도는 가능하지만, 자동 복구까지 기대한다면 이쪽이 더 안전합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/pages/dashboard/overview/sections/OverviewKpiSection.tsx` around lines 38 - 58, The KPI ErrorBoundary currently has no automatic reset when the underlying data changes, so a previous render error can linger after new KPI data arrives. Update the ErrorBoundary in OverviewKpiSection to include resetKeys tied to the kpis value so it reinitializes when fresh data is loaded. Keep the change local to the ErrorBoundary usage around MetricErrorFallback and the KPI rendering block.Source: Path instructions
src/pages/common/Error.tsx (3)
47-48: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
role="alert"가 전체 페이지 콘텐츠(버튼 포함)에 적용됨.
role="alert"는 일반적으로 짧은 알림용 live region에 쓰이며, 스크린리더가 즉시 전체 내용을 읽어버립니다. 헤딩·설명·버튼을 포함한 풀페이지 콘텐츠 전체에 적용하면 오히려 탐색성이 떨어질 수 있습니다.role="status"또는 role 제거를 고려해보세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/pages/common/Error.tsx` around lines 47 - 48, The Error page wrapper in Error should not use role="alert" for the full content block because it forces assistive tech to announce the entire page contents at once. Update the container in Error to either remove the role entirely or change it to a less intrusive live region like status, keeping the heading, description, and action buttons accessible without an assertive alert.Source: Path instructions
33-33: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueprops 없는 컴포넌트에
memo적용은 실효 없음.
ErrorPage는 라우터가 직접 렌더링하는 페이지 컴포넌트로 props를 받지 않으므로memo의 리렌더 방지 효과가 없습니다. 사소한 부분이라 급하진 않지만 제거해도 무방합니다.Also applies to: 105-105
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/pages/common/Error.tsx` at line 33, `ErrorPage`는 props를 받지 않는 라우터 페이지 컴포넌트라 `memo`의 최적화 효과가 없으므로, `ErrorPage` 선언에서 `memo` 래퍼를 제거하고 일반 함수 컴포넌트로 유지하세요. 함께 적용된 다른 `memo` 사용처도 같은 기준으로 확인해 불필요한 래핑을 정리하면 됩니다.
34-34: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win
useRouteError타입 캐스팅을 없애고isRouteErrorResponse로 분기해 주세요.
src/pages/common/Error.tsx는errorElement에서 쓰이므로, 실제 형태를 숨기는 캐스팅보다isRouteErrorResponse(error) && error.status === 404로 404를 판별하는 편이 더 명확합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/pages/common/Error.tsx` at line 34, Replace the `useRouteError` type cast in `Error` with explicit route-error handling: use `isRouteErrorResponse(error)` to detect route errors and branch on `error.status === 404` for the not-found case. Update the `Error` component in `src/pages/common/Error.tsx` so it checks the result of `useRouteError()` directly instead of hiding the shape behind a cast.Source: Path instructions
src/pages/common/NotFound.tsx (1)
76-83: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win
navigate(-1)은 히스토리가 없는 경우 예측 불가능한 동작을 할 수 있어요.사용자가 404 페이지에 딥링크로 직접 진입한 경우(북마크, 외부 링크 등) 앱 내 히스토리가 없어서
navigate(-1)이 앱 밖으로 이동하거나 아무 동작을 하지 않을 수 있습니다. 히스토리가 없을 때는 홈으로 폴백하는 게 안전합니다.💡 제안 수정
+import { useNavigate } from "react-router-dom"; +import { useCallback } from "react"; ... + const handleBack = useCallback(() => { + if (window.history.state?.idx > 0) { + navigate(-1); + } else { + navigate("/", { replace: true }); + } + }, [navigate]); ... - onClick={() => navigate(-1)} + onClick={handleBack}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/pages/common/NotFound.tsx` around lines 76 - 83, The NotFound page’s back button currently uses navigate(-1), which can behave unpredictably when there is no in-app history. Update the onClick handler in NotFound.tsx to check for a usable history entry and fall back to the home route when the user arrived directly via deep link or external link. Keep the change localized to the Button handler that calls navigate so the “이전 페이지로” action is safe in all cases.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/pages/common/Error.tsx`:
- Around line 1-31: `Error.tsx` is duplicating the same animation presets and
outer layout structure used in `NotFound.tsx`, so refactor the shared pieces
into a reusable abstraction. Extract `easeOut`, `containerVariants`, and
`itemVariants` into a common module (for example a shared error animation
preset) or move the repeated `motion.div` wrapper, icon, and text layout into an
`ErrorLayout` component. Then update `Error.tsx` to consume that shared code
instead of defining the same motion configuration inline.
In `@src/pages/dashboard/overview/OverviewDashboard.tsx`:
- Around line 69-77: The OverviewPlatformSection error boundary currently stays
stuck in ChartErrorFallback even after new rankings data arrives. Update the
ErrorBoundary around OverviewPlatformSection to include resetKeys tied to
roasRankingsData so it automatically resets when the data changes, allowing the
normal overview view to recover without relying only on the fallback’s retry
action.
In `@src/pages/dashboard/overview/sections/OverviewBudgetSection.tsx`:
- Around line 63-79: The OverviewBudgetSection ErrorBoundary is missing
resetKeys, so it may stay in the fallback state even after new budget data
arrives. Update the ErrorBoundary wrapper around ChartErrorFallback in
OverviewBudgetSection to pass resetKeys={[budget]} so the boundary automatically
resets when the budget prop changes and the chart can recover without manual
retry.
---
Nitpick comments:
In `@src/components/common/error/ChartErrorFallback.tsx`:
- Around line 9-32: ChartErrorFallback and MetricErrorFallback duplicate the
same error-fallback layout, so extract the shared UI into a reusable
BaseErrorFallback component and pass only the varying pieces as props. Move the
common container, WarnCircleIcon, title/description block, and
resetErrorBoundary button logic into BaseErrorFallback, then update
ChartErrorFallback to render it with its chart-specific text and classes. Keep
the existing memo/FallbackProps pattern in the new shared component so both
fallbacks can reuse it cleanly.
In `@src/pages/common/Error.tsx`:
- Around line 47-48: The Error page wrapper in Error should not use role="alert"
for the full content block because it forces assistive tech to announce the
entire page contents at once. Update the container in Error to either remove the
role entirely or change it to a less intrusive live region like status, keeping
the heading, description, and action buttons accessible without an assertive
alert.
- Line 33: `ErrorPage`는 props를 받지 않는 라우터 페이지 컴포넌트라 `memo`의 최적화 효과가 없으므로,
`ErrorPage` 선언에서 `memo` 래퍼를 제거하고 일반 함수 컴포넌트로 유지하세요. 함께 적용된 다른 `memo` 사용처도 같은
기준으로 확인해 불필요한 래핑을 정리하면 됩니다.
- Line 34: Replace the `useRouteError` type cast in `Error` with explicit
route-error handling: use `isRouteErrorResponse(error)` to detect route errors
and branch on `error.status === 404` for the not-found case. Update the `Error`
component in `src/pages/common/Error.tsx` so it checks the result of
`useRouteError()` directly instead of hiding the shape behind a cast.
In `@src/pages/common/NotFound.tsx`:
- Around line 76-83: The NotFound page’s back button currently uses
navigate(-1), which can behave unpredictably when there is no in-app history.
Update the onClick handler in NotFound.tsx to check for a usable history entry
and fall back to the home route when the user arrived directly via deep link or
external link. Keep the change localized to the Button handler that calls
navigate so the “이전 페이지로” action is safe in all cases.
In `@src/pages/dashboard/overview/OverviewDashboard.tsx`:
- Around line 69-84: The OverviewDashboard ErrorBoundary setup only provides
ChartErrorFallback, so caught render errors are not being recorded anywhere
beyond the default console output. Update the ErrorBoundary usages around
OverviewPlatformSection and DashboardAiSummarySection to include an onError
handler, and route the caught error plus context into your monitoring/logging
path. Use the existing ErrorBoundary, ChartErrorFallback,
OverviewPlatformSection, and DashboardAiSummarySection symbols to place the
logging alongside the fallback configuration.
In `@src/pages/dashboard/overview/sections/OverviewKpiSection.tsx`:
- Around line 38-58: The KPI ErrorBoundary currently has no automatic reset when
the underlying data changes, so a previous render error can linger after new KPI
data arrives. Update the ErrorBoundary in OverviewKpiSection to include
resetKeys tied to the kpis value so it reinitializes when fresh data is loaded.
Keep the change local to the ErrorBoundary usage around MetricErrorFallback and
the KPI rendering block.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: d2e8ccbe-86f3-4bc0-bc51-63301e68ecb0
⛔ Files ignored due to path filters (2)
package-lock.jsonis excluded by!**/package-lock.jsonand included by nonepackage.jsonis excluded by none and included by none
📒 Files selected for processing (12)
src/components/common/ComingSoonPlaceholder.tsxsrc/components/common/error/ChartErrorFallback.stories.tsxsrc/components/common/error/ChartErrorFallback.tsxsrc/components/common/error/ErrorBoundary.tsxsrc/components/common/error/MetricErrorFallback.stories.tsxsrc/components/common/error/MetricErrorFallback.tsxsrc/pages/common/Error.tsxsrc/pages/common/NotFound.tsxsrc/pages/dashboard/overview/OverviewDashboard.tsxsrc/pages/dashboard/overview/sections/OverviewBudgetSection.tsxsrc/pages/dashboard/overview/sections/OverviewKpiSection.tsxsrc/routes/Router.tsx
- src/lib/animation.ts: easeOut, containerVariants, itemVariants 공용 프리셋 분리
- ErrorLayout 컴포넌트 신규 생성: NotFound·Error 페이지의 공통 motion wrapper 통합
- OverviewPlatformSection ErrorBoundary에 resetKeys={[roasRankingsData]} 추가
- OverviewBudgetSection ErrorBoundary에 resetKeys={[budget]} 추가
- ErrorLayout: role="alert" → "status"로 교체, memo 제거 - Error.tsx: memo 제거, useRouteError 타입 캐스트 → isRouteErrorResponse 분기 - NotFound.tsx: memo 제거, navigate(-1) → history 길이 확인 후 안전한 fallback 추가 - OverviewDashboard: 두 ErrorBoundary에 onError 핸들러 추가해 렌더 에러 로깅
There was a problem hiding this comment.
🧹 Nitpick comments (3)
src/components/common/error/ErrorLayout.tsx (1)
17-25: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win에러 페이지 알림에
role="status"보다role="alert"가 더 적합해 보여요.
role="status"는 polite 라이브 리전이라 스크린리더가 다른 작업을 마친 뒤 조용히 알려주는데, 에러 페이지는 사용자에게 즉시 인지시켜야 하는 상황이라role="alert"(assertive)가 더 적절합니다. 접근성 관점에서 재검토 부탁드려요.As per path instructions,
src/**리뷰 시 "접근성: 시맨틱 HTML, ARIA 속성 사용 확인" 항목을 확인하도록 되어 있습니다.♻️ 제안
<motion.div className="flex w-full max-w-105 flex-col items-center rounded-4xl bg-surface-100 px-8 py-12 text-center shadow-Soft transition-ui-smooth tablet:px-6" - role="status" + role="alert"🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/components/common/error/ErrorLayout.tsx` around lines 17 - 25, The error page container in ErrorLayout currently uses role="status", but this should be changed to an assertive alert role so the message is announced immediately. Update the motion.div in ErrorLayout to use role="alert" and keep the rest of the accessible structure intact.Source: Path instructions
src/pages/common/NotFound.tsx (1)
21-26: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win
window.history.length체크만으론 "이전 페이지"가 실제로 우리 앱 내부인지 보장 못해요.외부 사이트에서 링크 타고 들어와 브라우저 히스토리가 이미 쌓여있는 경우,
navigate(-1)이 앱 밖으로 이동시킬 수 있습니다. 라우터 진입 시location.state에 플래그를 심어 "앱 내부에서 왔는지"를 판단하는 방식이 더 안전할 수 있어요. 다만 엣지 케이스라 지금 당장 블로커는 아닙니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/pages/common/NotFound.tsx` around lines 21 - 26, The back-navigation logic in NotFound uses window.history.length, which can send users outside the app; update the NotFound component’s onClick handler to rely on an app-internal marker from location.state instead. Have the route entry set a flag indicating the user came from inside the app, and in the navigate handler only call navigate(-1) when that flag is present; otherwise fall back to navigate("/", { replace: true }).src/pages/common/Error.tsx (1)
11-14: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win라우트 에러가 어디에도 로깅되지 않아요.
useRouteError()로 받은error값을 콘솔이나 모니터링 툴로 전송하는 코드가 없습니다. 운영 환경에서 실제 어떤 에러가 발생해 이 페이지가 떴는지 추적하기 어려울 수 있어요. 최소한console.error(error)정도는 남겨두는 게 좋을 것 같습니다.♻️ 제안
export default function ErrorPage() { const error = useRouteError(); const navigate = useNavigate(); const is404 = isRouteErrorResponse(error) && error.status === 404; + + if (!is404) { + console.error(error); + }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/pages/common/Error.tsx` around lines 11 - 14, The Error page currently reads the route error via useRouteError() but never logs it, so add error reporting in the Error component by capturing the value returned from useRouteError() and sending it to console.error or your monitoring hook before the 404 handling logic. Keep the existing is404 and navigate flow intact, and place the logging near the current error/navigate initialization so the actual failure is visible when this page renders.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@src/components/common/error/ErrorLayout.tsx`:
- Around line 17-25: The error page container in ErrorLayout currently uses
role="status", but this should be changed to an assertive alert role so the
message is announced immediately. Update the motion.div in ErrorLayout to use
role="alert" and keep the rest of the accessible structure intact.
In `@src/pages/common/Error.tsx`:
- Around line 11-14: The Error page currently reads the route error via
useRouteError() but never logs it, so add error reporting in the Error component
by capturing the value returned from useRouteError() and sending it to
console.error or your monitoring hook before the 404 handling logic. Keep the
existing is404 and navigate flow intact, and place the logging near the current
error/navigate initialization so the actual failure is visible when this page
renders.
In `@src/pages/common/NotFound.tsx`:
- Around line 21-26: The back-navigation logic in NotFound uses
window.history.length, which can send users outside the app; update the NotFound
component’s onClick handler to rely on an app-internal marker from
location.state instead. Have the route entry set a flag indicating the user came
from inside the app, and in the navigate handler only call navigate(-1) when
that flag is present; otherwise fall back to navigate("/", { replace: true }).
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 130ccb05-40fa-4c6c-9709-8e26769a4816
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml,!pnpm-lock.yamland included by none
📒 Files selected for processing (6)
src/components/common/error/ErrorLayout.tsxsrc/lib/animation.tssrc/pages/common/Error.tsxsrc/pages/common/NotFound.tsxsrc/pages/dashboard/overview/OverviewDashboard.tsxsrc/pages/dashboard/overview/sections/OverviewBudgetSection.tsx
✅ Files skipped from review due to trivial changes (1)
- src/lib/animation.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- src/pages/dashboard/overview/sections/OverviewBudgetSection.tsx
- src/pages/dashboard/overview/OverviewDashboard.tsx
🚨 관련 이슈
#274
✨ 변경사항
✏️ 작업 내용
1. 전역 에러 페이지
2. 컴포넌트 레벨 Error Boundary
3. 기타
스크린샷 참고
😅 미완성 작업
N/A
📢 논의 사항 및 참고 사항
이번 PR은 제 담당인 통합 대시보드(OverviewDashboard)에만 적용했습니다.
src/components/common/error/하위에 공용 컴포넌트로 준비되어 있으니, 플랫폼 대시보드 · 광고 관리 등 각 페이지 담당자가 동일한 패턴으로 적용해 주세요.Summary by CodeRabbit
New Features
Bug Fixes
Chores