## ๐Ÿ“Œ Brief Summary Error Boundaries๋Š” React ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ํ•˜์œ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” JavaScript ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•˜์—ฌ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๋ž˜์‹œ(White Screen)๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์„ ์–ธ์  ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ง€์ ์„ ๊ฒฉ๋ฆฌํ•˜๊ณ  ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ๋ Œ๋”๋งํ•จ์œผ๋กœ์จ ์‹œ์Šคํ…œ์˜ ๊ฐ€์šฉ์„ฑ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ณดํ˜ธํ•œ๋‹ค. ## ๐Ÿ“– Core Content 1. **์ž‘๋™ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋ฐ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ์˜์กด์„ฑ** - React 16๋ถ€ํ„ฐ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง, ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž ๋‚ด๋ถ€์˜ ์—๋Ÿฌ๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค. - ๋ฐ˜๋“œ์‹œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ, `static getDerivedStateFromError()`๋กœ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  `componentDidCatch()`๋กœ ์—๋Ÿฌ๋ฅผ ๋กœ๊น…ํ•œ๋‹ค. 2. **์„ ์–ธ์  ์—๋Ÿฌ ๊ฒฉ๋ฆฌ (Isolation)** - ๋ช…๋ นํ˜• `try/catch`์™€ ๋‹ฌ๋ฆฌ React์˜ ์„ ์–ธ์  ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๋ฉฐ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ˆ˜์ค€์—์„œ ์—๋Ÿฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๊ฐ€ ์•„๋‹Œ, ์‹คํŒจ ์œ„ํ—˜์ด ๋†’์€ ํŠน์ • ์œ„์ ฏ(์ฐจํŠธ, ์„œ๋“œํŒŒํ‹ฐ ํผ ๋“ฑ)์„ ๋…๋ฆฝ๋œ Boundary๋กœ ๊ฐ์‹ธ '์žฅ์•  ๊ฒฉ๋ฆฌ'๋ฅผ ์‹คํ˜„ํ•œ๋‹ค. 3. **ํฌ์ฐฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜์—ญ (Limitations)** - ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, ๋น„๋™๊ธฐ ์ฝ”๋“œ(setTimeout, Fetch), ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR), Error Boundary ์ž์ฒด ๋‚ด์˜ ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•œ๋‹ค. - ์ด๋Ÿฌํ•œ ์˜์—ญ์€ ์—ฌ์ „ํžˆ `try/catch`๋‚˜ ์ „์—ญ ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•œ ๋ณด์™„์ด ํ•„์š”ํ•˜๋‹ค. 4. **๋ฏธ์ฒ˜๋ฆฌ ์—๋Ÿฌ์˜ ๊ฒฐ๊ณผ** - ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์—๋Ÿฌ๋Š” ์ „์ฒด ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋งˆ์šดํŠธ ํ•ด์ œ(Unmounting)๋ฅผ ์œ ๋ฐœํ•˜๋ฉฐ, ์ด๋Š” ์†์ƒ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ์•ˆ์ „ํ•œ ์„ ํƒ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ## โš–๏ธ Trade-offs & Caveats - **ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ์œ ์ง€ ํ•„์š”์„ฑ**: ์ตœ์‹  React๊ฐ€ Hooks ์ค‘์‹ฌ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Error Boundary ๊ตฌํ˜„์„ ์œ„ํ•ด ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ผ๊ด€์„ฑ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. - **์„ฑ๋Šฅ ๋ฐ ๋ Œ๋”๋ง ์˜ค๋ฒ„ํ—ค๋“œ**: ๋„ˆ๋ฌด ๋งŽ์€ Error Boundary๋ฅผ ์ค‘์ฒฉํ•  ๊ฒฝ์šฐ ํŠธ๋ฆฌ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์ง€๊ณ  ์—๋Ÿฌ ์ „ํŒŒ ์ฒดํฌ ๋กœ์ง์— ๋”ฐ๋ฅธ ๋ฏธ์„ธํ•œ ์„ฑ๋Šฅ ์˜ํ–ฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. - **๋น„๋™๊ธฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์˜ ๊ณต๋ฐฑ**: ๋ Œ๋”๋ง ์—๋Ÿฌ๋งŒ ํฌ์ฐฉํ•˜๋ฏ€๋กœ, ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์ด ๋นˆ๋ฒˆํ•œ ํ˜„๋Œ€ ์•ฑ์—์„œ๋Š” `react-error-boundary`์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•œ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค. ## ๐Ÿ”— Knowledge Connections ### Related Concepts - **Fallback UI**: ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜๋Š” ๋ฐฉ์–ด์  ์ธํ„ฐํŽ˜์ด์Šค (๊ด€๊ณ„: ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฌผ) - **Component Stack Traces**: ์—๋Ÿฌ ๋ฐœ์ƒ ์œ„์น˜๋ฅผ ์ถ”์ ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์ •๋ณด (๊ด€๊ณ„: ๋””๋ฒ„๊น… ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ) - **Sentry / LogRocket**: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์—๋Ÿฌ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ํ”Œ๋žซํผ (๊ด€๊ณ„: ์šด์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์—ฐ๋™) ### Deeper Research Questions 1. React์˜ ๋‚ด๋ถ€ Fiber ์•„ํ‚คํ…์ฒ˜๋Š” Error Boundary๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  ์ปค๋ฐ‹ ๋‹จ๊ณ„๋กœ ์ „์ดํ•˜๋Š”๊ฐ€? 2. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด์˜ ์—๋Ÿฌ๋ฅผ Error Boundary๋กœ ๊ฐ•์ œ ์ „ํŒŒํ•˜๊ธฐ ์œ„ํ•œ 'setState' ํŠธ๋ฆญ์˜ ์›๋ฆฌ์™€ ํ•œ๊ณ„๋Š”? 3. `react-error-boundary` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์—์„œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๋Š” ๋ฐฉ์‹์€? 4. ๋‹จ์ผ ์ „์—ญ Error Boundary์™€ ๋‹ค์ค‘ ์ง€์—ญ Error Boundary ๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ๋ฒ”์œ„ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š”? 5. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ Error Boundary๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ธฐ ์ „์˜ ์—๋Ÿฌ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ### Practical Application Contexts - **๊ฒฐ์ œ ๋ฐ ๊ธˆ์œต ๋ชจ๋“ˆ**: ์ž…๋ ฅ ํผ์˜ ์ž‘์€ ๋ Œ๋”๋ง ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค ๋งˆ๋น„๋กœ ์ด์–ด์ง€์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌ. - **์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ํ†ตํ•ฉ**: ์•ˆ์ •์„ฑ์ด ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ Boundary๋กœ ๋ณดํ˜ธ. ### Adjacent Topics - **Try/Catch Statement in JS** - **Observability in Frontend** - **Graceful Degradation Design**