오늘은 무한 스크롤 로직을 재사용 가능한 커스텀 훅으로 리팩토링했습니다.
배경
기존 코드에서 인기 영화, 현재 상영 영화, 상영 예정 영화 등을 각각의 훅에서 무한 스크롤로 불러오는 로직이 중복되어 있었습니다.
작업 내용
- useInfiniteScroll 커스텀 훅을 생성하여 무한 스크롤 로직을 추출
- usePopularMovies, useNowPlayingMovies, useUpcomingMovies 훅에서 useInfiniteScroll 훅을 재사용하여 코드 중복 제거
코드 예시
// 변경 전 무한 스크롤
export const usePopularMovies = () => {
return useInfiniteQuery<
MovieResponse,
Error,
InfiniteData<MovieResponse>,
string[],
number
>({
queryKey: ["popularMovies"],
queryFn: ({ pageParam = 1 }) => api.movie.fetchPopularMovies(pageParam),
initialPageParam: 1,
getNextPageParam: (lastPage) => {
if (lastPage.page < lastPage.total_pages) return lastPage.page + 1;
return undefined;
},
});
};
import { useInfiniteQuery } from "@tanstack/react-query";
import { InfiniteData } from "@tanstack/query-core";
export const useInfiniteScroll = (
queryKey: string,
fetchFunction: (pageParam: number) => Promise<MovieResponse>
) => {
return useInfiniteQuery<MovieResponse, Error, InfiniteData<MovieResponse>, string[], number>({
queryKey: [queryKey],
queryFn: ({ pageParam = 1 }) => fetchFunction(pageParam),
initialPageParam: 1,
getNextPageParam: (lastPage) => {
if (lastPage.page < lastPage.total_pages) return lastPage.page + 1;
return undefined;
},
});
};
// 인기 영화 무한 스크롤 불러오기
export const usePopularMovies = () => {
return useInfiniteScroll("popularMovies", api.movie.fetchPopularMovies);
};
// 현재 상영 영화 무한 스크롤
export const useNowPlayingMovies = () => {
return useInfiniteScroll("nowPlayingMovies", api.movie.fetchNowPlayingMovies);
};
// 상영 예정 영화 무한 스크롤
export const useUpcomingMovies = () => {
return useInfiniteScroll("upcomingMovies", api.movie.fetchUpcomingMovies);
};
이번 리팩토링으로 코드 중복을 줄이고 유지보수성을 높일 수 있었습니다.
'TIL' 카테고리의 다른 글
TIL - 북마크된 영화 목록 기능 구현을 위한 고민과 해결 방안 (0) | 2024.07.02 |
---|---|
TIL - Next.js&supabase에서 createClient Vs. createServerComponentClient (0) | 2024.07.01 |
TIL - Supabase에서 .select() 사용하기 (0) | 2024.06.28 |
TIL - Zustand와 Tanstack Query를 이용한 상태 관리 (0) | 2024.06.27 |
TIL - 배럴 파일 구조를 통한 효율적인 컴포넌트 관리 (0) | 2024.06.26 |