๐ก๏ธ Error Boundary๋?
์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ ์์ ์ปดํฌ๋ํธ์์ ๋ฐ์ํ ์๋ฌ๋ฅผ ์ก์ UI๋ฅผ ๋์ฒด ๋ ๋๋งํ๋ ์ปดํฌ๋ํธ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก React์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ ์ฒด ์ฑ์ด ๊นจ์ง๋ฉด์ ํ์ ํ๋ฉด์ด ๋์ค๋๋ฐ,
Error Boundary๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ์์ญ๋ง fallback UI๋ก ๋์ฒดํ ์ ์๋ค.
โ๏ธ ๋์ ๋ฐฉ์
์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ ์์ ์ปดํฌ๋ํธ์์ ๋ฐ์ํ ์๋ฌ๋ฅผ ๊ฐ์งํ์ฌ
๋ฏธ๋ฆฌ ์ ์ํ UI๋ฅผ ๋ ๋๋งํ๋ค.
์๋ฌ ๋ฐ์ด๋๋ฆฌ ๊ตฌํ์ ์ํ ์ฃผ์ ๋ฉ์๋
getDerivedStateFromError- ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ํธ์ถ
- ์ํ๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ค์ ๋ ๋๋ง์์ fallback UI๋ฅผ ๋ณด์ฌ์ค
componentDidCatch- ์๋ฌ ์ ๋ณด๋ฅผ ๋ก๊น ํ ๋ ์ฌ์ฉ
๐ ๊ตฌํ
์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ ๋ฐ๋์ ํด๋์ค ์ปดํฌ๋ํธ๋ก ๊ตฌํํด์ผ ํ๋ค.
(ํจ์ํ ์ปดํฌ๋ํธ๋ก๋ ๋ฆฌ์กํธ ์ค๊ณ์ ํด๋์ค ์ ์ฉ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์)
๊ทธ๋์ ํธ์๋ฅผ ์ํด react-error-boundary ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
class ErrorBoundary extends Component {
// ์์ฑ์ > ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ์์ฑ๋ ๋ ๋ฑ ํ๋ฒ ์คํ๋จ
constructor(props) {
super(props);
this.state = { hasError: false }; // ์ด๊ธฐ ์ํ: ์๋ฌ ์์
}
// ์์ ์ปดํฌ๋ํธ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ํธ์ถ๋จ
// static > ์ ์ ๋ฉ์๋ ์ด ํด๋์ค ์์ฒด์ ๊ท์๋ ๊ท์น
// ์๋ฌ๊ฐ ํฐ์ก์ ๋ ๋ฆฌ์กํธ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์๋ก ๊ทธ๋ฆฌ๊ธฐ ์ ์ ์ํ๋ฅผ ๋ฐ๊ฟ์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํจ
static getDerivedStateFromError(error) {
// ๋ค์ ๋ ๋๋ง์์ ์๋ฌ ํ๋ฉด์ด ๋ณด์ด๋๋ก ์ํ ์
๋ฐ์ดํธ
return { hasError: true };
}
// ํ๋ฉด์ ๊ทธ๋ ค๋ผ๋ผ๋ ๋ช
๋ น์ด > ํจ์ํ ์ปดํฌ๋ํธ์ return๋ฌธ์ ์ญํ ์ ํจ
render() {
if (this.state.hasError) {
// ์๋ฌ ๋ฐ์ ์ ๋ณด์ฌ์ค UI (fallback props๋ก ์ ๋ฌ)
return this.props.fallback;;
}
// ์๋ฌ๊ฐ ์์ผ๋ฉด ์์ ์ปดํฌ๋ํธ๋ค์ ๊ทธ๋๋ก ๋ ๋๋ง
return this.props.children;
}
}