error-boundaries
์์ ์ปดํฌ๋ํธ์ ์ค๋ฅ์ ๋ํด try/catch ๋์ Error Boundary ์ฌ์ฉ์ ๊ฒ์ฆํฉ๋๋ค.
๊ท์น ์ธ๋ถ ์ฌํญ
try/catch ๋ธ๋ก์ React์ ๋ ๋๋ง ๊ณผ์ ์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์ก์ ์ ์์ต๋๋ค. ๋ ๋๋ง ๋ฉ์๋๋ Hook์์ ๋ฐ์ํ ์ค๋ฅ๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ํ๊ณ ์๋ก ์ ํ๋ฉ๋๋ค. ์ค์ง Error Boundary๋ง์ด ์ด๋ฌํ ์ค๋ฅ๋ฅผ ์ก์ ์ ์์ต๋๋ค.
์๋ชป๋ ์์
์ด ๊ท์น์ ๋ํ ์๋ชป๋ ์ฝ๋ ์์์ ๋๋ค.
// โ `try`/`catch`๋ ๋ ๋๋ง ์ค๋ฅ๋ฅผ ์ก์ ์ ์์
function Parent() {
try {
return <ChildComponent />; // ์ฌ๊ธฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด catch๊ฐ ๋์์ด ๋์ง ์์
} catch (error) {
return <div>Error occurred</div>;
}
}์ฌ๋ฐ๋ฅธ ์์
์ด ๊ท์น์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ฝ๋ ์์์ ๋๋ค.
// โ
Error Boundary ์ฌ์ฉ
function Parent() {
return (
<ErrorBoundary>
<ChildComponent />
</ErrorBoundary>
);
}๋ฌธ์ ํด๊ฒฐ
๋ฆฐํฐ๊ฐ use๋ฅผ try/catch๋ก ๊ฐ์ธ์ง ๋ง๋ผ๊ณ ํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
use Hook์ ์ ํต์ ์ธ ์๋ฏธ์์ ์ค๋ฅ๋ฅผ ๋์ง์ง ์๊ณ ์ปดํฌ๋ํธ ์คํ์ ์ผ์ ์ค๋จํฉ๋๋ค. use๊ฐ ๋๊ธฐ ์ค์ธ Promise๋ฅผ ๋ง๋๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ผ์ ์ค๋จํ๊ณ React๊ฐ ํด๋ฐฑ์ ํ์ํ๋๋ก ํฉ๋๋ค. Suspense์ Error Boundary๋ง์ด ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ฆฐํฐ๋ catch ๋ธ๋ก์ด ์ ๋ ์คํ๋์ง ์์ผ๋ฏ๋ก ํผ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด use ์ฃผ์์ try/catch์ ๋ํด ๊ฒฝ๊ณ ํฉ๋๋ค.
// โ `use` Hook ์ฃผ์์ try/catch
function Component({promise}) {
try {
const data = use(promise); // ์ก์ ์ ์์ - `use`๋ ๋์ง์ง ์๊ณ ์ผ์ ์ค๋จํจ
return <div>{data}</div>;
} catch (error) {
return <div>Failed to load</div>; // ๋๋ฌ ๋ถ๊ฐ
}
}
// โ
Error Boundary๊ฐ `use` ์ค๋ฅ๋ฅผ ์ก์
function App() {
return (
<ErrorBoundary fallback={<div>Failed to load</div>}>
<Suspense fallback={<div>Loading...</div>}>
<DataComponent promise={fetchData()} />
</Suspense>
</ErrorBoundary>
);
}