React ์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ํ๊ฒ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ถฉ๋์ ๋ฐฉ์งํ๋ฉฐ, ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ์ธ์. ๋ชจ๋ฒ ์ฌ๋ก์ ์ค์ ์์ ๋ฅผ ํฌํจํฉ๋๋ค.
React ์ค๋ฅ ๊ฒฝ๊ณ: ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ฐ์ด๋
์น ๊ฐ๋ฐ ์ธ๊ณ์์ ๊ฒฌ๊ณ ํ๊ณ ๋ณต์๋ ฅ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ฌ์ฉ์๋ค์ ์ํํ ๊ฒฝํ์ ๊ธฐ๋ํ๋ฉฐ, ์์์น ๋ชปํ ์ค๋ฅ๋ ์ข์ ๊ฐ๊ณผ ์ดํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ์ ๋๋ฆฌ ์ฌ์ฉ๋๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ React๋ ์ค๋ฅ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ธ ์ค๋ฅ ๊ฒฝ๊ณ(Error Boundaries)๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด ๊ฐ์ด๋์์๋ ์ค๋ฅ ๊ฒฝ๊ณ์ ๊ฐ๋ ์ ๊น์ด ํ๊ณ ๋ค์ด ๊ทธ ๋ชฉ์ , ๊ตฌํ, ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ฑ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณผ ๊ฒ์ ๋๋ค.
React ์ค๋ฅ ๊ฒฝ๊ณ๋ ๋ฌด์์ธ๊ฐ์?
React 16์ ๋์ ๋ ์ค๋ฅ ๊ฒฝ๊ณ๋ ์์ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ด๋์์๋ JavaScript ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ฌ ๊ธฐ๋กํ๊ณ , ์ ์ฒด ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ์ถฉ๋์ํค๋ ๋์ ๋์ฒด UI๋ฅผ ํ์ํ๋ React ์ปดํฌ๋ํธ์ ๋๋ค. ์น๋ช ์ ์ธ ์ค๋ฅ๊ฐ ์ ํ๋์ด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฐฉํดํ๋ ๊ฒ์ ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ๋ง์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ์ด๋ React ์ปดํฌ๋ํธ ๋ด์์ ์์ธ๋ฅผ ๊ตญ์์ ์ด๊ณ ํต์ ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ค๋ฅ ๊ฒฝ๊ณ ์ด์ ์๋ React ์ปดํฌ๋ํธ์์ ํฌ์ฐฉ๋์ง ์์ ์ค๋ฅ๊ฐ ์ข ์ข ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ถฉ๋์ํค๊ฑฐ๋ ๋น ํ๋ฉด์ ํ์ํ๊ฒ ํ์ต๋๋ค. ์ค๋ฅ ๊ฒฝ๊ณ๋ ์ค๋ฅ์ ์ํฅ์ ๊ฒฉ๋ฆฌํ์ฌ UI์ ์ํฅ์ ๋ฐ๋ ๋ถ๋ถ๋ง ์ค๋ฅ ๋ฉ์์ง๋ก ๋์ฒด๋๊ณ ๋๋จธ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ ์๋ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ ์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ์ฌ์ฉํด์ผ ํ๋์?
์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ง์ ์ด์ ์ด ์์ต๋๋ค:
- ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ : ์ถฉ๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋์ , ์ฌ์ฉ์๋ ์น์ํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณด๊ฒ ๋์ด ์ ์ฌ์ ์ผ๋ก ์ฌ์๋ํ๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ ํฅ์: ์ค๋ฅ ๊ฒฝ๊ณ๋ ์ฐ์์ ์ธ ์คํจ๋ฅผ ๋ฐฉ์งํ์ฌ ์ค๋ฅ์ ์ํฅ์ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ํน์ ๋ถ๋ถ์ผ๋ก ์ ํํฉ๋๋ค.
- ๋ ์ฌ์ด ๋๋ฒ๊น : ์ค๋ฅ ๊ฒฝ๊ณ์ ์ํด ํฌ์ฐฉ๋ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํจ์ผ๋ก์จ, ์ค๋ฅ์ ์์ธ์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ป๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ํจ๊ณผ์ ์ผ๋ก ๋๋ฒ๊น ํ ์ ์์ต๋๋ค.
- ํ๋ก๋์ ์ค๋น์ฑ: ์ค๋ฅ ๊ฒฝ๊ณ๋ ์์์น ๋ชปํ ์ค๋ฅ๊ฐ ์ฌ์ฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํํ์ ์ค๋ํ ์ํฅ์ ๋ฏธ์น ์ ์๋ ํ๋ก๋์ ํ๊ฒฝ์ ํ์์ ์ ๋๋ค.
- ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ง์: ์ ์ธ๊ณ์ ์ฌ์ฉ์ ์ ๋ ฅ์ด๋ ๋ค์ํ API์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ต๋๋ค. ์ค๋ฅ ๊ฒฝ๊ณ๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๋ ๋ณต์๋ ฅ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ค๋ฅ ๊ฒฝ๊ณ ๊ตฌํํ๊ธฐ: ๋จ๊ณ๋ณ ๊ฐ์ด๋
React์์ ์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค. static getDerivedStateFromError()
๋๋ componentDidCatch()
์๋ช
์ฃผ๊ธฐ ๋ฉ์๋(๋๋ ๋ ๋ค)๋ฅผ ๊ตฌํํ๋ ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค.
1. ์ค๋ฅ ๊ฒฝ๊ณ ์ปดํฌ๋ํธ ์์ฑํ๊ธฐ
๋จผ์ , ๊ธฐ๋ณธ์ ์ธ ์ค๋ฅ ๊ฒฝ๊ณ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค:
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// ๋ค์ ๋ ๋๋ง์์ ๋์ฒด UI๋ฅผ ํ์ํ๋๋ก state๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// ์ค๋ฅ๋ฅผ ์ค๋ฅ ๋ณด๊ณ ์๋น์ค์ ๊ธฐ๋กํ ์๋ ์์ต๋๋ค.
logErrorToMyService(error, errorInfo);
console.error("Caught error: ", error, errorInfo);
}
render() {
if (this.state.hasError) {
// ์ํ๋ ๋ง์ถค ๋์ฒด UI๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค.
return (
๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
{this.state.error && this.state.error.toString()}
{this.state.errorInfo && this.state.errorInfo.componentStack}
);
}
return this.props.children;
}
}
์ค๋ช :
constructor(props)
: ์ปดํฌ๋ํธ์ state๋ฅผhasError: false
๋ก ์ด๊ธฐํํฉ๋๋ค.static getDerivedStateFromError(error)
: ์ด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ ํ์ ์ปดํฌ๋ํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ์ ํธ์ถ๋ฉ๋๋ค. ๋ฐ์ํ ์ค๋ฅ๋ฅผ ์ธ์๋ก ๋ฐ์ state๋ฅผ ์ ๋ฐ์ดํธํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด ๊ฒฝ์ฐ,hasError
๋ฅผtrue
๋ก ์ค์ ํฉ๋๋ค.componentDidCatch(error, errorInfo)
: ์ด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ ํ์ ์ปดํฌ๋ํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ์ ํธ์ถ๋ฉ๋๋ค. ๋ ๊ฐ์ ์ธ์, ์ฆ ๋ฐ์ํ ์ค๋ฅ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ ์ปดํฌ๋ํธ์ ๋ํ ์ ๋ณด(errorInfo.componentStack
)๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์ต๋๋ค. ์ด๊ณณ์ด ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ์ค๋ฅ ๋ณด๊ณ ์๋น์ค์ ๊ธฐ๋กํ๋ ๊ณณ์ ๋๋ค.render()
:this.state.hasError
๊ฐtrue
์ด๋ฉด, ๋์ฒด UI(์ด ๊ฒฝ์ฐ ๊ฐ๋จํ ์ค๋ฅ ๋ฉ์์ง)๋ฅผ ๋ ๋๋งํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด,this.props.children
์ ์ฌ์ฉํ์ฌ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค.
2. ์ปดํฌ๋ํธ๋ฅผ ์ค๋ฅ ๊ฒฝ๊ณ๋ก ๊ฐ์ธ๊ธฐ
์ด์ ์ค๋ฅ ๊ฒฝ๊ณ ์ปดํฌ๋ํธ๊ฐ ์์ผ๋, ์ด๋ค ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ ๊ฐ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
๋ง์ฝ MyComponent
๋ ๊ทธ ํ์ ์ปดํฌ๋ํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด, ErrorBoundary
๊ฐ ์ด๋ฅผ ํฌ์ฐฉํ์ฌ ๋์ฒด UI๋ฅผ ๋ ๋๋งํ ๊ฒ์
๋๋ค.
3. ์ค๋ฅ ๊ธฐ๋กํ๊ธฐ
์ค๋ฅ ๊ฒฝ๊ณ์ ์ํด ํฌ์ฐฉ๋ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ์์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. componentDidCatch()
๋ฉ์๋๋ ์ด๋ฅผ ์ํ ์ด์์ ์ธ ์ฅ์์
๋๋ค.
Sentry, Bugsnag, ๋๋ Rollbar์ ๊ฐ์ ๋ค์ํ ์ค๋ฅ ๋ณด๊ณ ์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๋์ ํ๊ฒฝ์ ์ค๋ฅ๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์๋น์ค๋ ์ค๋ฅ ์ง๊ณ, ์คํ ํธ๋ ์ด์ค ๋ถ์, ์ฌ์ฉ์ ํผ๋๋ฐฑ ์์ง๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๊ฐ์์ logErrorToMyService()
ํจ์๋ฅผ ์ฌ์ฉํ๋ ์์:
componentDidCatch(error, errorInfo) {
logErrorToMyService(error, errorInfo);
console.error("Caught error: ", error, errorInfo);
}
์ค๋ฅ ๊ฒฝ๊ณ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
- ์ธ๋ถํ: ์ค๋ฅ ๊ฒฝ๊ณ์ ๋ํ ์ ์ ํ ์ธ๋ถํ ์์ค์ ๊ฒฐ์ ํ์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ์น์ ์ ๊ฐ์ธ๋ ๊ฒ์ ๋๋ฌด ๊ด๋ฒ์ํ ์ ์๊ณ , ๋ชจ๋ ๋จ์ผ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๋ ๊ฒ์ ๋๋ฌด ์ธ๋ถํ๋ ์ ์์ต๋๋ค. ๋ถํ์ํ ์ค๋ฒํค๋๋ฅผ ๋ง๋ค์ง ์์ผ๋ฉด์ ์ค๋ฅ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ฒฉ๋ฆฌํ๋ ๊ท ํ์ ๋ชฉํ๋ก ํ์ธ์. ์ข์ ์ ๊ทผ ๋ฐฉ์์ UI์ ๋ ๋ฆฝ์ ์ธ ์น์ ์ ๊ฐ์ธ๋ ๊ฒ์ ๋๋ค.
- ๋์ฒด UI: ์ฌ์ฉ์์๊ฒ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ฌ์ฉ์ ์นํ์ ์ธ ๋์ฒด UI๋ฅผ ๋์์ธํ์ธ์. ๊ธฐ์ ์ ์ธ ์ธ๋ถ ์ฌํญ์ด๋ ์คํ ํธ๋ ์ด์ค๋ฅผ ํ์ํ๋ ๊ฒ์ ํผํ์ธ์. ์ผ๋ฐ ์ฌ์ฉ์์๊ฒ๋ ๋์์ด ๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๋์ , ๊ฐ๋จํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ๊ณ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๊ฑฐ๋ ๊ณ ๊ฐ ์ง์์ ๋ฌธ์ํ๋ ๋ฑ์ ๊ฐ๋ฅํ ์กฐ์น๋ฅผ ์ ์ํ์ธ์. ์๋ฅผ ๋ค์ด, ์ ์์๊ฑฐ๋ ์ฌ์ดํธ์์๋ ๊ฒฐ์ ์ปดํฌ๋ํธ๊ฐ ์คํจํ๋ฉด ๋ค๋ฅธ ๊ฒฐ์ ๋ฐฉ๋ฒ์ ์๋ํ๋๋ก ์ ์ํ ์ ์๊ณ , ์์ ๋ฏธ๋์ด ์ฑ์์๋ ๋คํธ์ํฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํผ๋๋ฅผ ์๋ก๊ณ ์นจํ๋๋ก ์ ์ํ ์ ์์ต๋๋ค.
- ์ค๋ฅ ๋ณด๊ณ : ์ค๋ฅ ๊ฒฝ๊ณ์ ์ํด ํฌ์ฐฉ๋ ์ค๋ฅ๋ ํญ์ ์ค๋ฅ ๋ณด๊ณ ์๋น์ค์ ๊ธฐ๋กํ์ธ์. ์ด๋ฅผ ํตํด ํ๋ก๋์ ํ๊ฒฝ์์ ์ค๋ฅ๋ฅผ ์ถ์ ํ๊ณ ๊ฐ์ ํ ์์ญ์ ์๋ณํ ์ ์์ต๋๋ค. ์ค๋ฅ ๋ก๊ทธ์ ์ค๋ฅ ๋ฉ์์ง, ์คํ ํธ๋ ์ด์ค, ์ฌ์ฉ์ ์ปจํ ์คํธ์ ๊ฐ์ ์ถฉ๋ถํ ์ ๋ณด๊ฐ ํฌํจ๋๋๋ก ํ์ธ์.
- ๋ฐฐ์น: ์ปดํฌ๋ํธ ํธ๋ฆฌ์์ ์ ๋ต์ ์ผ๋ก ์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ๋ฐฐ์นํ์ธ์. ์ธ๋ถ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์ผ๋ฐ์ ์ผ๋ก ๋จ์ผ ์ค๋ฅ ๊ฒฝ๊ณ๋ก ์ ์ฒด ์ฑ์ ๊ฐ์ธ๊ธฐ๋ณด๋ค๋, ๊ฐ์ฅ ํ์ํ ๊ณณ์ ์ฌ๋ฌ ๊ฐ์ ๊ฒฝ๊ณ๋ฅผ ๋ฐฐ์นํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ํ๋กํ์ ํ์ํ๋ ์ปดํฌ๋ํธ, ์์ ์ ์ถ์ ์ฒ๋ฆฌํ๋ ์ปดํฌ๋ํธ, ๋๋ ํ์ฌ ์ง๋๋ฅผ ๋ ๋๋งํ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ์ ์์ต๋๋ค.
- ํ ์คํธ: ์ค๋ฅ ๊ฒฝ๊ณ๊ฐ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฒ ์ ํ ํ ์คํธํ์ธ์. ์ปดํฌ๋ํธ์์ ์ค๋ฅ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ณ ์ค๋ฅ ๊ฒฝ๊ณ๊ฐ ์ด๋ฅผ ํฌ์ฐฉํ์ฌ ๋์ฒด UI๋ฅผ ํ์ํ๋์ง ํ์ธํ์ธ์. Jest๋ React Testing Library์ ๊ฐ์ ๋๊ตฌ๋ ์ค๋ฅ ๊ฒฝ๊ณ์ ๋ํ ๋จ์ ๋ฐ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. API ์คํจ๋ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ ์ ๋ ฅ์ ์๋ฎฌ๋ ์ด์ ํ์ฌ ์ค๋ฅ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ์ด๋ฒคํธ ํธ๋ค๋ฌ์๋ ์ฌ์ฉํ์ง ์๊ธฐ: ์ค๋ฅ ๊ฒฝ๊ณ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ง ์์ต๋๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ React ๋ ๋ ํธ๋ฆฌ ์ธ๋ถ์์ ์คํ๋ฉ๋๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด ์ ํต์ ์ธ
try...catch
๋ธ๋ก์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. - ํด๋์ค ์ปดํฌ๋ํธ ์ฌ์ฉ: ์ค๋ฅ ๊ฒฝ๊ณ๋ ๋ฐ๋์ ํด๋์ค ์ปดํฌ๋ํธ์ฌ์ผ ํฉ๋๋ค. ํจ์ํ ์ปดํฌ๋ํธ๋ ํ์ํ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ๊ฒฝ๊ณ๊ฐ ๋ ์ ์์ต๋๋ค.
์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ์ฌ์ฉํ์ง *์์์ผ* ํ ๋
์ค๋ฅ ๊ฒฝ๊ณ๋ ๋งค์ฐ ์ ์ฉํ์ง๋ง, ๊ทธ ํ๊ณ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์ง ์์์ต๋๋ค:
- ์ด๋ฒคํธ ํธ๋ค๋ฌ: ์์ ์ธ๊ธํ๋ฏ์ด ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ค๋ฅ๋
try...catch
๋ธ๋ก์ด ํ์ํฉ๋๋ค. - ๋น๋๊ธฐ ์ฝ๋: ๋น๋๊ธฐ ์์
(์:
setTimeout
,requestAnimationFrame
)์์์ ์ค๋ฅ๋ ์ค๋ฅ ๊ฒฝ๊ณ์ ์ํด ํฌ์ฐฉ๋์ง ์์ต๋๋ค.try...catch
๋ธ๋ก์ด๋ Promise์.catch()
๋ฅผ ์ฌ์ฉํ์ธ์. - ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง: ์ค๋ฅ ๊ฒฝ๊ณ๋ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง ํ๊ฒฝ์์๋ ๋ค๋ฅด๊ฒ ์๋ํฉ๋๋ค.
- ์ค๋ฅ ๊ฒฝ๊ณ ์์ฒด ๋ด์ ์ค๋ฅ: ์ค๋ฅ ๊ฒฝ๊ณ ์ปดํฌ๋ํธ ์์ฒด ๋ด์ ์ค๋ฅ๋ ๋์ผํ ์ค๋ฅ ๊ฒฝ๊ณ์ ์ํด ํฌ์ฐฉ๋์ง ์์ต๋๋ค. ์ด๋ ๋ฌดํ ๋ฃจํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
์ค๋ฅ ๊ฒฝ๊ณ์ ๊ธ๋ก๋ฒ ์ฌ์ฉ์
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ๋ ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ค์์ฑ์ ๋์ฑ ์ปค์ง๋๋ค. ์ค๋ฅ ๊ฒฝ๊ณ๊ฐ ๊ธฐ์ฌํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ง์ญํ ๋ฌธ์ : ๋ค๋ฅธ ๋ก์ผ์ผ์ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์์ด๋ ๋ฌธ์ ์งํฉ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ค๋ฅ ๊ฒฝ๊ณ๋ ์์์น ๋ชปํ ์ง์ญํ ๋ฐ์ดํฐ๋ก ์ธํ ์ค๋ฅ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ์ง ํ์ ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํน์ ๋ก์ผ์ผ์ ๋ํด ์ ํจํ์ง ์์ ๋ ์ง ๋ฌธ์์ด์ ๋ง๋๋ฉด ์ค๋ฅ ๊ฒฝ๊ณ๊ฐ ์ฌ์ฉ์ ์นํ์ ์ธ ๋ฉ์์ง๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
- API ์ฐจ์ด์ : ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ค๋ฅ ์๋ต์ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์๋ ์ฌ๋ฌ API์ ํตํฉ๋๋ ๊ฒฝ์ฐ, ์ค๋ฅ ๊ฒฝ๊ณ๋ ์์์น ๋ชปํ API ๋์์ผ๋ก ์ธํ ์ถฉ๋์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ๋คํธ์ํฌ ๋ถ์์ ์ฑ: ์ธ๊ณ ๊ฐ์ง์ ์ฌ์ฉ์๋ค์ ๋ค์ํ ์์ค์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ฑ์ ๊ฒฝํํ ์ ์์ต๋๋ค. ์ค๋ฅ ๊ฒฝ๊ณ๋ ๋คํธ์ํฌ ํ์์์์ด๋ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ธํ ์ค๋ฅ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์์์น ๋ชปํ ์ฌ์ฉ์ ์ ๋ ฅ: ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌธํ์ ์ฐจ์ด๋ ์ธ์ด ์ฅ๋ฒฝ์ผ๋ก ์ธํด ์์์น ๋ชปํ๊ฑฐ๋ ์ ํจํ์ง ์์ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ต๋๋ค. ์ค๋ฅ ๊ฒฝ๊ณ๋ ์ ํจํ์ง ์์ ์ ๋ ฅ์ผ๋ก ์ธํ ์ถฉ๋์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ผ๋ณธ์ ์ฌ์ฉ์๋ ๋ฏธ๊ตญ์ ์ฌ์ฉ์์ ๋ค๋ฅธ ํ์์ ์ ํ๋ฒํธ๋ฅผ ์ ๋ ฅํ ์ ์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๊ฒฝ์ฐ ๋ชจ๋๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
- ์ ๊ทผ์ฑ: ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋๋ ๋ฐฉ์์กฐ์ฐจ ์ ๊ทผ์ฑ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ ์ ๊ทผํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ARIA ์์ฑ์ ์ฌ์ฉํ๊ฑฐ๋ ์ค๋ฅ ๋ฉ์์ง์ ๋ํ ๋์ฒด ํ ์คํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
์์: ์ค๋ฅ ๊ฒฝ๊ณ๋ก API ์ค๋ฅ ์ฒ๋ฆฌํ๊ธฐ
๊ธ๋ก๋ฒ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌ์ ์ธ API ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
import React, { useState, useEffect } from 'react';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setUser(data);
} catch (e) {
setError(e);
} finally {
setLoading(false);
}
};
fetchData();
}, [userId]);
if (loading) {
return ์ฌ์ฉ์ ํ๋กํ ๋ก๋ฉ ์ค...
;
}
if (error) {
throw error; // ์ค๋ฅ๋ฅผ ErrorBoundary๋ก ๋์ง๋๋ค.
}
if (!user) {
return ์ฌ์ฉ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
;
}
return (
{user.name}
์ด๋ฉ์ผ: {user.email}
์์น: {user.location}
);
}
function App() {
return (
);
}
export default App;
์ด ์์ ์์ UserProfile
์ปดํฌ๋ํธ๋ API์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. API๊ฐ ์ค๋ฅ(์: 404 Not Found, 500 Internal Server Error)๋ฅผ ๋ฐํํ๋ฉด ์ปดํฌ๋ํธ๋ ์ค๋ฅ๋ฅผ ๋์ง๋๋ค. ErrorBoundary
์ปดํฌ๋ํธ๋ ์ด ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ฌ ๋์ฒด UI๋ฅผ ๋ ๋๋งํฉ๋๋ค.
์ค๋ฅ ๊ฒฝ๊ณ์ ๋์
์ค๋ฅ ๊ฒฝ๊ณ๋ ์์์น ๋ชปํ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ์ง๋ง, ์ ์ด์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ณ ๋ คํด์ผ ํ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ ์์ต๋๋ค:
- ํ์ ๊ฒ์ฌ (TypeScript, Flow): ํ์ ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ ์ค์ ํ์ ๊ด๋ จ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ฌ ํ๋ก๋์ ์ ๋ฐฐํฌ๋๊ธฐ ์ ์ ํด๊ฒฐํ ์ ์์ต๋๋ค. TypeScript์ Flow๋ JavaScript์ ์ ์ ํ์ดํ์ ์ถ๊ฐํ์ฌ ๋ณ์, ํจ์ ๋งค๊ฐ๋ณ์ ๋ฐ ๋ฐํ ๊ฐ์ ํ์ ์ ์ ์ํ ์ ์๊ฒ ํด์ค๋๋ค.
- ๋ฆฐํ (ESLint): ESLint์ ๊ฐ์ ๋ฆฐํฐ๋ ์ ์ฌ์ ์ธ ์ฝ๋ ํ์ง ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ์ฝ๋ฉ ํ์ค์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ESLint๋ ์ฌ์ฉ๋์ง ์๋ ๋ณ์, ๋๋ฝ๋ ์ธ๋ฏธ์ฝ๋ก , ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ ์ ์์ต๋๋ค.
- ๋จ์ ํ ์คํธ: ์ปดํฌ๋ํธ์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๊ณ ๋ฐฐํฌ ์ ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. Jest๋ React Testing Library์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด React ์ปดํฌ๋ํธ์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ: ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ๊ฒํ ํ๊ฒ ํ๋ฉด ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์๋ณํ๊ณ ์ฝ๋์ ์ ๋ฐ์ ์ธ ํ์ง์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ๋ฐฉ์ด์ ํ๋ก๊ทธ๋๋ฐ: ์ด๋ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์์ํ๊ณ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ์ฌ null ๊ฐ์ด๋ ์ ํจํ์ง ์์ ์ ๋ ฅ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
React ์ค๋ฅ ๊ฒฝ๊ณ๋ ํนํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํด ์ค๊ณ๋ ๊ฒฌ๊ณ ํ๊ณ ๋ณต์๋ ฅ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. ์ค๋ฅ๋ฅผ ์ฐ์ํ๊ฒ ํฌ์ฐฉํ๊ณ ๋์ฒด UI๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค. ๊ทธ ๋ชฉ์ , ๊ตฌํ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํจ์ผ๋ก์จ ์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ํ์ฉํ์ฌ ํ๋ ์น์ ๋ณต์ก์ฑ์ ์ฒ๋ฆฌํ ์ ์๋ ๋ ์์ ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
ํฌ๊ด์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ ์ ๋ต์ ์๋ฆฝํ๋ ค๋ฉด ์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ํ์ ๊ฒ์ฌ, ๋ฆฐํ , ๋จ์ ํ ์คํธ์ ๊ฐ์ ๋ค๋ฅธ ์ค๋ฅ ๋ฐฉ์ง ๊ธฐ์ ๊ณผ ๊ฒฐํฉํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
์ด๋ฌํ ๊ธฐ์ ์ ์ฑํํจ์ผ๋ก์จ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ด๋ฉฐ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์ ๋์ ์ ๋ ์ ๋์ฒํ ์ ์๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.