์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด 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>
);
}