Request Waterfall 방식
Request Waterfall 방식은 말 그대로 요청이 순차적으로 실행되는 패턴입니다.
첫 번째 API 요청이 완료된 후 그 결과를 기반으로 다음 요청이 실행되는 방식으로, 요청 간 의존성이 존재할 때 사용됩니다.
하지만 의존성이 없는 여러 요청을 순차적으로 처리하면 전체 응답 시간이 불필요하게 늘어나게 됩니다.
예제: Waterfall 방식으로 API 요청 처리하기
아래 예제는 두 개의 API를 순차적으로 호출하는 예시입니다.
첫 번째 API의 결과를 기다린 후 두 번째 API를 호출합니다.
import React, { useEffect, useState } from 'react';
type User = { id: number; name: string };
type Posts = { id: number; title: string }[];
const WaterfallComponent: React.FC = () => {
const [user, setUser] = useState<User | null>(null);
const [posts, setPosts] = useState<Posts | null>(null);
useEffect(() => {
const fetchUserAndPosts = async () => {
try {
// 첫 번째 요청: 사용자 정보 가져오기
const userResponse = await fetch('https://api.example.com/user');
const userData: User = await userResponse.json();
setUser(userData);
// 두 번째 요청: 사용자의 게시글 가져오기
const postsResponse = await fetch(`https://api.example.com/posts?userId=${userData.id}`);
const postsData: Posts = await postsResponse.json();
setPosts(postsData);
} catch (error) {
console.error('API 호출 중 에러 발생:', error);
}
};
fetchUserAndPosts();
}, []);
return (
<div>
<h2>Waterfall 방식 예제</h2>
{user ? <div>사용자: {user.name}</div> : <div>사용자 정보를 불러오는 중...</div>}
{posts ? (
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
) : (
<div>게시글을 불러오는 중...</div>
)}
</div>
);
};
export default WaterfallComponent;
- 위 예제에서는 첫 번째 API 호출이 완료된 후 그 결과를 사용해 두 번째 API 요청을 실행합니다.
- API 간 의존성이 있는 경우에는 적절하지만, 독립적인 API 호출에 이 방식을 사용하면 전체 요청 시간이 길어집니다.
Parallel 방식
Parallel 방식은 의존성이 없는 여러 API 요청을 동시에 실행하여 응답 시간을 단축하는 방식입니다.
주로 Promise.all을 사용하여 여러 요청을 병렬로 처리할 수 있습니다.
예제: Parallel 방식으로 API 요청 처리하기
아래 예제는 사용자 정보와 사용자의 게시글을 병렬로 요청하는 예시입니다.
두 요청이 동시에 실행되므로 전체 요청 시간이 더 짧아집니다.
import React, { useEffect, useState } from 'react';
type User = { id: number; name: string };
type Posts = { id: number; title: string }[];
const ParallelComponent: React.FC = () => {
const [user, setUser] = useState<User | null>(null);
const [posts, setPosts] = useState<Posts | null>(null);
useEffect(() => {
const fetchDataInParallel = async () => {
try {
// 두 API 요청을 병렬로 실행
const [userResponse, postsResponse] = await Promise.all([
fetch('https://api.example.com/user'),
fetch('https://api.example.com/posts'),
]);
const userData: User = await userResponse.json();
const postsData: Posts = await postsResponse.json();
setUser(userData);
setPosts(postsData);
} catch (error) {
console.error('API 호출 중 에러 발생:', error);
}
};
fetchDataInParallel();
}, []);
return (
<div>
<h2>Parallel 방식 예제</h2>
{user ? <div>사용자: {user.name}</div> : <div>사용자 정보를 불러오는 중...</div>}
{posts ? (
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
) : (
<div>게시글을 불러오는 중...</div>
)}
</div>
);
};
export default ParallelComponent;
- 이 예제에서는 의존성이 없는 두 API를 동시에 호출하므로, 두 요청 모두 병렬로 실행되어 페이지 렌더링 시간을 줄일 수 있습니다.
- 의존성이 있는 요청: 첫 번째 API의 결과가 두 번째 API 호출에 필수적이라면 waterfall 방식을 사용해야 합니다.
- 의존성이 없는 요청: 서로 독립적인 API 요청은 parallel 방식으로 실행해 효율성을 높이는 것이 좋습니다.
또한, 데이터 로딩 상태 관리나 에러 핸들링 등 부가적인 최적화 기법을 도입하면 사용자 경험을 더욱 향상시킬 수 있습니다.
예를 들어, React Query나 SWR 같은 라이브러리를 사용하면 캐싱, 자동 재시도 등 부가적인 기능을 쉽게 구현할 수 있습니다.
API 호출을 최적화하는 것은 애플리케이션 성능 개선의 핵심 요소입니다.
- Waterfall 방식은 의존성이 있는 요청에 적합하며, 순차적으로 실행되어 안정성을 보장합니다.
- Parallel 방식은 독립적인 요청에 대해 전체 응답 시간을 줄여 효율적인 데이터 처리를 가능하게 합니다.
'개발 공부' 카테고리의 다른 글
| REST API (0) | 2025.03.27 |
|---|---|
| Zod 검증 (0) | 2025.03.12 |
| Tailwind CSS vs. 다른 프레임워크 (0) | 2025.02.12 |
| Tailwind CSS 성능 최적화 (0) | 2025.02.11 |
| Tailwind CSS 커스터마이징 (0) | 2025.02.09 |