개발자

리액트 쿼리 에러 핸들링 이슈

2024년 05월 03일조회 163

react query를 활용한 에러 핸들링이 안돼서 질문 올립니다... //mainpage.tsx const { data, refetch, isFetching } = FetchData(url); const handleSearch = () => { refetch(); } <QueryErrorResetBoundary> {({ reset }) => ( <ErrorBoundary onReset={reset} FallbackComponent={FallbackUI}> {resultVisible ? ( <Result searchData={searchData} isFetching={isFetching} /> ) : ( <EmptyResult /> )} </ErrorBoundary> )} </QueryErrorResetBoundary> react-error-boundary 라이브러리를 이용해 ErrorBoundary 컴포넌트를 가져왔습니다. ErrorBoundary 하위 컴포넌트 내에서 에러가 발생하면 FallbackComponent의 FallbackUI 컴포넌트가 렌더링 되도록 했습니다. //FallbackUI 컴포넌트 //에러가 발생히면 이 컴포넌트가 렌더링되어야합니다. const FallbackUI = ({ error, resetErrorBoundary }) => { return ( <div> <span>{error.message}...</span> <button onclick={resetErrorBoundary} /> 돌아가기 버튼 </div> ); }; export default FallbackUI; FallbackUI 에서 QueryErrorResetBoundary 에서 제공하는 resetErrorBoundary를 받아와 에러 발생 후 '돌아가기 버튼'을 클릭하면 쿼리오류를 처리하고 리셋해주도록 구현했습니다. //url을 파라미터값으로 받아와 api호출하는 함수 //위에 있는 mainpage.tsx 에서 사용하는 함수입니다. const FetchData = (url: string) => { const { error, data, refetch, isFetching } = useQuery({ queryKey: ["repoData"], queryFn: async () => { const res = await axios.get(url); console.log(res.data); return res.data; }, refetchOnWindowFocus: false, enabled: false, }); return { error, data, refetch, isFetching }; }; 리액트 쿼리를 이용해 api를 호출하는 함수입니다. //main.tsx const queryClient = new QueryClient({ defaultOptions: { queries: { retry: 0, throwOnError: true, }, }, }); ReactDOM.createRoot(document.getElementById("root")!).render( <React.StrictMode> <QueryClientProvider client={queryClient}> <BrowserRouter> <GlobalStyles /> <Provider store={store}> <App /> </Provider> </BrowserRouter> </QueryClientProvider> </React.StrictMode> ); 마지막으로 전역으로 에러 관리를 하도록 세팅해놨습니다. 그리고 QueryClient에 throwOnError 속성이 있어야 에러를 ErrorBoundary로 전달할 수 있다해서 추가해줬습니다. 이렇게 세팅해놨는데 에러발생하면 그냥 하얀색 화면만 나오고 fallbackUI가 나오지 않습니다... 원인이 뭘까요...ㅠㅠㅠ 혹시 몰라서 콘솔 에러코드도 올립니다.. 추가로 궁금한 점 1. useQuery 에서 반환하는 객체중 error 객체는 어떤 존재인지 궁금합니다. 2. useQuery 속성과 QueryClient 속성 모두 throwOnError : true 를 가지고 있던데 어떤 차이점인지 궁금합니다. 답변주시면 정말 감사하겠습니다!!!

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

JB님의 프로필 사진

안녕하세요 모바일이라 자세하게 답변 못드리는점 양해 부탁드립니다. 구조가 맞는지는 모르겠으나 에러 바운더리는 리액트 쿼리를 실제로 사용하고 있는 컴포넌트를 참조하는 쪽에서 사용해주어야 합니다. 이 경우에는 mainpage 를 실제로 참조해서 쓰고있는 호출부에서 mainpage를 에러 바운더리로 감싸줘야 할 것 같네요. 1. 에러 객체는 서버 에러 리스폰스 객체입니다 2. 훅에서 사용하면 해당 훅에서만 throwOnError 값을 설정하는 것이고, QueryClient에서 사용하면 전역적으로 처리하는 것입니다.

털먹는토끼님의 프로필 사진

털먹는토끼

작성자

해당없음 해당없음2024년 05월 05일

먼저 답변 정말 감사합니다!! 제 프로젝트 구조상 mainPage.tsx 컴포넌트 내에 리액트 쿼리로 비동기함수를 호출( handleSearch 함수)하는 버튼이 존재하고, 반환한 data값을 Result컴포넌트에서 props로 전달받아 Result 컴포넌트를 렌더링시키는 방식입니다. 말씀해주신대로라면 Result컴포넌트에서 리액트 쿼리를 사용하고 Result컴포넌트를 에러바운더리로 감싸야하는 것 같은데 위에 언급한 버튼도 Result 컴포넌트 내에 존재해야하는걸까요..?? 그러면 만약 에러가 발생해서 fallbackUI가 화면에 띄워질 경우 버튼도 같이 사라지게 되니 사용자경험 측면에서 좋지 못할 것 같습니다...ㅠㅠㅠ 비동기함수를 호출하는 로직과 에러핸들링하는 컴포넌트를 분리해서 운영하는 방법은 없을까요?

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!