개발자
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가 화면에 띄워질 경우 버튼도 같이 사라지게 되니 사용자경험 측면에서 좋지 못할 것 같습니다...ㅠㅠㅠ 비동기함수를 호출하는 로직과 에러핸들링하는 컴포넌트를 분리해서 운영하는 방법은 없을까요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 05월 03일
이 코드의 문제는 ErrorBoundary가 가능한 에러를 잡지 못하도록 설정되어 있기 때문일 수 있습니다. 사용중인 ErrorBoundary의 위치와 범위에 대해 확인해 보시는게 좋을 것 같습니다. `<QueryErrorResetBoundary>` 컴포넌트 영역 내부에서 발생하는 error만을 catch하기 때문에 이 영역 외부에서 발생하는 에러들은 ErrorBoundary에서 잡아내지 못합니다. React Query의 `useQuery` 후크에서 발생하는 에러는 `<QueryErrorResetBoundary>` 컴포넌트 밖에서 처리하도록 하는 것이 좋습니다. 이렇게 하면 `useQuery`에 의해 생성된 예외가 ErrorBoundary로 전파될 수 있습니다. 추가로 궁금하신 점에 대해 답변드립니다: 1. useQuery에서 반환되는 error 객체는 query 수행 중 발생한 모든 에러를 포착합니다. 만약 요청이 성공하지 않거나 (예를 들어, 서버에서 5xx 상태 코드가 반환된 경우) 요청 작업 중 JavaScript 에러가 발생한 경우 해당 에러 정보를 담고 있습니다. 2. throwOnError: React Query API에 특이한 부분으로 이 속성이 true로 설정되면, useQuery 후크 실행 과정 중 오류가 발생하면 해당 오류를 throw 합니다(exceptions that are 'thrown' will propagate upwards like a normal exception and should therefore be handled by a JavaScript error boundary). 반면 QueryClient에 throwOnError가 설정되어 있다면, queryClient 실행 과정에서 발생한 오류를 throw 합니다. 기술적인 문제 해결은 종종 복잡할 수 있으니, 당신의 프로젝트 코드 구조와 추가적으로 제공하실만한 정보가 있다면 더 구체적인 조언을 드릴 수 있습니다. 그 외에도 콘솔에서 내려주는 에러 메시지를 정확히 알려주신다면 좀 더 구체적으로 트러블 슈팅을 도울 수 있을 것 같습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!