๐ป ErrorBoundary ์ฃผ์ ๋ด์ฉ
๋ฆฌ์กํธ์์ ErrorBoundary๋ ํ์ ๊ตฌ์ฑ ์์ ํธ๋ฆฌ
์ ์์์ ์์น์์ JavaScript ์๋ฌ
๋ฅผ ๊ฐ์งํ๋ ์ปดํฌ๋ํธ์ด๋ฉฐ, ์ถฉ๋ํ ์ปดํฌ๋ํธ ๋์ Fallback UI
๋ฅผ ํ์ํ๊ธฐ ์ํด ์ ์ธ์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
UI์ ์ผ๋ถ๋ถ์ ์กด์ฌํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์๋ฌ๊ฐ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ์ค๋จ์ํค์ง ์๊ธฐ ์ํด ErrorBoundary๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ ๋ ๋๋ง ์ค, ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋ ๋ฐ ํ์ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ์ด๋์์๋ ์๋ฌ๋ฅผ ํ์งํฉ๋๋ค.
ํ์ง๋ง, ์ด๊ธฐ ๋ ๋๋ง
, ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ ์ค๋ฅ
๋ ๋น๋๊ธฐ ์ฝ๋
์์ ์ค๋ฅ๋ฅผ ๊ฐ์งํ์ง ์์ต๋๋ค. ์ค๋ฅ ๊ฒฝ๊ณ๋ ํธ๋ฆฌ์์ ์๋ ๊ตฌ์ฑ ์์์ ์ค๋ฅ๋ง ๊ฐ์งํ๊ณ , ์ค๋ฅ ๊ฒฝ๊ณ ์์ฒด์ ์ค๋ฅ๋ ๊ฐ์งํ์ง ์์ต๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ ์ธํ์ ๊ฒฐ๊ณผ๋ฌผ์๋ง ์ง์คํ๊ณ ๋ณต์กํ ๊ณผ์ ์ ์ถ์ํํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
์ ์ธํ ๋ฐ๋์ ๊ฐ๋
์ผ๋ก ๋ช
๋ นํ์ด ์์ผ๋ฉฐ, ๋ช
๋ นํ์ ๊ฒฐ๊ณผ๋ฌผ๋ณด๋ค๋ ๊ทธ ๊ณผ์ ์ด ์ค์ํฉ๋๋ค.
๋ช
๋ นํ์ ๊ฒฝ์ฐ ํ ์ค์ฉ ์ฝ์ด ๋๊ฐ๋ฉด์ ๋ค์์ ์ด๋ค ์ผ์ด ๋ฐ์ํ ์ง ์ถ์ธก
ํด์ผ ํฉ๋๋ค. ๋ฐ๋ฉด, ์ ์ธํ์ ๊ฒฝ์ฐ ์์ธํ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๋๋ผ๋ ์ฝ๋๋ง ๋ณด๊ณ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ ์ง ์์ธก์ด ๊ฐ๋ฅํฉ๋๋ค.
// ๋ช
๋ นํ
function double ( arr ) {
let results = [ ] ;
for ( let i = 0 ; i < arr . length ; i ++ ) {
results . push ( arr [ i ] * 2 ) ;
}
return results ;
}
// ์ ์ธํ
function double ( arr ) {
return arr . map ( ( item ) => item * 2 ) ;
}
// ๋ฆฌ์กํธ
< QueryErrorBoundary
fallback = {
< DefaultFallback onResetAction = { ( ) => location . replace ( "/start" ) } />
}
>
{ /* ... */ }
</ QueryErrorBoundary >
๋ฆฌ์กํธ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ฐ๋ฆฌ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด DefaultFallback์ ๋ณด์ฌ์ฃผ๋๊ตฌ๋ ๋ฐ๋ก ์ดํดํ ์ ์์ต๋๋ค.
QueryErrorBoundary๊ฐ ๋ด๋ถ์์ ์ด๋ค ๋ก์ง์ด ๋์ํ๋์ง ์ฐ๋ฆฌ๋ ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋ฉ๋๋ค. ์ด์ฒ๋ผ ๋ด๋ถ ๋ณต์ก์ฑ์ ์ถ์ํ
ํ๋ ๊ฒ์ด ๋ฐ๋ก ์ ์ธํ์
๋๋ค.
ErrorBoundary ๊ธฐ๋ณธ ์์
class ErrorBoundary extends React . Component {
constructor ( props ) {
super ( props ) ;
this . state = { hasError : false } ;
}
static getDerivedStateFromError ( error ) {
// ๋ค์ ๋ ๋๋ง์์ ํด๋ฐฑ UI๊ฐ ๋ณด์ด๋๋ก ์ํ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
return { hasError : true } ;
}
componentDidCatch ( error , errorInfo ) {
// ์๋ฌ ๋ฆฌํฌํ
์๋น์ค์ ์๋ฌ๋ฅผ ๊ธฐ๋กํ ์๋ ์์ต๋๋ค.
logErrorToMyService ( error , errorInfo ) ;
}
render ( ) {
if ( this . state . hasError ) {
// ํด๋ฐฑ UI๋ฅผ ์ปค์คํ
ํ์ฌ ๋ ๋๋งํ ์ ์์ต๋๋ค.
return < h1 > Something went wrong.</ h1 > ;
}
return this . props . children ;
}
}
์์ ์ฝ๋๋ ๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์์์ ์ ๊ณตํด ์ฃผ๋ ๊ธฐ๋ณธ ErrorBoundary ์ฝ๋์
๋๋ค.
์๋ช
์ฃผ๊ธฐ ๋ฉ์๋์ธ getDerivedStateFromError()
์ ComponentDidCatch()
์ค ํ๋(ํน์ ๋ ๋ค)๋ฅผ ์ ์ํ๋ฉด ์๋ฌ ๊ฒฝ๊ณ๊ฐ ๋ฉ๋๋ค.
์๋ฌ ๋ฐ์ํ ๋ค์ ํด๋ฐฑ UI ๋ ๋๋ง์ ํ๋ ค๋ฉด static getDerivedStateFromError
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํด๋น ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ ํ์์ ์์ ์ปดํฌ๋ํธ
์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ํธ์ถ๋ฉ๋๋ค. ์ด ๋ฉ์๋๋ ๋งค๊ฐ๋ณ์๋ก ์ค๋ฅ๋ฅผ ์ ๋ฌ๋ฐ๊ณ , ๊ฐฑ์ ๋ state ๊ฐ์ ๋ฐ๋์ ๋ฐํ
ํด์ผ ํฉ๋๋ค.
์๋ฌ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ ค๋ฉด componentDidCatch
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ ์์ ์ปดํฌ๋ํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ํธ์ถ๋๋ฉฐ, 2๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌ๋ฐ์ต๋๋ค.
error - ๋ฐ์ํ ์ค๋ฅ, info - ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์์ผฐ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ componentStack ํค๋ฅผ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด
์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ ํธ๋ฆฌ ๋ด์์ ํ์์ ์กด์ฌํ๋ ์ปดํฌ๋ํธ์ ์๋ฌ๋ง์ ํฌ์ฐฉ
ํฉ๋๋ค
์๋ฌ ๊ฒฝ๊ณ์ ๊ฐ ์์ ฏ์ ์๋ฌ ๊ฒฝ๊ณ๋ก ๊ฐ์ธ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋จธ์ง ๋ถ๋ถ์ด ์ถฉ๋ํ์ง ์๋๋ก ๋ณดํธํ ์๋ ์์ต๋๋ค.