jtwjs Dev Wiki
  • DEV_ROAD
    • πŸ’ͺ🏻 μƒμ‘΄ν•˜κΈ°
    • Week 1
      • 개발 ν™˜κ²½ μ„ΈνŒ…
      • νƒ€μž…μŠ€ν¬λ¦½νŠΈ
      • λ¦¬μ—‘νŠΈ
      • Testing Library
      • Parcel & ESLint
    • Week 2
      • JSX
      • Virtual DOM
    • Week 3
      • React Component
      • React State
    • Week 4
      • Express
      • Fetch API & CORS
      • React Hook
      • useRef & Custom Hook
    • Week 5
      • TDD
      • React Testing Library
      • MSW
      • Playwrite
      • Snapshot
    • Week 6
      • Separtion of Concerns
      • Principle
      • DI, (Dependency Injection)
      • Reflect-metadata
      • TSyringe
      • External Store
      • Follow Redux
      • usestore-ts
      • useSyncExternalStore
    • Week 7
      • Routing
      • Routes
      • Router
      • Navigation
    • Week 8
      • Design System
      • Style Basics
      • CSS-in-JS
      • Styled-Components
      • Global Style & Theme
    • Week 9
      • κ°œλ°œν•˜κΈ° μ „ μ€€λΉ„
      • μƒν’ˆ λͺ©λ‘ νŽ˜μ΄μ§€
      • μƒν’ˆ 상세 νŽ˜μ΄μ§€
      • μž₯λ°”κ΅¬λ‹ˆ νŽ˜μ΄μ§€
    • Week 10
      • 둜그인
      • λ‘œκ·Έμ•„μ›ƒ
      • νšŒμ›κ°€μž…
      • μ£Όλ¬Έ λͺ©λ‘ & μ£Όλ¬Έ 상세
    • Week 11
      • 배솑 정보 μž…λ ₯
      • ν¬νŠΈμ› 결제 μš”μ²­
      • 배솑 및 결제 정보 전달
    • Week 12
      • κ΄€λ¦¬μž μ›Ήμ‚¬μ΄νŠΈκ°œλ°œμ‹œμž‘
  • DEV_NOTE
    • TypeScript
      • 기본적 문법
        • Enum
        • λ‹€ν˜•μ„±
          • Untitled
        • ꡬ쑰적 타이핑
        • μ œλ„ˆλ¦­ νƒ€μž…
        • 컨디셔널 νƒ€μž…
        • ν•¨μˆ˜ λ©”μ„œλ“œ 타이핑
        • infer둜 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ μΆ”λ‘  직접 ν™œμš©
        • μž¬κ·€ νƒ€μž…
        • ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄ νƒ€μž…
        • 좔가적인 νƒ€μž… 검사 satisfies μ—°μ‚°μž
        • νƒ€μž…μŠ€ν¬λ¦½νŠΈ 건망증
        • μ›μ‹œ μžλ£Œν˜•μ—λ„ λΈŒλžœλ”© 기법 μ‚¬μš© κ°€λŠ₯
        • νƒ€μž… 쒁히기
        • μœ μš©ν•œ νƒ€μž… λ§Œλ“€κΈ°
        • λ°μ½”λ ˆμ΄ν„° ν•¨μˆ˜
        • μ•°λΉ„μ–ΈνŠΈ 선언도 μ„ μ–Έ 병합이 λœλ‹€.
        • μ•°λΉ„μ–ΈνŠΈ 선언도 선언병합이 λœλ‹€.
    • Testing
      • Unit Testing
      • λ‹¨μœ„ ν…ŒμŠ€νŠΈμ˜ 두 λΆ„νŒŒ
      • 쒋은 λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” 4λŒ€ μš”μ†Œ
      • ν…ŒμŠ€νŠΈ λŒ€μ—­κ³Ό 식별할 수 μžˆλŠ” λ™μž‘
      • λ‹¨μœ„ ν…ŒμŠ€νŠΈ μŠ€νƒ€μΌ
      • κ°€μΉ˜ μžˆλŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ λ¦¬νŒ©ν† λ§
      • 톡합 ν…ŒμŠ€νŠΈ
      • Cross Browsing Testing
      • κΈ°λŠ₯ ν…ŒμŠ€νŠΈ μ’…λ₯˜
      • React Testing Pattern
      • ν”„λ‘ νŠΈμ—”λ“œ ν…ŒμŠ€νŠΈ μž…λ¬Έ
        • ν…ŒμŠ€νŠΈ λ²”μœ„
        • λ‹¨μœ„ ν…ŒμŠ€νŠΈ 검증
        • Mock
        • UI μ»΄ν¬λ„ŒνŠΈ ν…ŒμŠ€νŠΈ
        • ν…ŒμŠ€νŠΈ 컀버리지
        • μ›Ή 톡합 ν…ŒμŠ€νŠΈ
        • MSW
        • μŠ€ν† λ¦¬λΆ
        • μ‹œκ°μ  νšŒκ·€ ν…ŒμŠ€νŠΈ
        • E2E ν…ŒμŠ€νŠΈ
        • Github Actions μ„€μ •
        • κΉƒν—ˆλΈŒ μ•‘μ…˜μ—μ„œ E2E
      • μ‹œν”„νŠΈ λ ˆν”„νŠΈ
        • ν…ŒμŠ€νŠΈ κΈ°λ³Έμ€‘μ˜ κΈ°λ³Έ
        • λ‹¨μœ„ ν…ŒμŠ€νŠΈ
        • μ½”λ“œ λ³΅μž‘λ„
        • λ¦¬νŒ©ν„°λ§
        • μ½”λ“œ 리뷰
        • 톡합 ν…ŒμŠ€νŠΈ νŒ¨ν„΄
        • μ‹œμŠ€ν…œ ν…ŒμŠ€νŠΈμ˜ μžλ™ν™”
        • 탐색적 ν…ŒμŠ€νŠΈ
      • Test Tip
      • vitest
      • playwright
      • Test Data Generator
      • MSW
    • Algorithm
      • coding test
      • Data Structure
    • Next.js
      • Data Fetching
      • Hydration
      • Next 13
      • Optimization
      • Next 15
    • Tailwind
      • Tailwind CSS
      • Theme
      • Directives
      • Tool
      • Design System
    • Storybook
      • Storybook
      • CSF3
      • CDD
      • Headless Component
    • Funtional Programming
      • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°
      • μ°Έμ‘° 투λͺ…μ„±
      • λΆ€μˆ˜νš¨κ³Ό
      • ν•¨μˆ˜ ν•©μ„±
      • μ œλ„ˆλ¦­ νƒ€μž… ν™œμš©ν•˜κΈ°
      • 암묡적 μž…μΆœλ ₯
      • μ•‘μ…˜κ³Ό 계산, 데이터
      • κ³„μΈ΅ν˜• 섀계
      • 호좜 κ·Έλž˜ν”„
      • ν•¨μˆ˜ν˜• 섀계
      • λΆˆλ³€μ„±
      • 일급 ν•¨μˆ˜
      • ν•¨μˆ˜ν˜• 도ꡬ
    • Git
      • Github Actions
      • Conflict
      • Branch μ „λž΅
    • Contents Format
      • Audio
    • 3D Graphic
      • 3D keyword
      • Three.js
      • Geometry
      • Material
      • Light
      • Camera
      • Decal
      • Rotation
      • Text
      • Shadow
      • Fog
      • Post Processing
      • Animation
      • Math
        • Vector Space
        • λ²‘ν„°μ˜ μ—°μ‚°
        • νšŒμ „ 계산
      • 3D 컨텐츠가 λ§Œλ“€μ–΄μ§€λŠ” κ³Όμ •
      • R3F
      • Env
      • Scene
      • Transform
      • R3F
      • Interaction & Raycast
      • Rendering Algorithnm
      • Blender
      • Blender
    • Accessibility
      • μ ‘κ·Όμ„±μ΄λž€
    • Interactive Web
      • Parallax
      • Canvas
      • requestAnimationFrame
      • Effect
      • HSL
      • React.js + Canvas
      • Matter.js
    • AWS
      • DevOps
      • Amplify
      • S3
      • ν΄λΌμš°λ“œ μ»΄ν“¨νŒ…
        • μ˜¨ν”„λ ˆλ―ΈμŠ€μ™€ ν΄λΌμš°λ“œ
        • ν΄λΌμš°λ“œ λ„μž…νš¨κ³Ό
        • ν΄λΌμš°λ“œ μ»΄ν“¨νŒ…μ˜ λ²”μœ„
        • μ»΄ν“¨νŒ… μ˜΅μ…˜
          • EC2 - Virtual Machin
          • ECS, EKS - Container
          • Lambda - Serverless
        • λ„€νŠΈμ›Œν¬ 가상화
        • μŠ€ν† λ¦¬μ§€
        • λ°μ΄ν„°λ² μ΄μŠ€
        • 데이터 μˆ˜μ§‘
        • λ¨Έμ‹  λŸ¬λ‹ μ˜μ—­
        • IoT μ˜μ—­
        • 블둝체인 μ˜μ—­
      • ν΄λΌμš°λ“œ μ•„ν‚€ν…μ²˜ 섀계
    • Network
      • Web Server & WAS
    • System Design
      • System Design
      • Component
      • μ˜μ‘΄μ„±μ„ λ°°μ œν•œ 개발
      • Error Handling
      • Architecture
        • λͺ¨λ…Έλ‘œν‹± μ•„ν‚€ν…μ²˜
        • Clean Architecture
        • Layered Architecture
        • 이벀트 기반 μ•„ν‚€ν…μ²˜
      • 상황을 νŒŒμ•…ν•˜λŠ” 메타인지
      • 쀑볡 문제 ν•΄κ²°ν•˜κΈ°
      • Monorepo Arhitecture
        • λͺ¨λ…Έλ ˆν¬ 운영과 νŠΈλŸ¬λΈ”μŠˆνŒ…
        • Module Federation
      • μ½”λ“œ 병λͺ©μ§€μ 
      • API λŒ€μ‘
      • 곡톡 μ½”λ“œ
      • Infra ꡬ좕
      • λͺ¨λ“ˆ 기반의 개발 방식
      • Design System
        • μ΅œμ†Œ μˆ˜μ€€μ˜ μ•„ν‚€ν…μ²˜ μ„€μ •
        • 더 효율적인 λ””μžμΈμ‹œμŠ€ν…œ λ§Œλ“€κΈ°
        • λ””μžμΈ μ‹œμŠ€ν…œκ³Ό UI 라이브러리 λͺ©μ 
        • λ””μžμΈ 토큰
      • 효율적인 업무
        • 업무 ν”„λ‘œμ„ΈμŠ€ 병λͺ© νŒŒμ•…
      • Clean Code
      • Design Pattern
        • CQRS Pattern
        • Strangler Fig Pattern
        • λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄
        • μ»€λ§¨λ“œ νŒ¨ν„΄
        • μ „λž΅ νŒ¨ν„΄
        • μ˜΅μ €λ²„ νŒ¨ν„΄
      • A/B ν…ŒμŠ€νŒ…
      • λŒ€κ·œλͺ¨ λ¦¬μ—‘νŠΈ μ›Ήμ•± 개발
        • λ³΅μž‘μ„± 관리
        • λͺ¨λ“ˆμ„±
        • μ„±λŠ₯
        • λ””μžμΈ μ‹œμŠ€ν…œ
        • 데이터 패칭
        • μƒνƒœ 관리
        • κ΅­μ œν™”
        • μ½”λ“œ μ‘°μ§ν™”ν•˜κΈ°
        • κ°œμΈν™” A/B ν…ŒμŠ€νŒ…
        • ν™•μž₯ κ°€λŠ₯ν•œ μ›Ή μ•„ν‚€ν…μ²˜
        • ν…ŒμŠ€νŒ…
        • 툴링
        • 기술적 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
        • νƒ€μž…μŠ€ν¬λ¦½νŠΈ
        • λΌμš°νŒ…
        • μ‚¬μš©μž 쀑심 API λ””μžμΈ
        • λ¦¬μ•‘νŠΈ 미래
    • Performance
      • React DevTools
      • Component μ΅œμ ν™”
      • Page Load
      • API
    • MFA
      • MSA
      • MFA λ„μž…ν•˜κΈ°
      • Monorepo
        • Monorepo Tool
        • Yarn Berry Workspace
        • Turborepo
      • MFA Composition
      • SPA 톡합
      • Design System
      • Package Manager
        • Yarn
        • pnpm
      • Transpiler & Bundler
        • Babel
        • Rollup
        • esbuild
        • swc
        • Webpack
        • Vite
      • 뢄해와 톡합을 μœ„ν•œ μ—¬λŸ¬ 기술 비ꡐ
    • State Management
      • Zustand
    • React v18
      • Automatic batching
      • Suspense
      • Transition
    • SEO
      • Search Engine Optimization
      • Open Graph Element
      • Metadata
    • FE Develop
      • Scrubbing
      • Clipboard
    • Refactoring
      • λ¦¬νŒ©ν† λ§ 깊게 듀여닀보기
      • κΈ΄ μ½”λ“œ 쑰각내기
      • νƒ€μž… μ½”λ“œ μ²˜λ¦¬ν•˜κΈ°
      • μœ μ‚¬ν•œ μ½”λ“œ μœ΅ν•©ν•˜κΈ°
      • 데이터 보호
      • μ½”λ“œ μΆ”κ°€ 및 제거
    • OAuth 2.0
    • Analytics
      • Mixpanel
    • ETC
      • VSCode
    • React Hook In Action
      • useContext & Provider
      • μ»€μŠ€ν…€ ν›…
      • μ½”λ“œ λΆ„ν• ν•˜κΈ° with Suspense, lazy
      • Suspense와 이미지 μ μž¬ν•˜κΈ°
      • useTransition, uesDeferredValue
      • SuspenseList
Powered by GitBook
On this page
  • Runtime Error Case
  • μ œμ–΄ν•  수 μ—†λŠ” μ—λŸ¬
  • Error Boundary
  • νŠΉμ§•
  • ErrorBoundaryκ°€ 닀루지 μ•ŠλŠ” Error
  • react-Error-Boundary
  • Sentry
  • Sentry κΈ°λŠ₯
  • μ„€μΉ˜
  • λΆ€κ°€ μ‚¬μš© 방법
  1. DEV_NOTE
  2. System Design

Error Handling

Runtime Error Case

  • API μ„œλ²„λ‘œ μΌμ‹œμ μœΌλ‘œ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€λ©΄ 슀크립트 μ—λŸ¬λ‘œ 인해 νŽ˜μ΄μ§€ ν‘œμ‹œκ°€ μ•ˆλ˜λŠ” 문제 λ°œμƒ

  • try & catch 둜 감싸도 μ•ˆμ „ν•˜μ§€ μ•Šλ‹€.

    • request abort μ‹œ λ°œμƒλ˜λŠ” errorλŠ” AbortError , DOMExceptionμ΄λ―€λ‘œ cause 속성이 μ—†λ‹€.

    • DOMException errorλŠ” 일반적인 νƒ€μž… μ—λŸ¬κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ μΌμ–΄λ‚œ 속성(error.cause)이 μ—†μ–΄ 슀크립트 μ—λŸ¬λ‘œ 인해 νŽ˜μ΄μ§€ ν‘œμ‹œκ°€ μ•ˆλ¨

  • JSON.stringify()λ₯Ό μ‚¬μš©ν•  λ•Œ dataκ°€ Serializable ν•˜μ§€ μ•Šμ€ 경우 (μ˜€λΈŒμ νŠΈκ°€ μˆœν™˜μ°Έμ‘°κ°€ λ˜λŠ” 경우) νƒ€μž…μ—λŸ¬ λ°œμƒμœΌλ‘œ νŽ˜μ΄μ§€ ν‘œμ‹œ μ•ˆλ¨

μ œμ–΄ν•  수 μ—†λŠ” μ—λŸ¬

  • μ—λŸ¬λŠ” 상황에 따라 각각 λ‹€λ₯΄κ²Œ λ°œμƒν•˜λ©° λͺ¨λ“  μΌ€μ΄μŠ€λ₯Ό μ™„μ „νžˆ μ œμ–΄ν•˜λŠ” 것은 μ–΄λ ΅λ‹€.

  • μ œμ–΄ν• μˆ˜ μ—†λŠ” λΆ€λΆ„μ—μ„œ UI Blocking을 λ°œμƒμ‹œν‚€λŠ”κ²ƒμ΄ 문제

  • μ œμ–΄ν•  수 μ—†λŠ” λΆ€λΆ„μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν•œ 경우, ν•΄λ‹Ή 뢀뢄을 감싸 μ—λŸ¬κ°€ μ „νŒŒλ˜μ–΄ νŽ˜μ΄μ§€κ°€ μ€‘λ‹¨λ˜λŠ” 것을 λ°©μ§€ν•˜λŠ” 것이 μ€‘μš”

Error Boundary

  • UI μΌλΆ€λΆ„μ˜ 슀크립트 μ—λŸ¬κ°€ 전체 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ€‘λ‹¨ν•΄μ„œλŠ” μ•ˆλœλ‹€.

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 전체가 μ€‘λ‹¨λ˜λŠ”κ²ƒμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ React v16μ—μ„œ Error BoundaryλΌλŠ” μƒˆλ‘œμš΄ κ°œλ…μ΄ λ„μž…λ¨

  • React Component tree ν•˜μœ„ 내뢀에 μžλ°”μŠ€ν¬λ¦½νŠΈ errorλ₯Ό catchν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ

  • λ¬Έμ œκ°€ λ°œμƒν•œ 뢀뢄에 λŒ€ν•΄ falback UIλ₯Ό μ œκ³΅ν•œλ‹€.

νŠΉμ§•

  • ErrorBoundary μžμ‹ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ—λŸ¬κ°€ λ°œμƒλœ 경우 κ°€μž₯ μΈμ ‘ν•œ μƒμœ„ ErrorBoundary에 제곡된 Fallback UIλ₯Ό λ Œλ”λ§

  • ErrorBoundaryλŠ” componentDidCatch 라이프사이클 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•œλ‹€.

    • ν•΄λ‹Ή λ©”μ†Œλ“œλŠ” Class Componentμ—μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— ErrorBoundary μ»΄ν¬λ„ŒνŠΈλŠ” Class둜 λ§Œλ“€μ–΄μ§„λ‹€.

  • ErrorBoundaryλ₯Ό κ΅¬ν˜„ν•  λ•Œ 였λ₯˜μ— λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•˜κ³  μ‚¬μš©μžμ—κ²Œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•  수 μžˆλŠ” Static getDerivedStateFromError, componentDidCatch method 이 κ΅¬ν˜„λ˜μ–΄μ•Ό ν•œλ‹€.

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state =  { hasError: false }
  }
  
  // ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ—λŸ¬κ°€ λ°œμƒλœ 경우 호좜됨
  static getDerivedStateFromError(error) {
    // fallback UIλ₯Ό 보여주기 μœ„ν•΄ μ—λŸ¬ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈ 
    return { hasError: true }
  }
  // μ—λŸ¬κ°€ λ°œμƒλœ 경우 μ‹€ν–‰λ˜λŠ” 라이프사이클 λ©”μ†Œλ“œ
  componentDidCatch(error, info) {
    /*
     * Example: componentStack
     *   in ComponentThatThrow (created by App)
     *.  in ErrorBoundray (created by App)
     *.  in div
     *.  in App
    */
     logErrorToMyService(error, info.componentStack);
  }
  
  if (this.state.hasError){
    // render fallback UI 
    return this.props.fallback
  }
  
  return this.props.children
}
  • getDerivedStateFromError()

    • errorλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 갱신될 stateλ₯Ό λ°˜ν™˜ν•œλ‹€.

    • render stepμ—μ„œ 호좜 (VDOM이 μƒμ„±λ˜κ³  이전 VDOMκ³Ό λΉ„κ΅ν•˜λŠ” λ‹¨κ³„μ—μ„œ 호좜됨)

    • VDOM ꡬ성이 κΉ¨μ§€λ©΄ μ•ˆλ˜κΈ° λ•Œλ¬Έμ— λ‚΄λΆ€μ—μ„œ μ‚¬μ΄λ“œμ΄νŽ™νŠΈκ°€ λ°œμƒ κ°€λŠ₯ν•œ μž‘μ—…μ„ ν•΄μ„  μ•ˆλ¨

    • fallback UIλ₯Ό λ Œλ”λ§ν• μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•˜λŠ” μž‘μ—…μœΌλ‘œμ„œ μ—λŸ¬ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” μ½”λ“œλ§Œ μž‘μ„±

  • componentDidCatch()

    • commit stepμ—μ„œ 호좜 (VDOM 변경사항을 μ‹€μ œ DOM에 μ μš©ν•˜λŠ” λ‹¨κ³„μ—μ„œ 호좜됨)

    • μ‚¬μ΄λ“œμ΄νŽ™νŠΈκ°€ λ°œμƒν•΄λ„ 무관

    • μ—λŸ¬ 정보λ₯Ό 남길 λ•Œ μ‚¬μš©ν•œλ‹€. (μ—λŸ¬ λ‘œκΉ…)

    • error -> μ—λŸ¬μ— λŒ€ν•œ 정보

    • info -> μ–΄λ–€ μ»΄ν¬λ„ŒνŠΈκ°€ μ—λŸ¬λ₯Ό λ°œμƒμ‹œμΌ°λŠ”μ§€μ— λŒ€ν•œ 정보 (componentStack)

ErrorBoundaryκ°€ 닀루지 μ•ŠλŠ” Error

  • Async λ™μž‘λ“€ (Event Handler, setTimeout, rAF)

    • μ‚¬μš©μž μΈν„°λ ‰μ…˜ λ˜λŠ” νŠΉμ • 이벀트둜 λ Œλ”λœ 이후에 λ°œμƒλ˜κΈ° λ•Œλ¬Έμ— ErrorBoundaryκ°€ catchν•˜μ§€ λͺ»ν•œλ‹€.

    • 즉, λ Œλ”λ§ 도쀑에 μΌμ–΄λ‚œ Error만 catch κ°€λŠ₯

    • unhandledrejection 이벀트λ₯Ό 톡해 ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ˜ 비동기 μ—λŸ¬λ₯Ό μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μž‘μ•„λ‚Ό 수 μžˆλ‹€.

      • promise.rejectκ°€ λ°œμƒν•˜λ©΄ 이벀트 λ°œμƒλ¨

  • ServerSide Rendering

  • ErrorBoundary λ‚΄λΆ€ μ—λŸ¬

  • try-catch둜 처리된 μ—λŸ¬

unhandledrejection event

  useEffect(() => {
    window.addEventListener('unhandledrejection', callback);
    return () => {
      window.removeEventListener('unhandledrejection', callback);
    }
  }, []);

react-Error-Boundary

직접 ErrorBoundaryλ₯Ό μ œμž‘ν•˜μ§€ μ•Šκ³  μƒμš©ν™”λœ 라이브러리λ₯Ό μ‚¬μš©

"use client"

import { ErrorBoundary } from 'react-error-boundray';

<ErrorBoundray fallback={<div>Error λ°œμƒ< /div>}>
  <Component>
</ErrorBoundray>

  • fallbackRender() -> props으둜 μ—λŸ¬μ— λ”°λ₯Έ fallback UI ꡬ성 κ°€λŠ₯

const fallbackRender = ({ error, resetErrorBoundary }) => {
  // resetErrorBoundary()λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ—λŸ¬λ°”μš΄λ”λ¦¬ μƒνƒœλ₯Ό μ΄ˆκΈ°ν™”μ‹œν‚€κ³ , λ¦¬λ Œλ”λ§
  return (
    <div role='alert'>
      <p>{error.message}</p> 
    </div>
  )
}

<ErrorBoundray 
  fallbackRender={fallbackRender}
  onReset={(details) => {
    // μ—λŸ¬κ°€ λ‹€μ‹œ λ°œμƒλ˜μ§€ μ•ŠκΈ° μœ„ν•΄ μƒνƒœλ₯Ό μ΄ˆκΈ°ν™”μ‹œν‚€λŠ” μ½”λ“œ μž‘μ„±
  }}>
  <Component>
</ErrorBoundray>
  • useErrorBoundary() hook -

    • 비동기 μ½”λ“œ μ‹€ν–‰ μ΄ν›„μ˜ λ°œμƒν•˜λŠ” μ—λŸ¬λ₯Ό λŒ€μ‘ν•˜κΈ° μœ„ν•œ showBoundary() λ₯Ό 제곡

    • fallback μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ λ¦¬λ Œλ”λ§μ„ λ°œμƒμ‹œν‚€κΈ° μœ„ν•œ resetBoundary()λ₯Ό 제곡

    • withErrorBoundary() HOC μ»΄ν¬λ„ŒνŠΈ 제곡

import { useErrorBoundary } from 'react-error-boundary'
//...
const { showBoundray } = useErrorBoundary();

useEffect(() => {
  somethingFetch().then().catch(error => showBoundary(error));
}, [])
import { useErrorBoundary } from 'react-error-boundary'

const ErrorFallback = ({ error }) => {
  const { resetBoundary } = useErrorBoundary();
  
  return (
    <div role='alert'>
      <p>{error.message}</p> 
      <button type="button" onClick={resetBoundary}>Try Again</button>
    </div>
  )
}
import { withErrorBoundary } from 'react-error-boundary'

const ComponentWithErrorBoundary = withErrorBoundary(Component, {
  fallback: <div>Error occur</div>,
  onError: (error, info) {}
})

Sentry

μ½”λ“œ κ΄€λ ¨ 문제λ₯Ό μ‹λ³„ν•˜κ³  μˆ˜μ •ν•˜λŠ”λ° 도움을 μ£ΌλŠ” μ†Œν”„νŠΈμ›¨μ–΄ λͺ¨λ‹ˆν„°λ§ 도ꡬ

  • λŸ°νƒ€μž„ λ‹¨κ³„μ˜ μ—λŸ¬λ₯Ό μˆ˜μ§‘

  • μ—λŸ¬κ°€ λ°œμƒν•œ ν™˜κ²½μ— 둜그λ₯Ό 직접 ν™•μΈν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜κ³  μ—λŸ¬ν™˜κ²½μ˜ μž¬ν˜„μ΄ λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬λ₯Ό μˆ˜μ§‘ν•˜λŠ”κ²ƒμ΄ μ€‘μš”ν•˜λ‹€.

  • ν΄λΌμ΄μ–ΈνŠΈ μ—λŸ¬λ₯Ό μˆ˜μ§‘ν•˜μ—¬ μŠ¬λž™μ„ μ—°λ™ν•˜μ—¬ μ•Œλ¦Ό 제곡

  • μ†ŒμŠ€μ½”λ“œ μ»¨ν…μŠ€νŠΈμ™€ λ”λΆˆμ–΄ Stack trace 제곡

  • Commit 정보 및 Stack trace 기반으둜 μ˜μ‹¬μŠ€λŸ¬μš΄ commit 및 ν• λ‹Ήμž μ œμ•ˆ

Sentry κΈ°λŠ₯

Stack trace

  • 제곡된 SourceMap 기반 Stack trece둜 μ—λŸ¬ ν™˜κ²½ νŒŒμ•… κ°€λŠ₯

  • μ—¬λŸ¬ μ—λŸ¬λ₯Ό κ·Έλ£Ήν™”ν•˜μ—¬ ν•˜λ‚˜μ˜ 이슈둜 μ •μ˜

  • μ΄λ²€νŠΈκ°€ λ°œμƒν•œ μ½”λ“œκ°€ μ–΄λ””μ—μ„œ μ—λŸ¬λ₯Ό λ°œμƒ μ‹œμΌ°λŠ”μ§€ 확인 κ°€λŠ₯

Breadcrumb

  • Error Event λ°œμƒκΉŒμ§€μ˜ 기둝과 νƒ€μž„λΌμΈ 제곡

  • HTTP Request, Console.log, Server log, DOM Event 등이 ν¬ν•¨λœλ‹€.

  • μ–΄λ–€ λ™μž‘λ“€λ‘œ μ‚¬μš©μžκ°€ μ—λŸ¬κ°€ λ°œμƒν–ˆλŠ”μ§€ 이유λ₯Ό λͺ…ν™•ν•˜κ²Œ νŒŒμ•…ν•˜κ³  ν•΄λ‹Ή μ»¨ν…μŠ€λ₯Ό μ΄ν•΄ν•¨μœΌλ‘œμ¨ μ—λŸ¬λ₯Ό μž¬ν˜„ν•˜κΈ° μš©μ΄ν•΄μ§„λ‹€.

Session Replay

  • μ‚¬μš©μž μ„Έμ…˜μ„ λΉ„λ””μ˜€μ²˜λŸΌ μž¬ν˜„

  • 였λ₯˜/μ„±λŠ₯ 문제 λ°œμƒ μ „/ν›„ 상황 νŒŒμ•…

  • 문제의 λŒ€ν•œ 심측적인 디버깅, 문제λ₯Ό μž¬ν˜„ν•˜κ³  더 λΉ λ₯΄κ²Œ ν•΄κ²° κ°€λŠ₯

  • UI 이슈의 경우 제곡

λ…Ήν™” μ‹œμž‘ 트리거

  • replay.start() μˆ˜λ™ 호좜

  • μ„Έμ…˜μ΄ replaySessionSampleRate에 μ˜ν•΄ λ…Ήν™”μ—¬λΆ€ κ²°μ •

λ…Ήν™” μ’…λ£Œ 트리거

  • replay.stop() μˆ˜λ™ 호좜

  • μ‚¬μš©μž λΉ„ν™œμ„± μƒνƒœ, μ΅œλŒ€ μ‹œκ°„μ— 도달 (κΈ°λ³Έ 60λΆ„)

Alert

  • μ½”λ“œμ˜ 문제/ μ‚¬μš©μžμ—κ²Œ λ―ΈμΉ˜λŠ” 영ν–₯에 λŒ€ν•œ μ‹€μ‹œκ°„μ μΈ κ°€μ‹œμ„± 제곡

  • μ§€μ •ν•œ κ·œμΉ™μ— μ˜ν•΄ λ°œμƒλ˜λŠ” alert

  • alert λͺ©λ‘ 필터링, alert에 λŒ€ν•œ λΉ„ν™œμ„±ν™”/mute κΈ°λŠ₯, notification 제곡

μ„€μΉ˜

npx @sentry/wizard@latest -i nextjs

λΆ€κ°€ μ‚¬μš© 방법

Issue νŒ¨λ„

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 였λ₯˜, μ„±λŠ₯λ¬Έμ œμ— λŒ€ν•œ 정보 ν‘œμ‹œ

  • ν™˜κ²½μ— λ”°λ₯Έ 필터링 κ°€λŠ₯

  • ν•˜λ‚˜μ˜ μ΄μŠˆλŠ” μœ μ‚¬ν•œ μ›μΈμœΌλ‘œ κ·Έλ£Ήν™”λœ μ—λŸ¬λ“€

  • 이슈의 λ°œμƒ λΉˆλ„, 좔이, μ‚¬μš©μžλ³„ 영ν–₯도 νŒŒμ•… κ°€λŠ₯

일반적인 앱은 λŒ€λŸ‰μ˜ μ΄λ²€νŠΈλ“€μ„ μ„ΌνŠΈλ¦¬μ— μ „μ†‘ν•˜κ²Œ λ˜λŠ”λ° 수 λ§Žμ€ μ—λŸ¬λ“€μ΄ μ „μ†‘λ˜λ©΄μ„œ 이런 μ—λŸ¬λ“€μ„ 필터링 및 κ·Έλ£Ήν™”ν•΄μ„œ 보여주지 μ•Šκ²Œλ˜λ©΄ μ°Ύκ³ ν•˜μžλŠ” λ©”μ΄μ €ν•œ 이슈 및 보고 있던 μ΄μŠˆλ“€μ˜ νŠΈλž˜ν”½, λΉˆλ„, 상황 좔이 λ“±μ˜ 정보듀을 ν”½ν•΄μ„œ 보기 쉽지 μ•ŠκΈ°μ— μ„ΌνŠΈλ¦¬λŠ” 이런 λŒ€λŸ‰ μ΄λ²€νŠΈλ“€μ„ κ·Έλ£Ήν•‘ν•΄μ„œ μ²˜λ¦¬ν•˜κ²Œ λœλ‹€.

Issue μƒνƒœ

  • New: μƒμ„±ν•œμ§€ 7일 이내인 이슈

  • Ongoing: 7일 이상 λ˜μ—ˆκ±°λ‚˜, μˆ˜λ™μœΌλ‘œ reviewed 처리된 이슈

  • Escalating: 였래된 이슈 쀑 λΉˆλ„κ°€ κΈ‰κ²©νžˆ λŠ˜μ–΄λ‚œ 이슈

  • Regressed: resolved λ˜μ—ˆλ‹€κ°€ λ‹€μ‹œ λ‚˜νƒ€λ‚œ 이슈

  • Archived: λ³΄κ΄€μ²˜λ¦¬λœ 이슈

  • Resolved: ν•΄κ²° 처리된 이슈

Issue νƒ­

  • Unresolved: κ²€ν† κ°€ ν•„μš”ν•œ, 아직 ν•΄κ²°λ˜μ§€ μ•Šμ€ λͺ¨λ“  이슈 총집합

  • For Review: κ²€ν†  λͺ©λ‘, κ²€ν† κ°€ ν•„μš”ν•œ 이슈, ν•΄κ²°λ˜μ§€ μ•Šμ€ μ΄μŠˆλ“€μ˜ ν•˜μœ„ μ§‘ν•©

  • Regressed: ν•΄κ²°λœ 이슈, ν•΄κ²°λœμ΄μŠˆκ°€ λ‹€μ‹œ λ°œμƒν•œ 이슈

  • Escalating: 이전에 archived 됬던 이슈 쀑 μ˜ˆμƒλ˜λŠ” 이슈 λΉˆλ„κ°€ 초과된 이슈

  • Archived: ν•΄κ²° 처리된 μ΄μŠˆλ“€

Issue ν•„ν„°

  • By Project

  • By Environment

  • By Time

  • Custom filter

Issue 상세 νŒ¨λ„

  • 이슈 좜처

  • 영ν–₯ λ²”μœ„

  • κ·Έλ£Ήν™”λœ μ΄μŠˆμ— λŒ€ν•œ μš”μ•½

  • 24μ‹œκ°„/30μΌκ°„μ˜ λΉˆλ„

  • κ΄€λ ¨ νƒœκ·Έ 정보

  • Stack Trace

  • Breadcrumbs

Session Replay μ„€μ •

  • Sentry.init() 내에 κΈ°λ‘ν•˜λŠ” μ„€μ • κ°’

  • μžλ™ μ„€μ •μ‹œ, sentry.client.config.ts/js 에 μ •μ˜

import * as Sentry from '@sentry/nextjs';

Sentry.init({
  // 였λ₯˜ λ°œμƒ μ‹œ λ…Ήν™”λ˜λŠ” λ¦¬ν”Œλ ˆμ΄μ˜ μƒ˜ν”Œλ§ λΉ„μœ¨
  // 이 μœ ν˜•μ˜ λ¦¬ν”Œλ ˆμ΄λŠ” 였λ₯˜κ°€ λ°œμƒν•˜κΈ° μ „μ˜ 이벀트λ₯Ό μ΅œλŒ€ 1λΆ„κΉŒμ§€ λ…Ήν™”
  // or μ„Έμ…˜μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ 계속 녹화함
  // 1.0은 였λ₯˜κ°€ μžˆλŠ” λͺ¨λ“  μ„Έμ…˜μ„ μΊ‘μ²˜ν•˜κ³  0은 μ•ˆν•¨ (0 ~ 1.0)
  replayOnErrorSampleRate: 1.0,
  // μ‚¬μš©μž μ„Έμ…˜ 전체에 걸쳐 μ§€μ†λ˜λŠ” λ¦¬ν”Œλ ˆμ΄μ˜ μƒ˜ν”Œλ§ λΉ„μœ¨
  // 1.0은 λͺ¨λ“  λ¦¬ν”Œλ ˆμ΄λ₯Ό μˆ˜μ§‘ν•˜κ³  0은 μ•ˆν•¨ (0 ~ 1.0)
  replaySessionSampleRate: 0.1,
  
  intergrations: [
    new Setnry.Replay({
      // νŽ˜μ΄μ§€ λ‘œλ”© μ „λ°˜μ— 걸쳐 μ‚¬μš©μžλ₯Ό 좔적
      // νƒ­λ‹Ή μ„Έμ…˜ μœ μ§€, μ—¬λŸ¬ 탭을 μ‚¬μš©ν•˜λŠ” ν•œ λͺ…μ˜ μ‚¬μš©μžλŠ” μ—¬λŸ¬ μ„Έμ…˜μœΌλ‘œ 기둝
      // κΈ°λ³Έκ°’: true
      stickySession: true,
      // SDKκ°€ setnry둜 전솑을 μ‹œμž‘ν•˜κΈ° μ „κΉŒμ§€μ˜ λ¦¬ν”Œλ ˆμ΄ 길이(ms)
      // max: 15000, default: 5000,
      minReplayDuration: 5000,
      // λͺ¨λ“  ν…μŠ€νŠΈ 컨텐츠λ₯Ό λ§ˆμŠ€ν‚Ήμ²˜λ¦¬
      maskAllText: true,
      // media element blocking
      blockAllMedia: true,
    })
  ]
})

Sampling Rate μ„€μ •ν•˜λŠ” 이유

  • 맀우 λΉ„μŒˆ

  • quota에 λŒ€ν•œ 이해에 기반

    • -> μ‚¬μš©λŸ‰μ— λ”°λ₯Έ 과금 ꡬ쑰

  • 일반 sentry error 보닀 10λ°° μ΄μƒμ˜ 가격

    • κΌ­ ν•„μš”ν•œ λΆ€λΆ„μ—μ„œλ§Œ λ„μž… or μƒ˜ν”Œλ§ λΉ„μœ¨ μ‘°μ •

Session Replay νŒ¨λ„

  • νƒ€μž„λΌμΈ

  • ν”Œλ ˆμ΄μ–΄

  • Breadcrumbs

  • 기타 μ»΄ν¬λ„ŒνŠΈ νŒ¨λ„λ‘œ ꡬ뢄

  • νŽ˜μ΄μ§€ μ•‘μ…˜

    • λ¦¬ν”Œλ ˆμ΄ 곡유

    • μ‚­μ œ

Previousμ˜μ‘΄μ„±μ„ λ°°μ œν•œ 개발NextArchitecture

Last updated 8 months ago

κ³΅μ‹λ¬Έμ„œ