230831(๋ชฉ)
๐ค ์ฑ์ฅ์ผ์ง 7.0
์ฑ
ํ๋ณตํ ์ด๊ธฐ์ฃผ์์(์จ์ธ ๋ค์ด์ด)
์ ๋ด์ฉ์ ์๊ทน๋ฐ์ ์์ํ๋ ์๋ฐํ ์ฑ์ฅ๊ธฐ๋ก
์ด์์๋ ๊ฝ๊ณผ ์ฃฝ์ ๊ฝ์ ์ด๋ป๊ฒ ๊ตฌ๋ณํ๋๊ฐ?
์ฑ์ฅํ๊ณ ์๋ ๊ฒ์ด ์ด์ ์๋ ๊ฒ์ด๋ค.
์๋ช ์ ์ ์ผํ ์ฆ๊ฑฐ๋ ์ฑ์ฅ์ด๋ค!
โ (7.0)<์์ ๊ฐํธ>
ํ์ธ๋ง ํ์ต๋ฒ
์ ์๊ฒ ๋๋งํผ, ์ฑ์ฅ์ผ์ง๋ ์ ๋ง ๊ทธ ๋ ์ ํค์๋ ์ค์ฌ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋๋ก ํ๋ค.
โ๏ธ ํค์๋: ์ง๊ด์ ์ด๊ณ ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ์์ฑ
๋ฌดํ ์คํฌ๋กค
์ด์ ๋ ๋ง์ด ์ต์ํด์ง UX๋ก, ์ ์ ๊ฐ ์คํฌ๋กค์ ๋ด๋ฆด ๋๋ง๋ค ํน์ ์์น์์ data๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ด๋ค. ์ด๋ฅผ ํตํด ์ ์ ๋ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ณ , ์๋ฒ๋ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ง ์์๋ ๋๋ค.
์์ ์๋ ์ ์ ์ viewpoint์ ์์น๋ฅผ ๊ณ์ฐํ์ฌ ํน์ ์์น์ ๋๋ฌํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ด์๋ค๋ฉด, ์ด์ ๋ Intersection Observer API๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์์๊ฐ viewport์ ๋ค์ด์ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
Intersection Observer API๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์์ ์์น๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ด ์๋๋ผ, ๋ธ๋ผ์ฐ์ ์ viewport์ ์์์ ์์น๋ฅผ ๋น๊ตํ์ฌ ์์๊ฐ viewport์ ๋ค์ด์ค๋ฉด ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ค ํจ์๋ฅผ ์คํํ ์ ์๊ฒ ํ๋ค. ๋ฌดํ ์คํฌ๋กค์ ๊ตฌํํ ๋๋, ์ฝ๋ฐฑ ํจ์์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ํจ์๋ฅผ ์คํํ๋ฉด ๋๋ค.
Error Boundary
React์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ๋ก, ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ์ด๋์์๋ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๊ณ , ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด๊ฐ ์ฌ๋ผ์ง๊ฒ ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋ฌ๊ฐ ๋ฐ์ํ ์ปดํฌ๋ํธ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์๋ฌ๋ฅผ ์ก์๋ด๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ง ๊ทธ๋๋ก ์ปดํฌ๋ํธ ๊ณ์ธต ๊ตฌ์กฐ์์ ํน์ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ๊ทธ ๋ฐ๊นฅ์ผ๋ก ์๋ฌ๋ฅผ ์ ๋ฌํ์ง ์๊ณ ๋ด๋ถ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
ํํ ์ฐ๋ฆฌ๊ฐ ์ด๋ค ์น ์ฌ์ดํธ์ ์ผ๋ถ๋ถ๋ง ์๋ฌ ํ์ด์ง๋ก ์ด๋ํ๋ ๊ฒ์ ๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๊ฐ ๋ฐ๋ก Error Boundary๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ด๋ค.
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
// ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ํธ์ถ๋๋ ๋ฉ์๋
static getDerivedStateFromError(error) {
// ๋ค์ ๋ ๋๋ง์์ ํด๋ฐฑ UI๊ฐ ๋ณด์ด๋๋ก ์ํ๋ฅผ ์
๋ฐ์ดํธ
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// ์๋ฌ ๋ฆฌํฌํ
์๋น์ค์ ์๋ฌ๋ฅผ ๊ธฐ๋กํ ์๋ ์๋ค.
logErrorToMyService(error, errorInfo);
}
render() {
if (this.state.hasError) {
// ํด๋ฐฑ UI๋ฅผ ์ปค์คํ
ํ์ฌ ๋ ๋๋งํ ์ ์๋ค.
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
React Router์ errorElement
React Router์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ๋ก, ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ํน์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ด๋ค. React์ Error Boundary์ ๋น์ทํด๋ณด์ด์ง๋ง Error Boundary๋ ํน์ ์ปดํฌ๋ํธ ํธ๋ฆฌ ๊ตฌ๊ฐ์์์ ์๋ฌ๋ฅผ ํธ๋ค๋งํ์ฌ UI๋ก ๋ณด์ฌ์ค ์ ์๋ค๋ฉด React Router์ errorElement๋ ํน์ ๊ฒฝ๋ก(route path)์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๋๋ง ํน์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๐ ํ๊ณ
๊ตฌํํด๋์๋ ๋ฌดํ ์คํฌ๋กค ๊ตฌํ ๋ถ๋ถ์ ์์ ํ๊ณ ์๋ฌ ๋ฐ์ด๋๋ฆฌ์ ๋ํด์ ๊ณต๋ถํ๋ค. ์ค๋ ์ผ์ง์๋ ์๋ ๋ด์ฉ์ด์ง๋ง, useQuery์ ๋น์ทํ๊ฒ ๊ตฌํํ ์ปค์คํ ํ ์์ isLoading์ ํตํด Loading ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ฒ ํ๋ ค๋๋ฐ ์ ๋์ง ์์์โฆ ๋ด์ผ๋ ์ด ๋ถ๋ถ์ ๋ํด์ ์์ ํด๋ณผ ์์ ์ด๋ค.