데이터 Fetching의 중요성
1. 사용자 경험(UX) 향상:
- 빠르고 효율적인 데이터 로딩은 사용자 만족도를 크게 높입니다.
- 지연 시간을 최소화하여 앱의 반응성을 개선합니다.
2. 성능 최적화:
- 불필요한 데이터 전송을 줄여 네트워크 대역폭을 절약합니다.
- 서버 부하를 감소시켜 전체 시스템의 효율성을 높입니다.
3. 리소스 관리:
- 클라이언트와 서버 모두의 리소스(메모리, CPU 등)를 효율적으로 사용합니다.
- 모바일 기기에서 특히 중요한 배터리 소모를 줄일 수 있습니다.
벌크 요청 방식 (getMultipleTrackDetails)
구현 방법:
Spotify API를 사용하여 벌크 요청을 구현하는 예시
async getMultipleTrackDetails(trackIds: string[]): Promise<SpotifyApi.TrackObjectFull[]> {
const access_token = await this.getAccessToken();
const ids = trackIds.join(',');
const response = await fetch(`https://api.spotify.com/v1/tracks?ids=${ids}`, {
headers: { Authorization: `Bearer ${access_token}` },
});
const data = await response.json();
return data.tracks;
}
사용 예시:
const tracks = await api.spotify.getMultipleTrackDetails(['id1', 'id2', 'id3']);
장점:
- 단일 네트워크 요청으로 여러 트랙의 정보를 한 번에 가져올 수 있어 효율적입니다.
- 서버 부하를 줄일 수 있습니다.
- 구현이 간단하고 직관적입니다.
- 전체 데이터를 한 번에 로드하므로 UI 렌더링이 일관적입니다.
단점:
- Spotify API에서 한 번에 가져올 수 있는 트랙의 수에 제한이 있을 수 있습니다.
- 모든 트랙 정보가 한 번에 로드되므로, 일부 트랙 정보만 필요한 경우에도 불필요한 데이터를 가져올 수 있습니다.
- 대량의 데이터를 한 번에 로드하므로 초기 로딩 시간이 길어질 수 있습니다.
개별 요청 방식 (useQueries with getTrackDetails)
API 함수
각 트랙을 개별 요청으로 가져오는 예시
async getTrackDetails(trackId: string): Promise<SpotifyApi.TrackObjectFull> {
const access_token = await this.getAccessToken();
const response = await fetch(`https://api.spotify.com/v1/tracks/${trackId}`, {
headers: { Authorization: `Bearer ${access_token}` },
});
return response.json();
}
클라이언트 컴포넌트에서 사용
클라이언트에서 여러 트랙을 병렬로 요청하는 방법
import { useQueries } from '@tanstack/react-query';
function TrackList({ trackIds }) {
const trackQueries = useQueries({
queries: trackIds.map(id => ({
queryKey: ['track', id],
queryFn: () => api.spotify.getTrackDetails(id),
})),
});
// 결과 처리
const tracks = trackQueries.map(query => query.data).filter(Boolean);
// ... 렌더링 로직
}
장점:
- 필요한 트랙 정보만 선택적으로 가져올 수 있어 유연성이 높습니다.
- 각 트랙에 대한 요청을 개별적으로 캐싱하고 관리할 수 있어, 재사용성이 높습니다.
- 동시에 여러 요청을 병렬로 처리할 수 있어 전체 로딩 시간을 줄일 수 있습니다.
- 부분적인 데이터 로딩이 가능해 progressive loading을 구현하기 쉽습니다.
단점:
- 많은 수의 트랙을 가져올 때 여러 번의 네트워크 요청이 발생하여 서버 부하가 증가할 수 있습니다.
- 구현이 약간 더 복잡할 수 있습니다.
- 각 요청이 개별적으로 실패할 수 있어 에러 처리가 더 복잡해질 수 있습니다.
- 네트워크 상태에 따라 일부 트랙 정보만 로드되어 UI가 일관적이지 않을 수 있습니다.
선택 기준:
- 데이터의 양: 트랙 수가 적다면 벌크 요청이, 많다면 개별 요청이 유리할 수 있습니다.
- 사용 패턴: 항상 전체 목록이 필요하다면 벌크 요청이, 부분적 로딩이 필요하다면 개별 요청이 적합합니다.
- 캐싱 요구사항: 개별 트랙 정보를 자주 재사용한다면 개별 요청 방식이 유리합니다.
- 성능 요구사항: 초기 로딩 속도가 중요하다면 벌크 요청이, 점진적 로딩이 중요하다면 개별 요청이 좋습니다.
결론: 상황에 맞는 유연한 접근의 중요성
오늘 배운 것 중에서 가장 중요한 점은, 데이터 fetching은 현대 웹 애플리케이션의 핵심 요소이며, 효율적인 데이터 fetching은 애플리케이션의 성능, 사용자 경험, 확장성에 직접적인 영향을 미친다는 것입니다. 하지만 모든 상황에 적용할 수 있는 단일 "최고의" 솔루션은 없다는 것을 배웠습니다. 따라서 다양한 전략을 이해하고, 각 상황의 특성과 요구사항을 고려하여 가장 적합한 접근 방식을 유연하게 선택하고 적용할 수 있어야겠다고 생각했습니다.
'TIL' 카테고리의 다른 글
TIL - 타입스크립트 타입 가드와 타입 좁히기 (0) | 2024.07.15 |
---|---|
TIL - Next.js 클라이언트 컴포넌트에서 API 토큰 관리 문제 트러블 슈팅 (0) | 2024.07.12 |
TIL - Next.js와 Zustand를 사용한 상태 관리 및 SSR 하이드레이션 (0) | 2024.07.10 |
TIL- 시스템 설계와 Many-to-Many 관계 적용 (0) | 2024.07.09 |
TIL - 서버 사이드 렌더링으로 화면 깜빡임 제거 (0) | 2024.07.08 |