μΊμ ν¨μλ₯Ό μ¬μ©νμ¬ λ¦¬μ‘νΈ μ ν리μΌμ΄μ μ μ€λ§νΈ μΊμ 무ν¨ν μ λ΅μ ꡬννλ μ’ ν© κ°μ΄λ. ν¨μ¨μ μΈ λ°μ΄ν° κ΄λ¦¬μ μ±λ₯ ν₯μμ μ€μ μ λ‘λλ€.
리μ‘νΈ μΊμ ν¨μ 무ν¨ν μ λ΅: μ€λ§νΈ μΊμ λ§λ£
νλ μΉ κ°λ°μμ ν¨μ¨μ μΈ λ°μ΄ν° κ΄λ¦¬λ λ°μμ± μκ³ μ±λ₯μ΄ λ°μ΄λ μ¬μ©μ κ²½νμ μ 곡νλ λ° λ§€μ° μ€μν©λλ€. 리μ‘νΈ μ ν리μΌμ΄μ μ μ’ μ’ μΊμ± λ©μ»€λμ¦μ μμ‘΄νμ¬ λΆνμν λ°μ΄ν° νμΉμ νΌνκ³ , λ€νΈμν¬ λΆνλ₯Ό μ€μ΄λ©°, μ²΄κ° μ±λ₯μ ν₯μμν΅λλ€. κ·Έλ¬λ λΆμ μ νκ² κ΄λ¦¬λλ μΊμλ μ€λλ λ°μ΄ν°λ₯Ό μ΄λνμ¬ λΆμΌμΉλ₯Ό λ§λ€κ³ μ¬μ©μλ₯Ό λΆνΈνκ² ν μ μμ΅λλ€. μ΄ κΈμμλ 리μ‘νΈ μΊμ ν¨μλ₯Ό μν λ€μν μ€λ§νΈ μΊμ 무ν¨ν μ λ΅μ νꡬνλ©°, λΆνμν μ¬μμ²μ μ΅μννλ©΄μ λ°μ΄ν° μ μ λλ₯Ό 보μ₯νλ ν¨κ³Όμ μΈ λ°©λ²μ μ΄μ μ λ§μΆ₯λλ€.
리μ‘νΈμ μΊμ ν¨μ μ΄ν΄νκΈ°
리μ‘νΈμ μΊμ ν¨μλ μ»΄ν¬λνΈμ λ°μ΄ν° μμ€(μ: API) μ¬μ΄μ μ€κ°μ μν μ ν©λλ€. λ°μ΄ν°λ₯Ό νμΉνκ³ , μΊμμ μ μ₯νλ©°, μ¬μ© κ°λ₯ν λ μΊμλ λ°μ΄ν°λ₯Ό λ°ννμ¬ λ°λ³΅μ μΈ λ€νΈμν¬ μμ²μ νΌν©λλ€. react-query
λ SWR
(Stale-While-Revalidate)κ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ κ°λ ₯ν μΊμ± κΈ°λ₯μ κΈ°λ³Έμ μΌλ‘ μ 곡νμ¬ μΊμ± μ λ΅ κ΅¬νμ λ¨μνν©λλ€.
μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬μ ν΅μ¬ μμ΄λμ΄λ λ°μ΄ν° νμΉ, μΊμ±, 무ν¨νμ 볡μ‘μ±μ κ΄λ¦¬νμ¬ κ°λ°μκ° μ¬μ©μ μΈν°νμ΄μ€ ꡬμΆμ μ§μ€ν μ μλλ‘ νλ κ²μ λλ€.
react-query
μ¬μ© μμ:
react-query
λ λ°μ΄ν°λ₯Ό μλμΌλ‘ μΊμ±νκ³ μ
λ°μ΄νΈνλ useQuery
ν
μ μ 곡ν©λλ€. λ€μμ κΈ°λ³Έμ μΈ μμμ
λλ€:
import { useQuery } from 'react-query';
const fetchUserProfile = async (userId) => {
const response = await fetch(`/api/users/${userId}`);
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
};
function UserProfile({ userId }) {
const { data, isLoading, error } = useQuery(['user', userId], () => fetchUserProfile(userId));
if (isLoading) return <p>λ‘λ© μ€...</p>;
if (error) return <p>μ€λ₯: {error.message}</p>;
return (
<div>
<h2>{data.name}</h2>
<p>μ΄λ©μΌ: {data.email}</p>
</div>
);
}
SWR
μ¬μ© μμ:
SWR
(Stale-While-Revalidate)μ λ°μ΄ν° νμΉμ λ리 μ¬μ©λλ λ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ
λλ€. μ΄ λΌμ΄λΈλ¬λ¦¬λ μΊμλ λ°μ΄ν°λ₯Ό μ¦μ νμνλ©΄μ λ°±κ·ΈλΌμ΄λμμ λ°μ΄ν°λ₯Ό μ¬κ²μ¦νλ κ²μ μ°μ μν©λλ€.
import useSWR from 'swr';
const fetcher = (url) => fetch(url).then((res) => res.json());
function UserProfile({ userId }) {
const { data, error } = useSWR(`/api/users/${userId}`, fetcher);
if (error) return <div>λ°μ΄ν° λ‘λ μ€ν¨</div>
if (!data) return <div>λ‘λ© μ€...</div>
return (
<div>
<h2>{data.name}</h2>
<p>μ΄λ©μΌ: {data.email}</p>
</div>
);
}
μΊμ 무ν¨νμ μ€μμ±
μΊμ±μ μ μ©νμ§λ§, κΈ°λ° λ°μ΄ν°κ° λ³κ²½λ λ μΊμλ₯Ό 무ν¨ννλ κ²μ΄ νμμ μ λλ€. μ΄λ₯Ό μ€ν¨νλ©΄ μ¬μ©μκ° μ€λλ μ 보λ₯Ό λ³΄κ² λμ΄ νΌλμ μΌκΈ°νκ³ μ μ¬μ μΌλ‘ λΉμ¦λμ€ κ²°μ μ μν₯μ λ―ΈμΉ μ μμ΅λλ€. ν¨κ³Όμ μΈ μΊμ 무ν¨νλ λ°μ΄ν° μΌκ΄μ±κ³Ό μ λ’°ν μ μλ μ¬μ©μ κ²½νμ 보μ₯ν©λλ€.
μ ν κ°κ²©μ νμνλ μ μμκ±°λ μ ν리μΌμ΄μ μ μκ°ν΄λ³΄μΈμ. λ°μ΄ν°λ² μ΄μ€μμ μν κ°κ²©μ΄ λ³κ²½λλ©΄ μΉμ¬μ΄νΈμ μΊμλ κ°κ²©λ μ¦μ μ λ°μ΄νΈλμ΄μΌ ν©λλ€. μΊμκ° λ¬΄ν¨νλμ§ μμΌλ©΄ μ¬μ©μλ μ΄μ κ°κ²©μ λ³΄κ² λμ΄ κ΅¬λ§€ μ€λ₯λ κ³ κ° λΆλ§μ μ΄λν μ μμ΅λλ€.
μ€λ§νΈ μΊμ 무ν¨ν μ λ΅
μ€λ§νΈ μΊμ 무ν¨νμλ μ¬λ¬ μ λ΅μ μ¬μ©ν μ μμΌλ©°, κ°κ° μ₯λ¨μ μ΄ μμ΅λλ€. μ΅μμ μ κ·Ό λ°©μμ λ°μ΄ν° μ λ°μ΄νΈ μ£ΌκΈ°, μΌκ΄μ± μꡬ μ¬ν, μ±λ₯ κ³ λ € μ¬ν λ± μ ν리μΌμ΄μ μ νΉμ μꡬ μ¬νμ λ°λΌ λ¬λΌμ§λλ€.
1. μκ° κΈ°λ° λ§λ£ (TTL - Time To Live)
TTLμ κ°λ¨νκ³ λ리 μ¬μ©λλ μΊμ 무ν¨ν μ λ΅μ λλ€. μΊμ νλͺ©μ΄ μ ν¨νκ² μ μ§λλ κ³ μ λ κΈ°κ°μ μ€μ νλ λ°©μμ λλ€. TTLμ΄ λ§λ£λλ©΄ μΊμ νλͺ©μ μ€λλ κ²μΌλ‘ κ°μ£Όλλ©° λ€μ μμ² μ μλμΌλ‘ μλ‘κ³ μΉ¨λ©λλ€.
μ₯μ :
- ꡬνμ΄ μ½μ΅λλ€.
- μμ£Ό λ³κ²½λμ§ μλ λ°μ΄ν°μ μ ν©ν©λλ€.
λ¨μ :
- TTLμ΄ λ무 κΈΈλ©΄ μ€λλ λ°μ΄ν°λ₯Ό μ΄λν μ μμ΅λλ€.
- TTLμ΄ λ무 μ§§μΌλ©΄ λΆνμν μ¬μμ²μ μ λ°ν μ μμ΅λλ€.
react-query
μ¬μ© μμ:
useQuery(['products'], fetchProducts, { staleTime: 60 * 60 * 1000 }); // 1 hour
μ΄ μμμμ products
λ°μ΄ν°λ 1μκ° λμ μ μ ν κ²μΌλ‘ κ°μ£Όλ©λλ€. κ·Έ μ΄νμ react-query
λ λ°±κ·ΈλΌμ΄λμμ λ°μ΄ν°λ₯Ό λ€μ νμΉνκ³ μΊμλ₯Ό μ
λ°μ΄νΈν©λλ€.
2. μ΄λ²€νΈ κΈ°λ° λ¬΄ν¨ν
μ΄λ²€νΈ κΈ°λ° λ¬΄ν¨νλ κΈ°λ° λ°μ΄ν°κ° λ³κ²½λμμμ λνλ΄λ νΉμ μ΄λ²€νΈκ° λ°μν λ μΊμλ₯Ό 무ν¨ννλ λ°©μμ λλ€. μ΄ μ κ·Ό λ°©μμ νμν λλ§ μΊμλ₯Ό 무ν¨ννλ―λ‘ TTL κΈ°λ° λ¬΄ν¨νλ³΄λ€ λ μ νν©λλ€.
μ₯μ :
- λ°μ΄ν°κ° λ³κ²½λ λλ§ μΊμλ₯Ό 무ν¨ννμ¬ λ°μ΄ν° μΌκ΄μ±μ 보μ₯ν©λλ€.
- λΆνμν μ¬μμ²μ μ€μ λλ€.
λ¨μ :
- λ°μ΄ν° λ³κ²½ μ΄λ²€νΈλ₯Ό κ°μ§νκ³ μ ννλ λ©μ»€λμ¦μ΄ νμν©λλ€.
- TTLλ³΄λ€ κ΅¬νμ΄ λ 볡μ‘ν μ μμ΅λλ€.
μΉμμΌ μ¬μ© μμ:
νμ λ¬Έμ νΈμ§ μ ν리μΌμ΄μ μ μμν΄λ³΄μΈμ. ν μ¬μ©μκ° λ¬Έμλ₯Ό λ³κ²½νλ©΄ μλ²λ μΉμμΌμ ν΅ν΄ μ°κ²°λ λͺ¨λ ν΄λΌμ΄μΈνΈμκ² μ λ°μ΄νΈ μ΄λ²€νΈλ₯Ό νΈμν μ μμ΅λλ€. κ·Έλ¬λ©΄ ν΄λΌμ΄μΈνΈλ ν΄λΉ νΉμ λ¬Έμμ μΊμλ₯Ό 무ν¨νν μ μμ΅λλ€.
// Client-side code
const socket = new WebSocket('ws://example.com/ws');
socket.onmessage = (event) => {
const message = JSON.parse(event.data);
if (message.type === 'document_updated') {
queryClient.invalidateQueries(['document', message.documentId]); // react-query example
}
};
3. νκ·Έ κΈ°λ° λ¬΄ν¨ν
νκ·Έ κΈ°λ° λ¬΄ν¨νλ₯Ό μ¬μ©νλ©΄ νΉμ νκ·Έ μλμ μΊμ νλͺ©μ κ·Έλ£Ήνν μ μμ΅λλ€. νΉμ νκ·Έμ κ΄λ ¨λ λ°μ΄ν°κ° λ³κ²½λλ©΄ ν΄λΉ νκ·Έμ κ΄λ ¨λ λͺ¨λ μΊμ νλͺ©μ 무ν¨νν μ μμ΅λλ€.
μ₯μ :
- μΊμ μ’ μμ±μ κ΄λ¦¬νλ μ μ°ν λ°©λ²μ μ 곡ν©λλ€.
- κ΄λ ¨ λ°μ΄ν°λ₯Ό ν¨κ» 무ν¨ννλ λ° μ μ©ν©λλ€.
λ¨μ :
- μ μ ν νκ·Έλ₯Ό μ μνκΈ° μν΄ μ μ€ν κ³νμ΄ νμν©λλ€.
- TTLλ³΄λ€ κ΅¬νμ΄ λ 볡μ‘ν μ μμ΅λλ€.
μμ:
λΈλ‘κ·Έ νλ«νΌμ μκ°ν΄λ³΄μΈμ. νΉμ μ μμ κ΄λ ¨λ μΊμ νλͺ©μ μ μμ IDλ‘ νκ·Έλ₯Ό μ§μ ν μ μμ΅λλ€. μ μμ νλ‘νμ΄ μ λ°μ΄νΈλλ©΄ ν΄λΉ μ μμ κ΄λ ¨λ λͺ¨λ μΊμ νλͺ©μ 무ν¨νν μ μμ΅λλ€.
react-query
μ SWR
μ νκ·Έλ₯Ό μ§μ μ§μνμ§ μμ§λ§, 쿼리 ν€λ₯Ό μ λ΅μ μΌλ‘ ꡬμ±νκ³ νν° ν¨μμ ν¨κ» queryClient.invalidateQueries
λ₯Ό μ¬μ©νμ¬ μ΄ λμμ λͺ¨λ°©ν μ μμ΅λλ€.
// Invalidate all queries related to authorId: 123
queryClient.invalidateQueries({
matching: (query) => query.queryKey[0] === 'posts' && query.queryKey[1] === 123 // example query key: ['posts', 123, { page: 1 }]
})
4. Stale-While-Revalidate (SWR)
SWRμ μ ν리μΌμ΄μ μ΄ μΊμμμ μ€λλ λ°μ΄ν°λ₯Ό μ¦μ λ°ννλ©΄μ λμμ λ°±κ·ΈλΌμ΄λμμ λ°μ΄ν°λ₯Ό μ¬κ²μ¦νλ μΊμ± μ λ΅μ λλ€. μ΄ μ κ·Ό λ°©μμ λΉ λ₯Έ μ΄κΈ° λ‘λλ₯Ό μ 곡νκ³ μ¬μ©μκ° κ²°κ΅ μ΅μ λ°μ΄ν°λ₯Ό λ³Ό μ μλλ‘ λ³΄μ₯ν©λλ€.
μ₯μ :
- λΉ λ₯Έ μ΄κΈ° λ‘λλ₯Ό μ 곡ν©λλ€.
- κΆκ·Ήμ μΈ λ°μ΄ν° μΌκ΄μ±μ 보μ₯ν©λλ€.
- μ²΄κ° μ±λ₯μ ν₯μμν΅λλ€.
λ¨μ :
- μ¬μ©μκ° μ μ μ€λλ λ°μ΄ν°λ₯Ό λ³Ό μ μμ΅λλ€.
- λ°μ΄ν°μ μ€λλ¨ νμ© μμ€μ μ μ€νκ² κ³ λ €ν΄μΌ ν©λλ€.
SWR
μ¬μ© μμ:
import useSWR from 'swr';
const { data, error } = useSWR('/api/data', fetcher);
SWR
μ μ¬μ©νλ©΄ λ°μ΄ν°λ (μ¬μ© κ°λ₯ν κ²½μ°) μΊμμμ μ¦μ λ°νλ λ€μ, λ°±κ·ΈλΌμ΄λμμ fetcher
ν¨μκ° νΈμΆλμ΄ λ°μ΄ν°λ₯Ό μ¬κ²μ¦ν©λλ€.
5. λκ΄μ μ λ°μ΄νΈ (Optimistic Updates)
λκ΄μ μ λ°μ΄νΈλ μλ²κ° λ³κ²½μ νμΈνκΈ° μ μλ μμ μ μμ κ²°κ³Όλ‘ UIλ₯Ό μ¦μ μ λ°μ΄νΈνλ λ°©μμ λλ€. μ΄ μ κ·Ό λ°©μμ λ λ°μμ± μλ μ¬μ©μ κ²½νμ μ 곡νμ§λ§ μ μ¬μ μΈ μ€λ₯ μ²λ¦¬ λ° λ‘€λ°±μ΄ νμν©λλ€.
μ₯μ :
- λ§€μ° λ°μμ± μλ μ¬μ©μ κ²½νμ μ 곡ν©λλ€.
- μ²΄κ° μ§μ° μκ°μ μ€μ λλ€.
λ¨μ :
- μ μ€ν μ€λ₯ μ²λ¦¬ λ° λ‘€λ°± λ©μ»€λμ¦μ΄ νμν©λλ€.
- ꡬνμ΄ λ 볡μ‘ν μ μμ΅λλ€.
μμ:
ν¬ν μμ€ν μ μκ°ν΄λ³΄μΈμ. μ¬μ©μκ° ν¬ννλ©΄ μλ²κ° ν¬νλ₯Ό νμΈνκΈ° μ μλ UIκ° μ¦μ ν¬ν μλ₯Ό μ λ°μ΄νΈν©λλ€. λ§μ½ μλ²κ° ν¬νλ₯Ό κ±°λΆνλ©΄ UIλ μ΄μ μνλ‘ λ‘€λ°±λμ΄μΌ ν©λλ€.
const [votes, setVotes] = useState(initialVotes);
const handleVote = async () => {
const optimisticVotes = votes + 1;
setVotes(optimisticVotes); // Optimistically update the UI
try {
await api.castVote(); // Send the vote to the server
} catch (error) {
// Rollback the UI on error
setVotes(votes);
console.error('Failed to cast vote:', error);
}
};
react-query
λ SWR
μ μ¬μ©νλ©΄ μΌλ°μ μΌλ‘ λκ΄μ μ
λ°μ΄νΈλ₯Ό μν΄ mutate
ν¨μ(react-query
)λ₯Ό μ¬μ©νκ±°λ, μ¬μ©μ μ μ SWR
ꡬνμ κ²½μ° cache.set
μ μ¬μ©νμ¬ μλμΌλ‘ μΊμλ₯Ό μ
λ°μ΄νΈν©λλ€.
6. μλ 무ν¨ν
μλ 무ν¨νλ μΊμκ° μΈμ μ§μμ§μ§μ λν λͺ
μμ μΈ μ μ΄λ₯Ό μ 곡ν©λλ€. μ΄λ μ±κ³΅μ μΈ POST, PUT λλ DELETE μμ² νμ λ°μ΄ν°κ° μΈμ λ³κ²½λμλμ§ μ μκ³ μμ λ νΉν μ μ©ν©λλ€. μΊμ± λΌμ΄λΈλ¬λ¦¬μμ μ 곡νλ λ©μλ(μ: react-query
μ queryClient.invalidateQueries
)λ₯Ό μ¬μ©νμ¬ λͺ
μμ μΌλ‘ μΊμλ₯Ό 무ν¨ννλ κ²μ ν¬ν¨ν©λλ€.
μ₯μ :
- μΊμ 무ν¨νμ λν μ λ°ν μ μ΄κ° κ°λ₯ν©λλ€.
- λ°μ΄ν° λ³κ²½μ΄ μμΈ‘ κ°λ₯ν μν©μ μ΄μμ μ λλ€.
λ¨μ :
- 무ν¨νκ° μ¬λ°λ₯΄κ² μνλλλ‘ μ μ€ν κ΄λ¦¬κ° νμν©λλ€.
- 무ν¨ν λ‘μ§μ΄ μ λλ‘ κ΅¬νλμ§ μμΌλ©΄ μ€λ₯κ° λ°μνκΈ° μ½μ΅λλ€.
react-query
μ¬μ© μμ:
const handleUpdate = async (data) => {
await api.updateData(data);
queryClient.invalidateQueries('myData'); // Invalidate the cache after the update
};
μ¬λ°λ₯Έ μ λ΅ μ ννκΈ°
μ μ ν μΊμ 무ν¨ν μ λ΅μ μ ννλ κ²μ μ¬λ¬ μμΈμ λ°λΌ λ¬λΌμ§λλ€:
- λ°μ΄ν° μ λ°μ΄νΈ μ£ΌκΈ°: μμ£Ό λ³κ²½λλ λ°μ΄ν°μ κ²½μ° μ΄λ²€νΈ κΈ°λ° λλ SWRμ΄ λ μ ν©ν μ μμ΅λλ€. λλ¬Όκ² λ³κ²½λλ λ°μ΄ν°μ κ²½μ° TTLλ‘ μΆ©λΆν μ μμ΅λλ€.
- μΌκ΄μ± μꡬ μ¬ν: μ격ν λ°μ΄ν° μΌκ΄μ±μ΄ μ€μν κ²½μ° μ΄λ²€νΈ κΈ°λ° λλ μλ 무ν¨νκ° νμν μ μμ΅λλ€. μ½κ°μ μ€λλ λ°μ΄ν°κ° νμ©λλ€λ©΄ SWRμ μ±λ₯κ³Ό μΌκ΄μ± μ¬μ΄μ μ’μ κ· νμ μ 곡ν μ μμ΅λλ€.
- μ ν리μΌμ΄μ 볡μ‘μ±: λ κ°λ¨ν μ ν리μΌμ΄μ μ TTLμ μ΄μ μ λ릴 μ μμ§λ§, λ 볡μ‘ν μ ν리μΌμ΄μ μ νκ·Έ κΈ°λ° λλ μ΄λ²€νΈ κΈ°λ° λ¬΄ν¨νκ° νμν μ μμ΅λλ€.
- μ±λ₯ κ³ λ € μ¬ν: μ¬μμ²μ΄ μλ² λΆνμ λ€νΈμν¬ λμνμ λ―ΈμΉλ μν₯μ κ³ λ €νμΈμ. λ°μ΄ν° μ μ λλ₯Ό 보μ₯νλ©΄μ λΆνμν μ¬μμ²μ μ΅μννλ μ λ΅μ μ ννμΈμ.
μ°μ λ³ μ€μ μ μ© μ¬λ‘
μ΄λ¬ν μ λ΅μ΄ λ€λ₯Έ μ°μ μμ μ΄λ»κ² μ μ©λ μ μλμ§ μ΄ν΄λ³΄κ² μ΅λλ€:
- μ μμκ±°λ: μ ν κ°κ²©μ κ²½μ°, λ°μ΄ν°λ² μ΄μ€μ κ°κ²© μ λ°μ΄νΈμ μν΄ νΈλ¦¬κ±°λλ μ΄λ²€νΈ κΈ°λ° λ¬΄ν¨νλ₯Ό μ¬μ©ν©λλ€. μ ν 리뷰μ κ²½μ°, SWRμ μ¬μ©νμ¬ μΊμλ 리뷰λ₯Ό νμνλ©΄μ λ°±κ·ΈλΌμ΄λμμ μ¬κ²μ¦ν©λλ€.
- μμ λ―Έλμ΄: μ¬μ©μ νλ‘νμ κ²½μ°, νκ·Έ κΈ°λ° λ¬΄ν¨νλ₯Ό μ¬μ©νμ¬ νλ‘νμ΄ μ λ°μ΄νΈλ λ νΉμ μ¬μ©μμ κ΄λ ¨λ λͺ¨λ μΊμ νλͺ©μ 무ν¨νν©λλ€. λ΄μ€ νΌλμ κ²½μ°, SWRμ μ¬μ©νμ¬ μΊμλ μ½ν μΈ λ₯Ό νμνλ©΄μ μ κ²μλ¬Όμ κ°μ Έμ΅λλ€.
- κΈμ΅ μλΉμ€: μ£Όμ κ°κ²©μ κ²½μ°, TTLκ³Ό μ΄λ²€νΈ κΈ°λ° λ¬΄ν¨νλ₯Ό μ‘°ν©νμ¬ μ¬μ©ν©λλ€. μμ£Ό λ³κ²½λλ κ°κ²©μλ μ§§μ TTLμ μ€μ νκ³ , μ€μν κ°κ²© λ³λμ΄ λ°μν λ μΊμλ₯Ό μ λ°μ΄νΈνκΈ° μν΄ μ΄λ²€νΈ κΈ°λ° λ¬΄ν¨νλ₯Ό μ¬μ©ν©λλ€.
- μλ£: νμ κΈ°λ‘μ κ²½μ°, λ°μ΄ν° μΌκ΄μ±μ μ°μ μνκ³ νμ λ°μ΄ν°λ² μ΄μ€ μ λ°μ΄νΈμ μν΄ νΈλ¦¬κ±°λλ μ΄λ²€νΈ κΈ°λ° λ¬΄ν¨νλ₯Ό μ¬μ©ν©λλ€. λ°μ΄ν° νλΌμ΄λ²μμ 보μμ 보μ₯νκΈ° μν΄ μ격ν μ κ·Ό μ μ΄λ₯Ό ꡬνν©λλ€.
μΊμ 무ν¨νλ₯Ό μν λͺ¨λ² μ¬λ‘
ν¨κ³Όμ μΈ μΊμ 무ν¨νλ₯Ό 보μ₯νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μΈμ:
- μΊμ μ±λ₯ λͺ¨λν°λ§: μΊμ ννΈμ¨κ³Ό μ¬μμ² λΉλλ₯Ό μΆμ νμ¬ μ μ¬μ μΈ λ¬Έμ λ₯Ό μλ³ν©λλ€.
- κ°λ ₯ν μ€λ₯ μ²λ¦¬ ꡬν: λ°μ΄ν° νμΉ λ° μΊμ 무ν¨ν μ€ λ°μνλ μ€λ₯λ₯Ό μ²λ¦¬νμ¬ μ ν리μΌμ΄μ μΆ©λμ λ°©μ§ν©λλ€.
- μΌκ΄λ λ€μ΄λ° 컨벀μ μ¬μ©: μΊμ ν€μ λν λͺ ννκ³ μΌκ΄λ λ€μ΄λ° 컨벀μ μ μ€μ νμ¬ κ΄λ¦¬ λ° λλ²κΉ μ λ¨μνν©λλ€.
- μΊμ± μ λ΅ λ¬Έμν: μ νν 무ν¨ν λ°©λ²κ³Ό κ·Έ κ·Όκ±°λ₯Ό ν¬ν¨νμ¬ μΊμ± μ λ΅μ λͺ ννκ² λ¬Έμνν©λλ€.
- μΊμ± ꡬν ν μ€νΈ: μΊμ± ꡬνμ μ² μ ν ν μ€νΈνμ¬ λ°μ΄ν°κ° μ¬λ°λ₯΄κ² μ λ°μ΄νΈλκ³ μΊμκ° μμλλ‘ μλνλμ§ νμΈν©λλ€.
- μλ² μ¬μ΄λ λ λλ§(SSR) κ³ λ €: λΉ λ₯Έ μ΄κΈ° λ‘λ μκ°κ³Ό SEO μ΅μ νκ° νμν μ ν리μΌμ΄μ μ κ²½μ°, μλ² μ¬μ΄λ λ λλ§μ μ¬μ©νμ¬ μλ²μμ μΊμλ₯Ό 미리 μ±μ°λ κ²μ κ³ λ €ν©λλ€.
- CDN(μ½ν μΈ μ μ‘ λ€νΈμν¬) μ¬μ©: CDNμ μ¬μ©νμ¬ μ μ μμ°μ μΊμνκ³ μ μΈκ³ μ¬μ©μμ μ§μ° μκ°μ μ€μ λλ€.
κ³ κΈ κΈ°λ²
κΈ°λ³Έμ μΈ μ λ΅ μΈμλ, λ μ€λ§νΈν μΊμ 무ν¨νλ₯Ό μν΄ λ€μκ³Ό κ°μ κ³ κΈ κΈ°λ²μ κ³ λ €ν΄λ³΄μΈμ:
- μ μν TTL: λ°μ΄ν° λ³κ²½ λΉλμ λ°λΌ TTLμ λμ μΌλ‘ μ‘°μ ν©λλ€. μλ₯Ό λ€μ΄, λ°μ΄ν°κ° μμ£Ό λ³κ²½λλ©΄ TTLμ μ€μ΄κ³ , λλ¬Όκ² λ³κ²½λλ©΄ TTLμ λ립λλ€.
- μΊμ μ’ μμ±: μΊμ νλͺ© κ°μ λͺ μμ μΈ μ’ μμ±μ μ μν©λλ€. ν νλͺ©μ΄ 무ν¨νλλ©΄ λͺ¨λ μ’ μ νλͺ©μ μλμΌλ‘ 무ν¨νν©λλ€.
- λ²μ κ΄λ¦¬ μΊμ ν€: μΊμ ν€μ λ²μ λ²νΈλ₯Ό ν¬ν¨ν©λλ€. λ°μ΄ν° κ΅¬μ‘°κ° λ³κ²½λλ©΄ λ²μ λ²νΈλ₯Ό μ¦κ°μμΌ λͺ¨λ μ΄μ μΊμ νλͺ©μ 무ν¨νν©λλ€. μ΄λ API λ³κ²½μ μ²λ¦¬νλ λ° νΉν μ μ©ν©λλ€.
- GraphQL μΊμ 무ν¨ν: GraphQL μ ν리μΌμ΄μ μμλ μ κ·νλ μΊμ± λ° νλ μμ€ λ¬΄ν¨νμ κ°μ κΈ°μ μ μ¬μ©νμ¬ μΊμ κ΄λ¦¬λ₯Ό μ΅μ νν©λλ€. Apollo Clientμ κ°μ λΌμ΄λΈλ¬λ¦¬λ μ΄λ¬ν κΈ°μ μ κΈ°λ³Έμ μΌλ‘ μ§μν©λλ€.
κ²°λ‘
μ€λ§νΈ μΊμ 무ν¨ν μ λ΅μ ꡬννλ κ²μ λ°μμ± μκ³ μ±λ₯μ΄ λ°μ΄λ 리μ‘νΈ μ ν리μΌμ΄μ
μ ꡬμΆνλ λ° νμμ μ
λλ€. λ€μν 무ν¨ν λ°©λ²μ μ΄ν΄νκ³ νΉμ μꡬμ λ§λ μ¬λ°λ₯Έ μ κ·Ό λ°©μμ μ νν¨μΌλ‘μ¨ λ°μ΄ν° μΌκ΄μ±μ 보μ₯νκ³ λ€νΈμν¬ λΆνλ₯Ό μ€μ΄λ©° μ°μν μ¬μ©μ κ²½νμ μ 곡ν μ μμ΅λλ€. react-query
λ SWR
κ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ μΊμ± μ λ΅ κ΅¬νμ λ¨μννμ¬ νλ₯ν μ¬μ©μ μΈν°νμ΄μ€ ꡬμΆμ μ§μ€ν μ μλλ‘ ν΄μ€λλ€. μ₯κΈ°μ μΈ μ±κ³΅μ 보μ₯νκΈ° μν΄ μΊμ μ±λ₯μ λͺ¨λν°λ§νκ³ , κ°λ ₯ν μ€λ₯ μ²λ¦¬λ₯Ό ꡬννλ©°, μΊμ± μ λ΅μ λ¬Έμννλ κ²μ μμ§ λ§μΈμ.
μ΄λ¬ν μ λ΅μ μ±νν¨μΌλ‘μ¨ ν¨μ¨μ μ΄κ³ μ λ’°ν μ μλ μΊμ± μμ€ν μ λ§λ€μ΄ μ¬μ©μμκ² λ λμ κ²½νμ μ 곡νκ³ κ°λ°νμκ²λ λ μ μ§λ³΄μνκΈ° μ¬μ΄ μ ν리μΌμ΄μ μ μ 곡ν μ μμ΅λλ€.