React์ ๋์์ฑ ๋ชจ๋์ ์ค๋ฅ ์ฒ๋ฆฌ ์ ๋ต์ ํ์ํ์ฌ ๊ฒฌ๊ณ ํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด ๋ณด์ธ์. ์ค๋ฅ๋ฅผ ์ฐ์ํ๊ฒ ๊ด๋ฆฌํ๊ณ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๋ ์ค์ฉ์ ์ธ ๊ธฐ์ ์ ๋ฐฐ์๋๋ค.
React ๋์์ฑ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ: ๋ณต์๋ ฅ ์๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถํ๊ธฐ
React์ ๋์์ฑ ๋ชจ๋๋ ๋ฐ์์ฑ ์๊ณ ์ํธ์์ฉ์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค. ๊ทธ๋ฌ๋ ํฐ ํ์๋ ํฐ ์ฑ ์์ด ๋ฐ๋ฆ ๋๋ค. ๋์์ฑ ๋ชจ๋์ ์ด์์ธ ๋น๋๊ธฐ ์์ ๋ฐ ๋ฐ์ดํฐ ํ์นญ์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฐฉํดํ ์ ์๋ ์ ์ฌ์ ์ธ ์คํจ ์ง์ ์ ๋ง๋ญ๋๋ค. ์ด ๊ธ์์๋ React์ ๋์์ฑ ํ๊ฒฝ ๋ด์์ ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ ์ ๋ต์ ๊น์ด ํ๊ณ ๋ค์ด, ์๊ธฐ์น ์์ ๋ฌธ์ ์ ์ง๋ฉดํ์ ๋์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์๋ ฅ์ ์ ์งํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ผ๋ก ์๋ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋์์ฑ ๋ชจ๋์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ฏธ์น๋ ์ํฅ ์ดํดํ๊ธฐ
์ ํต์ ์ธ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๊ธฐ์ ์ผ๋ก ์คํ๋ฉ๋๋ค. ์ฆ, ๊ฐ ์ ๋ฐ์ดํธ๋ ์๋ฃ๋ ๋๊น์ง ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํฉ๋๋ค. ๋ฐ๋ฉด์ ๋์์ฑ ๋ชจ๋๋ React๊ฐ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์ฐ์ ์ํ๊ณ ๋ฐ์์ฑ์ ์ ์งํ๊ธฐ ์ํด ์ ๋ฐ์ดํธ๋ฅผ ์ค๋จ, ์ผ์ ์ค์ง ๋๋ ํฌ๊ธฐํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ํ์ ์ฌ๋ผ์ด์ฑ(time slicing) ๋ฐ Suspense์ ๊ฐ์ ๊ธฐ์ ์ ํตํด ๋ฌ์ฑ๋ฉ๋๋ค.
ํ์ง๋ง ์ด๋ฌํ ๋น๋๊ธฐ์ ํน์ฑ์ ์๋ก์ด ์ค๋ฅ ์๋๋ฆฌ์ค๋ฅผ ์ผ๊ธฐํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ์์ง ํ์นญ ์ค์ธ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋งํ๋ ค๊ณ ์๋ํ๊ฑฐ๋ ๋น๋๊ธฐ ์์ ์ด ์๊ธฐ์น ์๊ฒ ์คํจํ ์ ์์ต๋๋ค. ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์์ผ๋ฉด ์ด๋ฌํ ๋ฌธ์ ๋ค์ ๊นจ์ง UI์ ์ค๋ง์ค๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
React ์ปดํฌ๋ํธ์์ ๊ธฐ์กด Try/Catch ๋ธ๋ก์ ํ๊ณ
try/catch
๋ธ๋ก์ JavaScript์์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ธฐ๋ณธ์ด์ง๋ง, React ์ปดํฌ๋ํธ ๋ด์์๋ ํนํ ๋ ๋๋ง ์ปจํ
์คํธ์์ ํ๊ณ๊ฐ ์์ต๋๋ค. ์ปดํฌ๋ํธ์ render()
๋ฉ์๋ ๋ด์ ์ง์ ๋ฐฐ์น๋ try/catch
๋ธ๋ก์ ๋ ๋๋ง ์์ฒด์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์ก์๋ด์ง *๋ชปํฉ๋๋ค*. ์ด๋ React์ ๋ ๋๋ง ํ๋ก์ธ์ค๊ฐ try/catch
๋ธ๋ก์ ์คํ ์ปจํ
์คํธ ๋ฒ์ ๋ฐ์์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ค์ ์์๋ฅผ ๊ณ ๋ คํด๋ณด์ธ์ (์์๋๋ก ์๋ํ์ง *์์* ๊ฒ์ ๋๋ค):
function MyComponent() {
try {
// `data`๊ฐ undefined ๋๋ null์ด๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค
const value = data.property;
return {value};
} catch (error) {
console.error("๋ ๋๋ง ์ค ์ค๋ฅ ๋ฐ์:", error);
return ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค!;
}
}
์ด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋ `data`๊ฐ ์ ์๋์ง ์์ ๊ฒฝ์ฐ, `data.property` ์ ๊ทผ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค. ๊ทธ๋ฌ๋ try/catch
๋ธ๋ก์ ์ด ์ค๋ฅ๋ฅผ ์ก์๋ด์ง *๋ชปํฉ๋๋ค*. ์ค๋ฅ๋ React ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๋ฐ๋ผ ์๋ก ์ ํ๋์ด ์ ์ฌ์ ์ผ๋ก ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ์ค๋จ์ํฌ ์ ์์ต๋๋ค.
์๋ฌ ๋ฐ์ด๋๋ฆฌ ์๊ฐ: React์ ๋ด์ฅ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ
React๋ ์๋ฌ ๋ฐ์ด๋๋ฆฌ(Error Boundary)๋ผ๋ ํน์ํ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด๋ ์์ ์ปดํฌ๋ํธ์ ๋ ๋๋ง, ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋ ๋ฐ ์์ฑ์์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํน๋ณํ ์ค๊ณ๋์์ต๋๋ค. ์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ ์์ ๋ง ์ญํ ์ ํ์ฌ ์ค๋ฅ๊ฐ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๋จ์ํค๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ฐ์ํ ํด๋ฐฑ(fallback) UI๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋ฌ ๋ฐ์ด๋๋ฆฌ ์๋ ๋ฐฉ์
์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ ๋ค์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋ ์ค ํ๋(๋๋ ๋ ๋ค)๋ฅผ ๊ตฌํํ๋ React ํด๋์ค ์ปดํฌ๋ํธ์ ๋๋ค:
static getDerivedStateFromError(error)
: ์ด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ ํ์ ์ปดํฌ๋ํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ์ ํธ์ถ๋ฉ๋๋ค. ์ค๋ฅ๋ฅผ ์ธ์๋ก ๋ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ ๋ํ๋ด๋๋ก ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.componentDidCatch(error, info)
: ์ด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ ํ์ ์ปดํฌ๋ํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ์ ํธ์ถ๋ฉ๋๋ค. ์ค๋ฅ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ปดํฌ๋ํธ ์คํ์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋ `info` ๊ฐ์ฒด๋ฅผ ๋ฐ์ต๋๋ค. ์ด ๋ฉ์๋๋ ์ค๋ฅ๋ฅผ ๋ก๊น ํ๊ฑฐ๋ ์ค๋ฅ ์ถ์ ์๋น์ค(์: Sentry, Rollbar, Bugsnag)์ ๋ณด๊ณ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ถ์ ํจ๊ณผ๋ฅผ ์ํํ๋ ๋ฐ ์ด์์ ์ ๋๋ค.
๊ฐ๋จํ ์๋ฌ ๋ฐ์ด๋๋ฆฌ ๋ง๋ค๊ธฐ
๋ค์์ ์๋ฌ ๋ฐ์ด๋๋ฆฌ ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ ์์์ ๋๋ค:
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// ๋ค์ ๋ ๋๋ง์์ ํด๋ฐฑ UI๋ฅผ ํ์ํ๋๋ก ์ํ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
return { hasError: true };
}
componentDidCatch(error, info) {
// "componentStack" ์์:
// in ComponentThatThrows (created by App)
// in MyErrorBoundary (created by App)
// in div (created by App)
// in App
console.error("์๋ฌ ๋ฐ์ด๋๋ฆฌ๊ฐ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ต๋๋ค:", error, info.componentStack);
// ์ค๋ฅ ๋ณด๊ณ ์๋น์ค์ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ ์๋ ์์ต๋๋ค
// logErrorToMyService(error, info.componentStack);
}
render() {
if (this.state.hasError) {
// ์ฌ์ฉ์ ์ ์ ํด๋ฐฑ UI๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค
return ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
;
}
return this.props.children;
}
}
์๋ฌ ๋ฐ์ด๋๋ฆฌ ์ฌ์ฉํ๊ธฐ
์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค:
function MyComponentThatMightError() {
// ์ด ์ปดํฌ๋ํธ๋ ๋ ๋๋ง ์ค์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค
if (Math.random() < 0.5) {
throw new Error("์ปดํฌ๋ํธ ์คํจ!");
}
return ๋ชจ๋ ๊ฒ์ด ์ ์์
๋๋ค!;
}
function App() {
return (
);
}
๋ง์ฝ MyComponentThatMightError
๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ฉด, ์๋ฌ ๋ฐ์ด๋๋ฆฌ๊ฐ ์ด๋ฅผ ํฌ์ฐฉํ๊ณ ์ํ๋ฅผ ์
๋ฐ์ดํธํ์ฌ ํด๋ฐฑ UI("๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.")๋ฅผ ๋ ๋๋งํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋จธ์ง ๋ถ๋ถ์ ์ ์์ ์ผ๋ก ๊ณ์ ์๋ํฉ๋๋ค.
์๋ฌ ๋ฐ์ด๋๋ฆฌ์ ๋ํ ์ค์ ๊ณ ๋ ค์ฌํญ
- ์ธ๋ถ์ฑ(Granularity): ์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ ๋ต์ ์ผ๋ก ๋ฐฐ์นํ์ธ์. ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋จ์ผ ์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ก ๊ฐ์ธ๋ ๊ฒ์ด ์ ํน์ ์ผ ์ ์์ง๋ง, ์ค๋ฅ๋ฅผ ๊ฒฉ๋ฆฌํ๊ณ ๋ ๊ตฌ์ฒด์ ์ธ ํด๋ฐฑ UI๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ๋ฌ ์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข ์ข ๋ ์ข์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ํ๋กํ ์น์ ์ด๋ ๋ฐ์ดํฐ ์๊ฐํ ์ปดํฌ๋ํธ์ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ์น์ ์ ๋ํด ๋ณ๋์ ์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- ์ค๋ฅ ๋ก๊น
: ์๊ฒฉ ์๋น์ค์ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๊ธฐ ์ํด
componentDidCatch
๋ฅผ ๊ตฌํํ์ธ์. ์ด๋ฅผ ํตํด ํ๋ก๋์ ํ๊ฒฝ์์ ์ค๋ฅ๋ฅผ ์ถ์ ํ๊ณ ์ฃผ์๊ฐ ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ญ์ ์๋ณํ ์ ์์ต๋๋ค. Sentry, Rollbar, Bugsnag๊ณผ ๊ฐ์ ์๋น์ค๋ ์ค๋ฅ ์ถ์ ๋ฐ ๋ณด๊ณ ๋ฅผ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. - ํด๋ฐฑ UI: ์ ์ฉํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ํด๋ฐฑ UI๋ฅผ ๋์์ธํ์ธ์. ์ผ๋ฐ์ ์ธ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํ๋ ๋์ ์ฌ์ฉ์์๊ฒ ์ปจํ ์คํธ์ ์ง์นจ์ ์ ๊ณตํ์ธ์. ์๋ฅผ ๋ค์ด, ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๊ฑฐ๋, ์ง์ํ์ ๋ฌธ์ํ๊ฑฐ๋, ๋ค๋ฅธ ์์ ์ ์๋ํ๋๋ก ์ ์ํ ์ ์์ต๋๋ค.
- ์ค๋ฅ ๋ณต๊ตฌ: ์ค๋ฅ ๋ณต๊ตฌ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์คํจํ ์์ ์ ์ฌ์๋ํ ์ ์๋ ๋ฒํผ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์๋ ๋ก์ง์ ์ ์ ํ ์์ ์ฅ์น๋ฅผ ํฌํจํ์ฌ ๋ฌดํ ๋ฃจํ๋ฅผ ํผํ๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
- ์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ ํธ๋ฆฌ์์ ์์ ์ *์๋์* ์๋ ์ปดํฌ๋ํธ์ ์ค๋ฅ๋ง ํฌ์ฐฉํฉ๋๋ค. ์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ ์๊ธฐ ์์ ์์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ ์ ์์ต๋๋ค. ์๋ฌ ๋ฐ์ด๋๋ฆฌ๊ฐ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ ๋๋งํ๋ค๊ฐ ์คํจํ๋ฉด, ์ค๋ฅ๋ ๊ทธ ์์ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ก ์ ํ๋ฉ๋๋ค.
Suspense์ ์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋น๋๊ธฐ ์์ ์ค ์ค๋ฅ ์ฒ๋ฆฌ
React์ Suspense ์ปดํฌ๋ํธ๋ ๋ฐ์ดํฐ ํ์นญ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ์ ์ธ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๋ผ "์ผ์ ์ค๋จ(suspends)"(๋ ๋๋ง ์ผ์ ์ค์ง)๋๋ฉด, Suspense๋ ํด๋ฐฑ UI๋ฅผ ํ์ํฉ๋๋ค. ์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ ์ด๋ฌํ ๋น๋๊ธฐ ์์ ์ค์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด Suspense์ ๊ฒฐํฉ๋ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ ํ์นญ์ Suspense ์ฌ์ฉํ๊ธฐ
Suspense๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ฅผ ์ง์ํ๋ ๋ฐ์ดํฐ ํ์นญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. `react-query`, `swr`๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ `fetch`๋ฅผ Suspense ํธํ ์ธํฐํ์ด์ค๋ก ๊ฐ์ธ๋ ์ผ๋ถ ์ปค์คํ ์๋ฃจ์ ์ผ๋ก ์ด๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
๋ค์์ ํ๋ผ๋ฏธ์ค๋ฅผ ๋ฐํํ๊ณ Suspense์ ํธํ๋๋ ๊ฐ์์ `fetchData` ํจ์๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ ์์์ ๋๋ค:
import React, { Suspense } from 'react';
// Suspense๋ฅผ ์ง์ํ๋ ๊ฐ์์ fetchData ํจ์
const fetchData = (url) => {
// ... (๋ฐ์ดํฐ๊ฐ ์์ง ์์ ๋ Promise๋ฅผ ๋์ง๋ ๊ตฌํ)
};
const Resource = {
data: fetchData('/api/data')
};
function MyComponent() {
const data = Resource.data.read(); // ๋ฐ์ดํฐ๊ฐ ์ค๋น๋์ง ์์ผ๋ฉด Promise๋ฅผ ๋์ง๋๋ค
return {data.value};
}
function App() {
return (
๋ก๋ฉ ์ค...
์ด ์์์์:
fetchData
๋ API ์๋ํฌ์ธํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์์ ๋๋ค. ๋ฐ์ดํฐ๊ฐ ์์ง ์์ ๋ Promise๋ฅผ ๋์ง๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ด๊ฒ์ด Suspense๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ ํต์ฌ์ ๋๋ค.Resource.data.read()
๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ ค๊ณ ์๋ํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ์์ง ์์ผ๋ฉด(Promise๊ฐ ํด๊ฒฐ๋์ง ์์์ผ๋ฉด) Promise๋ฅผ ๋์ ธ ์ปดํฌ๋ํธ๊ฐ ์ผ์ ์ค๋จ๋ฉ๋๋ค.Suspense
๋ ๋ฐ์ดํฐ๊ฐ ํ์นญ๋๋ ๋์fallback
UI(๋ก๋ฉ ์ค...)๋ฅผ ํ์ํฉ๋๋ค.ErrorBoundary
๋MyComponent
๋ ๋๋ง ์ค์ด๋ ๋ฐ์ดํฐ ํ์นญ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํฉ๋๋ค. API ํธ์ถ์ด ์คํจํ๋ฉด ์๋ฌ ๋ฐ์ด๋๋ฆฌ๊ฐ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ํด๋ฐฑ UI๋ฅผ ํ์ํฉ๋๋ค.
์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ก Suspense ๋ด ์ค๋ฅ ์ฒ๋ฆฌํ๊ธฐ
Suspense๋ฅผ ์ฌ์ฉํ ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ์ ํต์ฌ์ Suspense
์ปดํฌ๋ํธ๋ฅผ ErrorBoundary
๋ก ๊ฐ์ธ๋ ๊ฒ์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด Suspense
๊ฒฝ๊ณ ๋ด์์ ๋ฐ์ดํฐ ํ์นญ ๋๋ ์ปดํฌ๋ํธ ๋ ๋๋ง ์ค์ ๋ฐ์ํ๋ ๋ชจ๋ ์ค๋ฅ๊ฐ ํฌ์ฐฉ๋๊ณ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋ง์ฝ fetchData
ํจ์๊ฐ ์คํจํ๊ฑฐ๋ MyComponent
๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ฉด, ์๋ฌ ๋ฐ์ด๋๋ฆฌ๊ฐ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ํด๋ฐฑ UI๋ฅผ ํ์ํฉ๋๋ค. ์ด๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ด ์ค๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๋ ์ฌ์ฉ์ ์นํ์ ์ธ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
๋ค์ํ ๋์์ฑ ๋ชจ๋ ์๋๋ฆฌ์ค๋ฅผ ์ํ ๊ตฌ์ฒด์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ ์ ๋ต
๋ค์์ ์ผ๋ฐ์ ์ธ ๋์์ฑ ๋ชจ๋ ์๋๋ฆฌ์ค๋ฅผ ์ํ ๋ช ๊ฐ์ง ๊ตฌ์ฒด์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ ์ ๋ต์ ๋๋ค:
1. React.lazy ์ปดํฌ๋ํธ์์ ์ค๋ฅ ์ฒ๋ฆฌํ๊ธฐ
React.lazy
๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ๊ฐ์ ธ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ฑฐ๋ ์๋ฒ๊ฐ ๋ค์ด๋๋ ๋ฑ ๋์ ๊ฐ์ ธ์ค๊ธฐ ์์
์ด ์คํจํ ์ ์์ต๋๋ค.
React.lazy
์ฌ์ฉ ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด, ์ง์ฐ ๋ก๋ฉ๋๋ ์ปดํฌ๋ํธ๋ฅผ Suspense
์ปดํฌ๋ํธ์ ErrorBoundary
๋ก ๊ฐ์ธ์ธ์:
import React, { Suspense, lazy } from 'react';
const MyLazyComponent = lazy(() => import('./MyComponent'));
function App() {
return (
์ปดํฌ๋ํธ ๋ก๋ฉ ์ค...