React Query에서 중복 API 로직을 커스텀 훅으로 추출하는 방법에 대해 어떻게 생각하시나요? #202
Replies: 5 comments
-
안녕하세요!! 제시해주신 코드만 봤을 때는, 함수로 따로 추출해주신 것이 유지보수에 도움이 될 거라고 생각됐어요!! 대신, 해당 함수들이 변경없이 많은 곳에서 재활용되는 경우면 그 usecase가 더 많아질 수 있겠네요 |
Beta Was this translation helpful? Give feedback.
-
저도 따로 훅으로 빼는걸 선호하는데 이러면 발생할수있는 문제가 같은 훅을 사용하더라도 상황에따라 다른 쿼리옵션을 주어야할때 어려워지더라구요,, 물론 위 예시는 매우 간단해서 인자로 뚫어주어도 되지만 복잡해지면 한계가있어서,, // query 문서 참고
const postQueries = {
all: () => ({ queryKey: ['todos'] }),
allLists: () => ({
queryKey: [...postQueries.all().queryKey, 'list']
}),
list: (sort) => ({
queryKey: [...postQueries.allLists().queryKey, sort],
queryFn: () => fetchTodos(sort),
staleTime: 5 * 1000,
}),
allDetails: () => ({
queryKey: [...postQueries.all().queryKey, 'detail']
}),
detail: (id) => ({
queryKey: [...postQueries.allDetails().queryKey, id],
queryFn: () => fetchTodo(id),
staleTime: 5 * 1000,
}),
} 이러면 훅으로 분리해도 유연성도 가져갈수있을거같습니다
|
Beta Was this translation helpful? Give feedback.
-
일단 저는 제공해주신 내용에서 중복된 로직을 분리하는게 복잡성을 초래한다고 생각하지는 않아요. 제공해주신 코드에서 봤을때 공통으로 사용되는것들이 두가지가 있는 것 같아요.
첫 번째로 email, token값에 대한 검증처리 에 대한 분리에요. 두 번째로 result.stateCode !== 200에 대한 에러처리에요. 이렇게한다면 작성해주신 쿼리에서 실제로 react-query와 연관된 역할로써만 사용이되고, 값을 검증하거나 에러를 처리하는 로직이 다른 계층에서 처리되기때문에 각각의 함수가 자신의 역할만 할 수 있도록 분리가 되지않을까 싶습니다. |
Beta Was this translation helpful? Give feedback.
-
저도 처음에 작성자님이 해주신 것처럼 query의 option들을 뒤로 숨기기 위해 커스텀 훅으로 추출했었습니다. 컴포넌트 단에서는 복잡해보일 수 있는 option들이 안 보이기 때문에 인지 부하를 낮출 수 있는 방법이라고 생각해요! 최근에는 tkdodo 블로그에서 The Query Options API라는 아티클을 본 뒤로는 queryOptions 함수를 적극 사용하고 있습니다.😀 queryOptions다음과 같이 query들을 정의한 다음, import { queryOptions } from '@tanstack/react-query';
export const todosQuery = queryOptions({
queryKey: ['todos'],
queryFn: getTodos,
});
export const todoDetailQuery = ({ todoId }: { todoId: string }) =>
queryOptions({
queryKey: ['todos', todoId],
queryFn: () => getTodoDetail(todoId),
enabled: Boolean(todoId),
}); 정의한 query들을 바탕으로 다음과 같이 사용하고 있어요. export function Component() {
const { data: todos } = useQuery(todosQuery);
const { data: todoDetail } = useQuery(todoDetailQuery({ todoId: '1' }));
...
} 장점앞서 정의한 todosQuery를 커스텀 훅으로 정의를 했다면 서버 사이드에서는 이를 재활용할 수 없어요. 하지만 queryOptions로 정의했다면 가능해집니다. export const getServerSideProps = async () => {
const queryClient = new QueryClient();
await queryClient.prefetchQuery(todosQuery);
...
}; 그리고 |
Beta Was this translation helpful? Give feedback.
-
순수 api call이 아닌 dom을 위해 변형한 로직인거라 다른 useQuery와 다른 구분을 해줬으면 좋을 것 같습니다. (ex: bff |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
안녕하세요, 저는 React Query를 처음 사용해보는 입장입니다. 현재 프로젝트에서 ContentSection 컴포넌트 내에서 전체 콘텐츠와 북마크 데이터를 각각 useQuery로 가져오고 있는데요, 두 쿼리 모두 email과 token 체크 및 API 응답 검증 같은 유사한 로직이 포함되어 있습니다.
제가 생각한 방법은 이 중복 로직을 커스텀 훅으로 추출하여 관리하는 것입니다. 아래와 같이 코드를 작성 해봤습니다
위와 같은 코드로 상태를 관리하려하는데, 알맞게 사용하고 있는 건지 잘 모르겠어서 시니어 개발자 분들께 여쭤봅니다!!
42 votes ·
Beta Was this translation helpful? Give feedback.
All reactions