개발자
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
안녕하세요 모바일이라 자세하게 답변 못드리는점 양해 부탁드립니다. 구조가 맞는지는 모르겠으나 에러 바운더리는 리액트 쿼리를 실제로 사용하고 있는 컴포넌트를 참조하는 쪽에서 사용해주어야 합니다. 이 경우에는 mainpage 를 실제로 참조해서 쓰고있는 호출부에서 mainpage를 에러 바운더리로 감싸줘야 할 것 같네요. 1. 에러 객체는 서버 에러 리스폰스 객체입니다 2. 훅에서 사용하면 해당 훅에서만 throwOnError 값을 설정하는 것이고, QueryClient에서 사용하면 전역적으로 처리하는 것입니다.
털먹는토끼
작성자
해당없음 해당없음 • 2024년 05월 05일
먼저 답변 정말 감사합니다!! 제 프로젝트 구조상 mainPage.tsx 컴포넌트 내에 리액트 쿼리로 비동기함수를 호출( handleSearch 함수)하는 버튼이 존재하고, 반환한 data값을 Result컴포넌트에서 props로 전달받아 Result 컴포넌트를 렌더링시키는 방식입니다. 말씀해주신대로라면 Result컴포넌트에서 리액트 쿼리를 사용하고 Result컴포넌트를 에러바운더리로 감싸야하는 것 같은데 위에 언급한 버튼도 Result 컴포넌트 내에 존재해야하는걸까요..?? 그러면 만약 에러가 발생해서 fallbackUI가 화면에 띄워질 경우 버튼도 같이 사라지게 되니 사용자경험 측면에서 좋지 못할 것 같습니다...ㅠㅠㅠ 비동기함수를 호출하는 로직과 에러핸들링하는 컴포넌트를 분리해서 운영하는 방법은 없을까요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!