React Suspense ๋ฆฌ์์ค ํ์์์์ ์์๋ณด์ธ์. ๋ก๋ฉ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ , ๋ฌดํ ๋ก๋ฉ ํ๋ฉด์ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฐ๋๋ผ์ธ์ ์ค์ ํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ์ต์ ํํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค.
React Suspense ๋ฆฌ์์ค ํ์์์: ํฅ์๋ UX๋ฅผ ์ํ ๋ก๋ฉ ๋ฐ๋๋ผ์ธ ๊ด๋ฆฌ
React Suspense๋ ๋ฐ์ดํฐ ํ์นญ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ๋ ์ํํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋์ ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ ํ ๊ด๋ฆฌ ์์ด๋ ๊ธด ๋ก๋ฉ ์๊ฐ์ด ์ฌ์ฉ์์๊ฒ ๋ถํธํ ๊ฒฝํ์ ์ค ์ ์์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ React Suspense ๋ฆฌ์์ค ํ์์์์ด ํ์ํ๋ฉฐ, ๋ก๋ฉ ์ํ์ ๋ํ ๋ฐ๋๋ผ์ธ์ ์ค์ ํ๊ณ ๋ฌดํ ๋ก๋ฉ ํ๋ฉด์ ๋ฐฉ์งํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ Suspense ๋ฆฌ์์ค ํ์์์์ ๊ฐ๋ , ๊ตฌํ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ ์ธ๊ณ ๋ค์ํ ์ฌ์ฉ์๋ค์๊ฒ ์ํํ๊ณ ๋ฐ์์ฑ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
React Suspense์ ๊ทธ ๊ณผ์ ์ดํดํ๊ธฐ
React Suspense๋ ์ปดํฌ๋ํธ๊ฐ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ ๋๋ง์ "์ผ์ ์ค๋จ"ํ ์ ์๊ฒ ํด์ค๋๋ค. ๋น ํ๋ฉด์ด๋ ์ผ๊ด์ฑ ์๋ UI๋ฅผ ํ์ํ๋ ๋์ , Suspense๋ ์ผ๋ฐ์ ์ผ๋ก ๋ก๋ฉ ์คํผ๋๋ ๊ฐ๋จํ ๋ฉ์์ง์ ๊ฐ์ ํด๋ฐฑ UI๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. ์ด๋ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ๊ฐ์์ค๋ฌ์ด UI ๋ณํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋น๋๊ธฐ ์์ ์ด ์์๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๊ฑฐ๋, ๋ ์ฌํ๊ฒ๋ ์์ ํ ์คํจํ ๋ ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฌ์ฉ์๋ ๋ก๋ฉ ์คํผ๋๋ฅผ ๋ฌด๊ธฐํ์ผ๋ก ์ณ๋ค๋ณด๊ฒ ๋์ด ์ข์ ๊ฐ์ ๋๋ผ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ดํํ ์ ์์ต๋๋ค. ๋คํธ์ํฌ ์ง์ฐ, ๋๋ฆฐ ์๋ฒ ์๋ต, ๋๋ ์๊ธฐ์น ์์ ์ค๋ฅ ๋ฑ์ด ๋ชจ๋ ์ด๋ฌํ ์ฅ๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์์ธ์ด ๋ ์ ์์ต๋๋ค. ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋ถ์์ ํ ์ง์ญ์ ์ฌ์ฉ์๋ฅผ ๊ณ ๋ คํ๋ฉด, ํ์์์์ ๊ทธ๋ค์๊ฒ ํจ์ฌ ๋ ์ค์ํฉ๋๋ค.
React Suspense ๋ฆฌ์์ค ํ์์์ ์๊ฐ
React Suspense ๋ฆฌ์์ค ํ์์์์ ์ผ์ ์ค๋จ๋ ๋ฆฌ์์ค(์: API ๋ฐ์ดํฐ)๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ์๊ฐ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๋ง์ฝ ๋ฆฌ์์ค๊ฐ ์ง์ ๋ ์๊ฐ ๋ด์ ํด๊ฒฐ๋์ง ์์ผ๋ฉด, Suspense๋ ์ค๋ฅ ๋ฉ์์ง๋ ๊ธฐ๋ฅ์ด ์ ํ๋์์ง๋ง ์๋ํ๋ ๋ฒ์ ์ ์ปดํฌ๋ํธ์ ๊ฐ์ ๋์ฒด UI๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ๋ฌดํ ๋ก๋ฉ ์ํ์ ๋น ์ง์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ด๋ฅผ ๋ก๋ฉ ๋ฐ๋๋ผ์ธ์ ์ค์ ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ๋ฆฌ์์ค๊ฐ ๋ฐ๋๋ผ์ธ ์ ์ ๋์ฐฉํ๋ฉด ์ปดํฌ๋ํธ๋ ์ ์์ ์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค. ๋ฐ๋๋ผ์ธ์ด ์ง๋๋ฉด ํด๋ฐฑ ๋ฉ์ปค๋์ฆ์ด ํ์ฑํ๋์ด ์ฌ์ฉ์๊ฐ ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ์ํ๋ก ๋จ๊ฒจ์ง๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
Suspense ๋ฆฌ์์ค ํ์์์ ๊ตฌํํ๊ธฐ
React ์์ฒด์๋ Suspense๋ฅผ ์ํ ๋ด์ฅ `timeout` prop์ด ์์ง๋ง, React์ ์ค๋ฅ ๊ฒฝ๊ณ(Error Boundaries)์ ํ์์์ ๊ด๋ฆฌ๋ฅผ ์ํ ์ปค์คํ ๋ก์ง์ ์กฐํฉํ์ฌ ์ด ๊ธฐ๋ฅ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. ๋ค์์ ๊ตฌํ์ ๋ํ ์ค๋ช ์ ๋๋ค:
1. ์ปค์คํ ํ์์์ ๋ํผ ์์ฑํ๊ธฐ
ํต์ฌ ์์ด๋์ด๋ ํ์์์์ ๊ด๋ฆฌํ๊ณ , ํ์์์์ด ๋ง๋ฃ๋๋ฉด ์ค์ ์ปดํฌ๋ํธ ๋๋ ํด๋ฐฑ UI๋ฅผ ์กฐ๊ฑด๋ถ๋ก ๋ ๋๋งํ๋ ๋ํผ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์ด ๋ํผ ์ปดํฌ๋ํธ๋ ๋ค์์ ์ํํฉ๋๋ค:
- ๋ ๋๋งํ ์ปดํฌ๋ํธ๋ฅผ prop์ผ๋ก ๋ฐ์ต๋๋ค.
- ์ต๋ ๋๊ธฐ ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ง์ ํ๋ `timeout` prop์ ๋ฐ์ต๋๋ค.
- ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ํ์ด๋จธ๋ฅผ ์์ํ๊ธฐ ์ํด `useEffect`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๊ธฐ ์ ์ ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋๋ฉด, ํ์์์์ด ๋ฐ์ํ์์ ๋ํ๋ด๋ ์ํ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
- ํ์์์์ด ๋ฐ์ํ์ง *์์์* ๊ฒฝ์ฐ์๋ง ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ํด๋ฐฑ UI๋ฅผ ๋ ๋๋งํฉ๋๋ค.
์ด ๋ํผ ์ปดํฌ๋ํธ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
import React, { useState, useEffect } from 'react';
function TimeoutWrapper({ children, timeout, fallback }) {
const [timedOut, setTimedOut] = useState(false);
useEffect(() => {
const timer = setTimeout(() => {
setTimedOut(true);
}, timeout);
return () => clearTimeout(timer); // ์ธ๋ง์ดํธ ์ ์ ๋ฆฌ
}, [timeout]);
if (timedOut) {
return fallback;
}
return children;
}
export default TimeoutWrapper;
์ค๋ช :
- `useState(false)`๋ ์ํ ๋ณ์ `timedOut`์ `false`๋ก ์ด๊ธฐํํฉ๋๋ค.
- `useEffect`๋ `setTimeout`์ ์ฌ์ฉํ์ฌ ํ์์์์ ์ค์ ํฉ๋๋ค. ํ์์์์ด ๋ง๋ฃ๋๋ฉด `setTimedOut(true)`๊ฐ ํธ์ถ๋ฉ๋๋ค.
- ์ ๋ฆฌ ํจ์ `clearTimeout(timer)`๋ ์ปดํฌ๋ํธ๊ฐ ํ์์์ ๋ง๋ฃ ์ ์ ์ธ๋ง์ดํธ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- `timedOut`์ด true์ด๋ฉด `fallback` prop์ด ๋ ๋๋ง๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด `children` prop(๋ ๋๋ง๋ ์ปดํฌ๋ํธ)์ด ๋ ๋๋ง๋ฉ๋๋ค.
2. ์ค๋ฅ ๊ฒฝ๊ณ(Error Boundaries) ์ฌ์ฉํ๊ธฐ
์ค๋ฅ ๊ฒฝ๊ณ๋ ํ์ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ด๋์์๋ JavaScript ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ , ํด๋น ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๋ฉฐ, ์ ์ฒด ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ์ถฉ๋์ํค๋ ๋์ ํด๋ฐฑ UI๋ฅผ ํ์ํ๋ React ์ปดํฌ๋ํธ์ ๋๋ค. ์ด๋ ๋น๋๊ธฐ ์์ ์ค์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ(์: ๋คํธ์ํฌ ์ค๋ฅ, ์๋ฒ ์ค๋ฅ)๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด๊ฒ์ `TimeoutWrapper`๋ฅผ ๋ณด์ํ๋ ํ์ ์์๋ก, ํ์์์ ๋ฌธ์ *๋ฟ๋ง ์๋๋ผ* ์ค๋ฅ๋ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค.
๋ค์์ ๊ฐ๋จํ ์ค๋ฅ ๊ฒฝ๊ณ ์ปดํฌ๋ํธ์ ๋๋ค:
import React from 'react';
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// ๋ค์ ๋ ๋๋ง์์ ํด๋ฐฑ UI๋ฅผ ํ์ํ๋๋ก ์ํ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// ์ค๋ฅ ๋ณด๊ณ ์๋น์ค์ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ ์๋ ์์ต๋๋ค.
console.error(error, errorInfo);
}
render() {
if (this.state.hasError) {
// ์ํ๋ ์ปค์คํ
ํด๋ฐฑ UI๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค.
return this.props.fallback;
}
return this.props.children;
}
}
export default ErrorBoundary;
์ค๋ช :
- `getDerivedStateFromError`๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ์ ์ ๋ฉ์๋์ ๋๋ค.
- `componentDidCatch`๋ ์ค๋ฅ์ ์ค๋ฅ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ ์ ์๊ฒ ํด์ฃผ๋ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์ ๋๋ค.
- `this.state.hasError`๊ฐ true์ด๋ฉด `fallback` prop์ด ๋ ๋๋ง๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด `children` prop์ด ๋ ๋๋ง๋ฉ๋๋ค.
3. Suspense, TimeoutWrapper, ์ค๋ฅ ๊ฒฝ๊ณ ํตํฉํ๊ธฐ
์ด์ ์ด ์ธ ๊ฐ์ง ์์๋ฅผ ๊ฒฐํฉํ์ฌ ํ์์์ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํฌํจํ ๋ก๋ฉ ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค:
import React, { Suspense } from 'react';
import TimeoutWrapper from './TimeoutWrapper';
import ErrorBoundary from './ErrorBoundary';
function MyComponent() {
// ๋น๋๊ธฐ ๋ฐ์ดํฐ ํ์นญ ์์
์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค.
const fetchData = () => {
return new Promise(resolve => {
setTimeout(() => {
// ์ฑ๊ณต์ ์ธ ๋ฐ์ดํฐ ํ์นญ์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค.
resolve('๋ฐ์ดํฐ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์์ต๋๋ค!');
// ์ค๋ฅ๋ฅผ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค. ErrorBoundary๋ฅผ ํ
์คํธํ๋ ค๋ฉด ์ฃผ์์ ํด์ ํ์ธ์:
//reject(new Error("๋ฐ์ดํฐ ํ์นญ ์คํจ!"));
}, 2000); // 2์ด ์ง์ฐ์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค.
});
};
// Suspense๋ฅผ ์ํด ํ๋ก๋ฏธ์ค๋ฅผ React.lazy๋ก ๊ฐ์๋๋ค.
const LazyDataComponent = React.lazy(() => fetchData().then(data => ({ default: () => <p>{data}</p> })));
return (
<ErrorBoundary fallback={<p>๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.</p>}>
<Suspense fallback={<p>๋ก๋ฉ ์ค...</p>}>
<TimeoutWrapper timeout={3000} fallback={<p>๋ก๋ฉ ์๊ฐ์ด ์ด๊ณผ๋์์ต๋๋ค. ๋์ค์ ๋ค์ ์๋ํด์ฃผ์ธ์.</p>}>
<LazyDataComponent />
</TimeoutWrapper>
</Suspense>
</ErrorBoundary>
);
}
export default MyComponent;
์ค๋ช :
- `React.lazy`๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ง์ฐ ๋ก๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํฉ๋๋ค.
- `Suspense`๋ก `LazyDataComponent`๋ฅผ ๊ฐ์ธ ๋ฐ์ดํฐ๊ฐ ํ์นญ๋๋ ๋์ ๋ก๋ฉ ํด๋ฐฑ์ ํ์ํฉ๋๋ค.
- `Suspense` ์ปดํฌ๋ํธ๋ฅผ `TimeoutWrapper`๋ก ๊ฐ์ธ ๋ก๋ฉ ํ๋ก์ธ์ค์ ๋ํ ํ์์์์ ์ค์ ํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ํ์์์ ๋ด์ ๋ก๋๋์ง ์์ผ๋ฉด `TimeoutWrapper`๊ฐ ํ์์์ ํด๋ฐฑ์ ํ์ํฉ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก, ์ ์ฒด ๊ตฌ์กฐ๋ฅผ `ErrorBoundary`๋ก ๊ฐ์ธ ๋ก๋ฉ ๋๋ ๋ ๋๋ง ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
4. ๊ตฌํ ํ ์คํธํ๊ธฐ
์ด๋ฅผ ํ ์คํธํ๋ ค๋ฉด `fetchData`์ `setTimeout` ์ง์ ์๊ฐ์ `TimeoutWrapper`์ `timeout` prop๋ณด๋ค ๊ธธ๊ฒ ์์ ํด๋ณด์ธ์. ํด๋ฐฑ UI๊ฐ ๋ ๋๋ง๋๋ ๊ฒ์ ๊ด์ฐฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ `setTimeout` ์ง์ ์๊ฐ์ ํ์์์๋ณด๋ค ์งง๊ฒ ์ค์ฌ ์ฑ๊ณต์ ์ธ ๋ฐ์ดํฐ ๋ก๋ฉ์ ํ์ธํ์ธ์.
ErrorBoundary๋ฅผ ํ ์คํธํ๋ ค๋ฉด `fetchData` ํจ์์์ `reject` ๋ผ์ธ์ ์ฃผ์์ ํด์ ํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ค๋ฅ๊ฐ ์๋ฎฌ๋ ์ด์ ๋๊ณ ErrorBoundary ํด๋ฐฑ์ด ํ์๋ฉ๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๊ณ ๋ ค ์ฌํญ
- ์ ์ ํ ํ์์์ ๊ฐ ์ ํ: ์ ์ ํ ํ์์์ ๊ฐ์ ์ ํํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋๋ฌด ์งง์ ํ์์์์ ๋คํธ์ํฌ ์ํ ๋๋ฌธ์ ๋ฆฌ์์ค ๋ก๋๊ฐ ์กฐ๊ธ ๋ ๊ฑธ๋ฆด ๋ ๋ถํ์ํ๊ฒ ํธ๋ฆฌ๊ฑฐ๋ ์ ์์ต๋๋ค. ๋๋ฌด ๊ธด ํ์์์์ ๋ฌดํ ๋ก๋ฉ ์ํ๋ฅผ ๋ฐฉ์งํ๋ ค๋ ๋ชฉ์ ์ ๋ฌด์๋ฏธํ๊ฒ ๋ง๋ญ๋๋ค. ๋์ ์ฌ์ฉ์์ ์ง์ญ๋ณ ์ผ๋ฐ์ ์ธ ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ, ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ์ ๋ณต์ก์ฑ, ์ฌ์ฉ์์ ๊ธฐ๋์น์ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ธ์. ๋ค์ํ ์ง๋ฆฌ์ ์์น์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ์ฐธ๊ณ ํ์ธ์.
- ์ ๋ณด ์ ๊ณต์ ์ธ ํด๋ฐฑ UI ์ ๊ณต: ํด๋ฐฑ UI๋ ์ฌ์ฉ์์๊ฒ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ช ํํ๊ฒ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๋จ์ํ ์ผ๋ฐ์ ์ธ "์ค๋ฅ" ๋ฉ์์ง๋ฅผ ํ์ํ๋ ๋์ ๋ ๋ง์ ๋งฅ๋ฝ์ ์ ๊ณตํ์ธ์. ์๋ฅผ ๋ค์ด: "๋ฐ์ดํฐ ๋ก๋ฉ์ด ์์๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฝ๋๋ค. ์ธํฐ๋ท ์ฐ๊ฒฐ์ ํ์ธํ๊ฑฐ๋ ๋์ค์ ๋ค์ ์๋ํด์ฃผ์ธ์." ๋๋ ๊ฐ๋ฅํ๋ค๋ฉด, ๊ธฐ๋ฅ์ด ์ ํ๋์์ง๋ง ์๋ํ๋ ๋ฒ์ ์ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํ์ธ์.
- ์์ ์ฌ์๋: ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํ์์์ ํ ์ฌ์ฉ์์๊ฒ ์์ ์ ์ฌ์๋ํ ์ ์๋ ์ต์ ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ ์ ํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ ํ์นญ์ ๋ค์ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฒํผ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋, ํนํ ์ด๊ธฐ ์คํจ๊ฐ ์๋ฒ ์ธก ๋ฌธ์ ๋ก ์ธํ ๊ฒฝ์ฐ ๋ฐ๋ณต์ ์ธ ์์ฒญ์ผ๋ก ์๋ฒ์ ๊ณผ๋ถํ๋ฅผ ์ค ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์. ์ง์ฐ ์๊ฐ์ด๋ ๋น์จ ์ ํ ๋ฉ์ปค๋์ฆ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น : ํ์์์ ๋ฐ ์ค๋ฅ์ ๋น๋๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น ์ ๊ตฌํํ์ธ์. ์ด ๋ฐ์ดํฐ๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ํ๊ท ๋ก๋ฉ ์๊ฐ, ํ์์์ ๋น์จ, ์ค๋ฅ ์ ํ๊ณผ ๊ฐ์ ์งํ๋ฅผ ์ถ์ ํ์ธ์. Sentry, Datadog ๋๋ ์ ์ฌํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ๋ถ์ํ์ธ์.
- ๊ตญ์ ํ (i18n): ๋ค๋ฅธ ์ง์ญ์ ์ฌ์ฉ์๊ฐ ์ดํดํ ์ ์๋๋ก ํด๋ฐฑ ๋ฉ์์ง๋ฅผ ๊ตญ์ ํํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. `react-i18next`์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ์ ๊ด๋ฆฌํ์ธ์. ์๋ฅผ ๋ค์ด, "๋ก๋ฉ ์๊ฐ์ด ์ด๊ณผ๋์์ต๋๋ค" ๋ฉ์์ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ง์ํ๋ ๋ชจ๋ ์ธ์ด๋ก ๋ฒ์ญ๋์ด์ผ ํฉ๋๋ค.
- ์ ๊ทผ์ฑ (a11y): ํด๋ฐฑ UI๊ฐ ์ฅ์ ๋ฅผ ๊ฐ์ง ์ฌ์ฉ์์๊ฒ๋ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๋ณด์ฅํ์ธ์. ์คํฌ๋ฆฐ ๋ฆฌ๋์๊ฒ ์๋ฏธ๋ก ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ ์ ํ ARIA ์์ฑ์ ์ฌ์ฉํ์ธ์. ์๋ฅผ ๋ค์ด, ๋ก๋ฉ ์ํ์ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฆฌ๊ธฐ ์ํด `aria-live="polite"`๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ ์ง์ ํฅ์: ๋คํธ์ํฌ ์ฅ์ ๋ฐ ๋๋ฆฐ ์ฐ๊ฒฐ์ ํ๋ ฅ์ ์ผ๋ก ๋์ํ ์ ์๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํ์ธ์. ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)์ด๋ ์ ์ ์ฌ์ดํธ ์์ฑ(SSG)๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ ์ธก JavaScript๊ฐ ๋ก๋๋๊ฑฐ๋ ์คํ๋์ง ์์ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ ๋ฒ์ ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- ๋๋ฐ์ด์ฑ/์ค๋กํ๋ง: ์ฌ์๋ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ ๋, ์ฌ์ฉ์๊ฐ ์ค์๋ก ์ฌ์๋ ๋ฒํผ์ ์ฐํํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋๋ฐ์ด์ฑ์ด๋ ์ค๋กํ๋ง์ ์ฌ์ฉํ์ธ์.
์ค์ ์ ์ฉ ์ฌ๋ก
Suspense ๋ฆฌ์์ค ํ์์์์ด ์ค์ ์๋๋ฆฌ์ค์์ ์ด๋ป๊ฒ ์ ์ฉ๋ ์ ์๋์ง ๋ช ๊ฐ์ง ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ์ ์ ์๊ฑฐ๋ ์น์ฌ์ดํธ: ์ ํ ํ์ด์ง์์ ์ ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ๋ก๋ฉ ์คํผ๋๋ฅผ ํ์ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ ๋๋ค. Suspense ๋ฆฌ์์ค ํ์์์์ ์ฌ์ฉํ๋ฉด ํน์ ์๊ฐ ์ด๊ณผ ํ "์ ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐ ํ์๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฝ๋๋ค. ์ธํฐ๋ท ์ฐ๊ฒฐ์ ํ์ธํ๊ฑฐ๋ ๋์ค์ ๋ค์ ์๋ํด์ฃผ์ธ์."์ ๊ฐ์ ๋ฉ์์ง๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ๋๋ ์ ์ฒด ์ธ๋ถ ์ ๋ณด๊ฐ ์์ง ๋ก๋๋๋ ๋์ ๊ธฐ๋ณธ ์ ๋ณด(์: ์ ํ๋ช ๋ฐ ๊ฐ๊ฒฉ)๋ง ํฌํจ๋ ๋จ์ํ๋ ๋ฒ์ ์ ์ ํ ํ์ด์ง๋ฅผ ํ์ํ ์๋ ์์ต๋๋ค.
- ์์ ๋ฏธ๋์ด ํผ๋: ์ฌ์ฉ์์ ์์ ๋ฏธ๋์ด ํผ๋๋ฅผ ๋ก๋ํ๋ ๊ฒ์ ํนํ ์ด๋ฏธ์ง์ ๋น๋์ค๊ฐ ์์ ๋ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ํ์์์์ ์ค์ ํ์ฌ "ํ์ฌ ์ ์ฒด ํผ๋๋ฅผ ๋ก๋ํ ์ ์์ต๋๋ค. ์ต๊ทผ ๊ฒ์๋ฌผ ์ผ๋ถ๋ฅผ ํ์ํฉ๋๋ค."์ ๊ฐ์ ๋ฉ์์ง๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ฌ ๋ถ๋ถ์ ์ด์ง๋ง ์ฌ์ ํ ์ ์ฉํ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์๊ฐํ ๋์๋ณด๋: ๋ณต์กํ ๋ฐ์ดํฐ ์๊ฐํ๋ฅผ ๊ฐ์ ธ์ ๋ ๋๋งํ๋ ๊ฒ์ ๋๋ฆด ์ ์์ต๋๋ค. ํ์์์์ ์ค์ ํ์ฌ "๋ฐ์ดํฐ ์๊ฐํ์ ์์๋ณด๋ค ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ๋ฐ์ดํฐ์ ์ ์ ์ค๋ ์ท์ ํ์ํฉ๋๋ค."์ ๊ฐ์ ๋ฉ์์ง๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ฌ ์ ์ฒด ์๊ฐํ๊ฐ ๋ก๋๋๋ ๋์ ํ๋ ์ด์คํ๋๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์ง๋ ์ ํ๋ฆฌ์ผ์ด์ : ์ง๋ ํ์ผ์ด๋ ์ง์ค์ฝ๋ฉ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๊ฒ์ ์ธ๋ถ ์๋น์ค์ ์์กดํ ์ ์์ต๋๋ค. ํ์์์์ ์ฌ์ฉํ์ฌ ํด๋ฐฑ ์ง๋ ์ด๋ฏธ์ง๋ ์ฐ๊ฒฐ ๋ฌธ์ ๋ฅผ ๋ํ๋ด๋ ๋ฉ์์ง๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
Suspense ๋ฆฌ์์ค ํ์์์ ์ฌ์ฉ์ ์ด์
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ๋ฌดํ ๋ก๋ฉ ํ๋ฉด์ ๋ฐฉ์งํ์ฌ ๋ ๋ฐ์์ฑ ์ข๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ญ๋๋ค.
- ๊ฐํ๋ ์ค๋ฅ ์ฒ๋ฆฌ: ์ค๋ฅ ๋ฐ ๋คํธ์ํฌ ์ฅ์ ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
- ์ฆ๊ฐ๋ ๋ณต์๋ ฅ: ๋๋ฆฐ ์ฐ๊ฒฐ ๋ฐ ์ ๋ขฐํ ์ ์๋ ์๋น์ค์ ๋ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์๋ ฅ์ ๋์ ๋๋ค.
- ๊ธ๋ก๋ฒ ์ ๊ทผ์ฑ: ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ฐ์ง ์ฌ๋ฌ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
๊ฒฐ๋ก
React Suspense ๋ฆฌ์์ค ํ์์์์ React ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ก๋ฉ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ฌดํ ๋ก๋ฉ ํ๋ฉด์ ๋ฐฉ์งํ๋ ์ ์ฉํ ๊ธฐ์ ์ ๋๋ค. Suspense, ์ค๋ฅ ๊ฒฝ๊ณ, ๊ทธ๋ฆฌ๊ณ ์ปค์คํ ํ์์์ ๋ก์ง์ ๊ฒฐํฉํจ์ผ๋ก์จ, ์ฌ์ฉ์์ ์์น๋ ๋คํธ์ํฌ ์ํ์ ๊ด๊ณ์์ด ๋ ๊ฒฌ๊ณ ํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ์ ํ ํ์์์ ๊ฐ์ ์ ํํ๊ณ , ์ ๋ณด ์ ๊ณต์ ์ธ ํด๋ฐฑ UI๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น ์ ๊ตฌํํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ด๋ฌํ ์์๋ค์ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ, Suspense ๋ฆฌ์์ค ํ์์์์ ํ์ฉํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋งค๋๋ฝ๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.