React์ use: ๋ฆฌ์์ค ํ
: ์ข
ํฉ ๊ฐ์ด๋ | MLOG | MLOGํ๊ตญ์ด
React์ use: ๋ฆฌ์์ค ํ
์ผ๋ก ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ๋ง์คํฐํ์ธ์. ๋ชจ๋ฒ ์ฌ๋ก, ๊ณ ๊ธ ๊ธฐ์ , ์ค์ ์์ ๋ฅผ ํตํด ๋ฐฐ์๋ด
๋๋ค.
React์ use: ๋ฆฌ์์ค ํ
: ์ข
ํฉ ๊ฐ์ด๋
React์ use:
ํ
์ ์ปดํฌ๋ํธ ๋ด์์ ์ง์ ๋ฆฌ์์ค ๋ก๋ฉ๊ณผ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ธ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ์์ ๋๊น์ง ๋ ๋๋ง์ ์ผ์ ์ค๋จํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ณ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์๋ use:
ํ
์ ๊ธฐ๋ณธ ์ฌํญ, ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ฉฐ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
use:
ํ
์ด๋ ๋ฌด์์ธ๊ฐ?
use:
ํ
์ Suspense์์ ํตํฉ์ ์ํด ์ค๊ณ๋ ํน๋ณํ React ํ
์
๋๋ค. Suspense๋ ์ปดํฌ๋ํธ๊ฐ API ๋ฐ์ดํฐ์ ๊ฐ์ด ๋ ๋๋งํ๊ธฐ ์ ์ ๋ฌด์ธ๊ฐ๋ฅผ "๊ธฐ๋ค๋ฆฌ๊ฒ" ํ๋ ๋ฉ์ปค๋์ฆ์
๋๋ค. use:
ํ
์ ์ปดํฌ๋ํธ๊ฐ ํ๋ก๋ฏธ์ค(promise)๋ ๋ค๋ฅธ ๋ฆฌ์์ค๋ฅผ ์ง์ "์ฝ๋๋ก" ํ์ฉํ๋ฉฐ, ๋ฆฌ์์ค๊ฐ ํด๊ฒฐ๋๊ฑฐ๋ ์ฌ์ฉ ๊ฐ๋ฅํด์ง ๋๊น์ง ์ปดํฌ๋ํธ๋ฅผ ์ผ์ ์ค๋จ์ํต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ useEffect
๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ ๋นํด ๋น๋๊ธฐ ์์
์ ์ฒ๋ฆฌํ๋ ๋ ์ ์ธ์ ์ด๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ด์งํฉ๋๋ค.
์ use:
๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น์?
use:
ํ
์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ฐ์ํ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ: ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํ ์๋ ์ํ ๊ด๋ฆฌ ๋ฐ
useEffect
ํธ์ถ์ ํ์์ฑ์ ์ ๊ฑฐํฉ๋๋ค.
- ์ ์ธ์ ์ ๊ทผ ๋ฐฉ์: ์ปดํฌ๋ํธ ๋ด์์ ์ง์ ๋ฐ์ดํฐ ์์กด์ฑ์ ๋ช
ํํ๊ฒ ํํํฉ๋๋ค.
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: Suspense๋ ๋ถ๋๋ฌ์ด ์ ํ๊ณผ ๋ก๋ฉ ์ํ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
- ๋ ๋์ ์ฑ๋ฅ: ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ค์ด๊ณ ๋ฆฌ์์ค ๋ก๋ฉ์ ์ต์ ํํฉ๋๋ค.
- ์ฝ๋ ๊ฐ๋
์ฑ: ์ปดํฌ๋ํธ ๋ก์ง์ ๋จ์ํํ๊ณ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค.
use:
์ ๊ธฐ๋ณธ
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
use:
ํ
์ ํ๋ก๋ฏธ์ค(๋๋ thenable ๊ฐ์ฒด)๋ฅผ ์ธ์๋ก ๋ฐ์ ํ๋ก๋ฏธ์ค์ ํด๊ฒฐ๋ ๊ฐ์ ๋ฐํํฉ๋๋ค. ํ๋ก๋ฏธ์ค๊ฐ ์์ง ๋ณด๋ฅ ์ค์ด๋ฉด ์ปดํฌ๋ํธ๋ ์ผ์ ์ค๋จ๋ฉ๋๋ค. ๋ค์์ ๊ฐ๋จํ ์์ ์
๋๋ค:
์์ 1: ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ํ์ํ๊ธฐ
API์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ์ํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ๋ค์๊ณผ ๊ฐ์ด use:
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
๋ฆฌ์์ค ์์ฑํ๊ธฐ (Fetcher ํจ์)
๋จผ์ , ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์๋ฅผ ๋ง๋ญ๋๋ค. ์ด ํจ์๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค:
async function fetchUser(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
if (!response.ok) {
throw new Error(`Failed to fetch user: ${response.status}`);
}
return response.json();
}
์ปดํฌ๋ํธ์์ use:
์ฌ์ฉํ๊ธฐ
import React, { Suspense } from 'react';
async function fetchUser(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
if (!response.ok) {
throw new Error(`Failed to fetch user: ${response.status}`);
}
return response.json();
}
function UserProfile({ userId }) {
const user = React.use(fetchUser(userId));
return (
{user.name}
Email: {user.email}
Phone: {user.phone}
);
}
function App() {
return (
Loading user data...
}>
);
}
export default App;
์ด ์์ ์์:
fetchUser
๋ API ์๋ํฌ์ธํธ์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋น๋๊ธฐ ํจ์์
๋๋ค.
UserProfile
์ปดํฌ๋ํธ๋ React.use(fetchUser(userId))
๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
Suspense
์ปดํฌ๋ํธ๋ UserProfile
์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๊ณ ๋ฐ์ดํฐ๊ฐ ๋ก๋ฉ๋๋ ๋์ ํ์๋ fallback
prop์ ์ ๊ณตํฉ๋๋ค.
- ๋ฐ์ดํฐ๊ฐ ์์ง ์ค๋น๋์ง ์์๋ค๋ฉด, React๋
UserProfile
์ปดํฌ๋ํธ๋ฅผ ์ผ์ ์ค๋จํ๊ณ ํด๋ฐฑ UI("Loading user data..." ๋ฉ์์ง)๋ฅผ ํ์ํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ก๋๋๋ฉด UserProfile
์ปดํฌ๋ํธ๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ์ ํจ๊ป ๋ ๋๋ง๋ฉ๋๋ค.
์์ 2: ์ค๋ฅ ์ฒ๋ฆฌ
use:
ํ
์ ํ๋ก๋ฏธ์ค์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ปดํฌ๋ํธ๋ ์ผ์ ์ค๋จ๋๊ณ ๊ฐ์ฅ ๊ฐ๊น์ด ์ค๋ฅ ๊ฒฝ๊ณ(error boundary)๊ฐ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
import React, { Suspense } from 'react';
async function fetchUser(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
if (!response.ok) {
throw new Error(`Failed to fetch user: ${response.status}`);
}
return response.json();
}
function UserProfile({ userId }) {
const user = React.use(fetchUser(userId));
return (
{user.name}
Email: {user.email}
Phone: {user.phone}
);
}
function ErrorBoundary({ children, fallback }) {
const [error, setError] = React.useState(null);
React.useEffect(() => {
const handleError = (e) => {
setError(e);
};
window.addEventListener('error', handleError);
return () => {
window.removeEventListener('error', handleError);
};
}, []);
if (error) {
return fallback;
}
return children;
}
function App() {
return (
Error loading user data.
}>
Loading user data... }>
{/* Assuming this ID doesn't exist and will cause an error */}
);
}
export default App;
์ด ์์ ์์ fetchUser
ํจ์๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ฉด(์: 404 ์ํ ์ฝ๋), ErrorBoundary
์ปดํฌ๋ํธ๊ฐ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ฌ ํด๋ฐฑ UI๋ฅผ ํ์ํฉ๋๋ค. ํด๋ฐฑ์ ์ค๋ฅ ๋ฉ์์ง๋ ์ฌ์๋ ๋ฒํผ๊ณผ ๊ฐ์ ๋ชจ๋ React ์ปดํฌ๋ํธ๊ฐ ๋ ์ ์์ต๋๋ค.
use:
๊ณ ๊ธ ๊ธฐ์
1. ๋ฆฌ์์ค ์บ์ฑ
์ค๋ณต๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํผํ๊ธฐ ์ํด ๋ฆฌ์์ค(ํ๋ก๋ฏธ์ค)๋ฅผ ์บ์ํ๊ณ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ ๋ ๋๋ง์ ๊ฑธ์ณ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ์ต์ ํ๋ ์ฑ๋ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
import React, { Suspense, useRef } from 'react';
const resourceCache = new Map();
async function fetchUser(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
if (!response.ok) {
throw new Error(`Failed to fetch user: ${response.status}`);
}
return response.json();
}
function getUserResource(userId) {
if (!resourceCache.has(userId)) {
resourceCache.set(userId, {
read() {
if (!this.promise) {
this.promise = fetchUser(userId);
}
if (this.result) {
return this.result;
}
throw this.promise;
}
});
}
return resourceCache.get(userId);
}
function UserProfile({ userId }) {
const resource = getUserResource(userId);
const user = resource.read();
return (
{user.name}
Email: {user.email}
Phone: {user.phone}
);
}
function App() {
return (
Loading user data...
}>
);
}
export default App;
์ด ์์ ์์:
resourceCache
Map์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ฌ์ฉ์ ID์ ๋ํ ํ๋ก๋ฏธ์ค๋ฅผ ์ ์ฅํฉ๋๋ค.
getUserResource
ํจ์๋ ์ฃผ์ด์ง ์ฌ์ฉ์ ID์ ๋ํ ํ๋ก๋ฏธ์ค๊ฐ ์บ์์ ์ด๋ฏธ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค. ์กด์ฌํ๋ค๋ฉด ์บ์๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ก์ด ํ๋ก๋ฏธ์ค๋ฅผ ์์ฑํ์ฌ ์บ์์ ์ ์ฅํ ํ ๋ฐํํฉ๋๋ค.
- ์ด๋ฅผ ํตํด
UserProfile
์ปดํฌ๋ํธ๊ฐ ๋์ผํ ์ฌ์ฉ์ ID๋ก ์ฌ๋ฌ ๋ฒ ๋ ๋๋ง๋๋๋ผ๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ๋ง ๊ฐ์ ธ์ค๋๋ก ๋ณด์ฅํฉ๋๋ค.
2. ์๋ฒ ์ปดํฌ๋ํธ์ ํจ๊ป use:
์ฌ์ฉํ๊ธฐ
use:
ํ
์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์๋ฒ์์ ์ง์ ์ํํ ์ ์๋ React ์๋ฒ ์ปดํฌ๋ํธ์์ ํนํ ์ ์ฉํฉ๋๋ค. ์ด๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๋๋ฅผ ๋์ด๊ณ SEO๋ฅผ ๊ฐ์ ํ๋ ๊ฒฐ๊ณผ๋ก ์ด์ด์ง๋๋ค.
Next.js ์๋ฒ ์ปดํฌ๋ํธ ์์
// app/user/[id]/page.jsx (Server Component in Next.js)
import React from 'react';
async function fetchUser(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
if (!response.ok) {
throw new Error(`Failed to fetch user: ${response.status}`);
}
return response.json();
}
export default async function UserPage({ params }) {
const user = React.use(fetchUser(params.id));
return (
{user.name}
Email: {user.email}
Phone: {user.phone}
);
}
์ด Next.js ์๋ฒ ์ปดํฌ๋ํธ์์ fetchUser
ํจ์๋ ์๋ฒ์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. use:
ํ
์ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ง ๋๊น์ง ์ปดํฌ๋ํธ๋ฅผ ์ผ์ ์ค๋จ์์ผ ํจ์จ์ ์ธ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
use:
๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๋ฆฌ์์ค ์บ์ฑ: ์ค๋ณต๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํผํ๊ธฐ ์ํด ํญ์ ๋ฆฌ์์ค๋ฅผ ์บ์ํ์ธ์. ์ด๋ฅผ ์ํด
useRef
๋ ์ ์ญ ์บ์๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ค๋ฅ ์ฒ๋ฆฌ: ๋ก๋ฉ ์ํ์ ์ค๋ฅ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ปดํฌ๋ํธ๋ฅผ
Suspense
์ ์ค๋ฅ ๊ฒฝ๊ณ๋ก ๊ฐ์ธ์ธ์.
- ์๋ฒ ์ปดํฌ๋ํธ์ ํจ๊ป ์ฌ์ฉ: ์๋ฒ ์ปดํฌ๋ํธ์์
use:
๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ต์ ํํ๊ณ SEO๋ฅผ ๊ฐ์ ํ์ธ์.
- ๊ณผ๋ํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐฉ์ง: ๋คํธ์ํฌ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํด ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค์ธ์.
- Suspense ๊ฒฝ๊ณ ์ต์ ํ: ์ ํ๋ฆฌ์ผ์ด์
์ ํฐ ๋ถ๋ถ์ด ์ค๋จ๋๋ ๊ฒ์ ํผํ๊ธฐ ์ํด Suspense ๊ฒฝ๊ณ๋ฅผ ์ ๋ต์ ์ผ๋ก ๋ฐฐ์นํ์ธ์.
- ์ ์ญ ์ค๋ฅ ์ฒ๋ฆฌ: ์๊ธฐ์น ์์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ์ ์ญ ์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ๊ตฌํํ์ธ์.
์ค์ ์ฌ์ฉ ์์
1. ์ด์ปค๋จธ์ค ์ํ ๋ชฉ๋ก
์ํ ๋ชฉ๋ก์ ํ์ํ๋ ์ด์ปค๋จธ์ค ์น์ฌ์ดํธ๋ฅผ ์์ํด ๋ณด์ธ์. ๊ฐ ์ํ ์นด๋๋ use:
๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค:
// ProductCard.jsx
import React, { Suspense } from 'react';
async function fetchProduct(productId) {
const response = await fetch(`/api/products/${productId}`);
if (!response.ok) {
throw new Error(`Failed to fetch product: ${response.status}`);
}
return response.json();
}
function ProductCard({ productId }) {
const product = React.use(fetchProduct(productId));
return (
{product.name}
{product.description}
Price: ${product.price}
);
}
function ProductList({ productIds }) {
return (
{productIds.map((productId) => (
Loading product...
}>
))}
);
}
export default ProductList;
์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฐ ์ํ ์นด๋๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ๋ก๋๋๋๋ก ๋ณด์ฅํ๋ฉฐ, ๋๋ฆฌ๊ฒ ๋ก๋๋๋ ์ํ์ผ๋ก ์ธํด ์ ์ฒด ํ์ด์ง ๋ ๋๋ง์ด ์ฐจ๋จ๋์ง ์์ต๋๋ค. ์ฌ์ฉ์๋ ๊ฐ ์ํ์ ๋ํ ๊ฐ๋ณ ๋ก๋ฉ ํ์๊ธฐ๋ฅผ ๋ณด๊ฒ ๋์ด ๋ ๋์ ๊ฒฝํ์ ์ ๊ณต๋ฐ์ต๋๋ค.
2. ์์
๋ฏธ๋์ด ํผ๋
์์
๋ฏธ๋์ด ํผ๋๋ use:
๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ํ๋กํ, ๊ฒ์๋ฌผ, ๋๊ธ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค:
// Post.jsx
import React, { Suspense } from 'react';
async function fetchPost(postId) {
const response = await fetch(`/api/posts/${postId}`);
if (!response.ok) {
throw new Error(`Failed to fetch post: ${response.status}`);
}
return response.json();
}
async function fetchComments(postId) {
const response = await fetch(`/api/posts/${postId}/comments`);
if (!response.ok) {
throw new Error(`Failed to fetch comments: ${response.status}`);
}
return response.json();
}
function Comments({ postId }) {
const comments = React.use(fetchComments(postId));
return (
{comments.map((comment) => (
- {comment.text}
))}
);
}
function Post({ postId }) {
const post = React.use(fetchPost(postId));
return (
{post.title}
{post.content}
Loading comments... }>
);
}
export default Post;
์ด ์์ ๋ ์ค์ฒฉ๋ Suspense ๊ฒฝ๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์๋ฌผ ๋ด์ฉ๊ณผ ๋๊ธ์ ๋
๋ฆฝ์ ์ผ๋ก ๋ก๋ํฉ๋๋ค. ์ฌ์ฉ์๋ ๋๊ธ์ด ๋ก๋๋๋ ๋์์๋ ๊ฒ์๋ฌผ ๋ด์ฉ์ ๋ณผ ์ ์์ต๋๋ค.
ํํ ํจ์ ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ
- ๋ฆฌ์์ค ์บ์ฑ ๋๋ฝ: ๋ฆฌ์์ค ์บ์ฑ์ ์์ผ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ํญ์
useRef
๋ ์ ์ญ ์บ์์ ๊ฐ์ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ธ์.
- ๊ณผ๋ํ ์ค๋จ: ์ ํ๋ฆฌ์ผ์ด์
์ ํฐ ๋ถ๋ถ์ ์ค๋จ์ํค๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ด ์ ํ๋ ์ ์์ต๋๋ค. Suspense ๊ฒฝ๊ณ๋ฅผ ์ ๋ต์ ์ผ๋ก ๋ฐฐ์นํ์ธ์.
- ์ค๋ฅ ๋ฌด์: ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํํ ํ๋ฉด ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ํญ์ ์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ์ธ์.
- ์๋ชป๋ API ์ฌ์ฉ: API ์๋ํฌ์ธํธ๊ฐ ์ ๋ขฐํ ์ ์๊ณ ์์๋ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋์ง ํ์ธํ์ธ์.
- ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง:
React.memo
๋ฅผ ์ฌ์ฉํ๊ณ ์ปดํฌ๋ํธ์ ๋ ๋๋ง ๋ก์ง์ ์ต์ ํํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ํผํ์ธ์.
use:
์ ๋์
use:
๊ฐ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, React์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ๋ํ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ ์์ต๋๋ค:
useEffect
์ State: useEffect
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ํ์ ์ ์ฅํ๋ ์ ํต์ ์ธ ์ ๊ทผ ๋ฐฉ์์
๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ ์ฅํฉํ๋ฉฐ ์๋ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
useSWR
: ์๊ฒฉ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํ ์ธ๊ธฐ ์๋ React ํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. useSWR
๋ ์บ์ฑ, ์ฌ๊ฒ์ฆ, ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- React Query์
useQuery
: ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. React Query๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์
๋ฐ์ดํธ, ๋๊ด์ ์
๋ฐ์ดํธ, ์๋ ์ฌ์๋์ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- Relay: ๋ฐ์ดํฐ ๊ธฐ๋ฐ React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๊ธฐ ์ํ JavaScript ํ๋ ์์ํฌ์
๋๋ค. Relay๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๊ด๋ฆฌ์ ๋ํ ์ ์ธ์ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ๋์๋ค ์ฌ์ด์ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณต์ก์ฑ๊ณผ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ use:
๊ฐ ํ๋ฅญํ ์ต์
์ด ๋ ์ ์์ต๋๋ค. ๋ ๋ณต์กํ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ useSWR
๋ React Query์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ์ ํฉํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
React์ use:
ํ
์ ๋ฆฌ์์ค ๋ก๋ฉ๊ณผ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ธ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. Suspense์ ํจ๊ป use:
๋ฅผ ํ์ฉํ๋ฉด ์ปดํฌ๋ํธ ๋ก์ง์ ๋จ์ํํ๊ณ , ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๋ฉฐ, ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์๋ React ์ ํ๋ฆฌ์ผ์ด์
์์ use:
๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ฌํญ, ๊ณ ๊ธ ๊ธฐ์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ์์ต๋๋ค. ์ด๋ฌํ ์ง์นจ์ ๋ฐ๋ฅด๋ฉด ๋น๋๊ธฐ ์์
์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๊ฒฌ๊ณ ํ๋ฉฐ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. React๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, use:
์ ๊ฐ์ ๊ธฐ์ ์ ๋ง์คํฐํ๋ ๊ฒ์ ์์ ๋๊ฐ๊ณ ํ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ํ์์ ์
๋๋ค.
์ฐธ๊ณ ์๋ฃ