[코드 개선하기] try, catch vs React Query의 onSuccess, onError : 비동기 처리 로직 통일하기

2025. 6. 25. 14:28·웹/React

🖥️ 코드리뷰 中

export const createPost = async (data: ICreatePostRequest) => {
  const response = await axiosInstance.post<IApiResponse<{ postId: number }>>(
    `${API_SUB_URLS_V3}/posts`,
    data
  );

  return response.data.data;
};

 

코드 리뷰에서 위와 같은 질문을 받고 비동기 처리 로직을 돌아보았고, react query의 에러 핸들링 메소드와 try, catch를 혼용해서 사용하고 있었습니다.

 

비동기 로직 되돌아보기

export const createPost = async (data: ICreatePostRequest) => {
  const response = await axiosInstance.post<IApiResponse<{ postId: number }>>(
    `${API_SUB_URLS_V3}/posts`,
    data
  );

  return response.data.data;
};

해당 함수는 api 호출과 그에 따른 응답 데이터를 반환하는 함수로, @tanstack/react-query의 useMutation을 사용한 커스텀 훅(useCreatePost)에서 호출해 사용중입니다.

 

createPost() 호출 커스텀 훅

/**
 * 게시글 등록 뮤테이션 훅
 * */
export const useCreatePost = () => {
  return useMutation({
    mutationFn: (data: ICreatePostRequest) => createPost(data),
  });
};

useCreatePost() 호출

아래와 같이 페이지에서 useCreatePost 훅을 호출하면서, 결과적으로 createPost()를 호출합니다. 에러 핸들링의 경우, try-catch, onError(react query 내부 에러 핸들러)를 사용하였는데 두 방법의 차이를 인지하지 못하고 혼용해서 중복 사용하고 있었습니다.

const createPostMutation = useCreatePost();
const handleCreatePost = (data: IPostFormData) => {
    try {
      createPostMutation.mutateAsync(
        {
          // data
        },
        {
          onSuccess: response => {
            // 성공 시 수행
          },
          onError: (error: any) => {
           // 에러 발생 시 수행
          },
        }
      );
    } catch {
      alert('게시글 등록에 실패했습니다');
    }
  };

try-catch 문은 자바스크립트 코드에서 throw 된 에러를 핸들링하며 onError의 경우 React Query 내부에서 발생한 비동기 에러를 핸들링합니다.

mutateAsync의 경우 요청 실패시 promise를 reject하므로 catch문이 실행될 수 있습니다. 그러나 제 코드에서는 async-await를 쓰지 않아 즉시 다음으로 넘어가게 되고, catch 문이 에러를 잡지 못한 것으로 판단됩니다.

마찬가지로 onError의 경우에도 비동기 요청이 실패할 경우 수행됩니다.

비동기 에러를 잡는데 try-catch 문은 async-await 키워드를 쓰지 않아 의미가 없었지만 onError 덕분에 제 코드에서는 에러 처리가 잘 동작했던 것입니다.

수정

결론적으로, 아래와 같은 방식으로 에러 핸들링을 통일하였습니다.

createPostMutation.mutate(
      {
        // request data
      },
      {
        onSuccess: response => {
          // 성공 시 수행
        },
        onError: (error: unknown) => {
         // 에러 발생 시 수행
        },
      }
    );

'웹 > React' 카테고리의 다른 글

[React] 좋아요 낙관적 업데이트 적용하기  (1) 2025.07.21
[React] memo, useCallback을 사용한 렌더링 최적화  (3) 2025.07.08
[React] 폰트 최적화 + preload 적용해 사용자 경험 개선하기  (0) 2025.06.23
[React, Vite, Vite-bundle-analyzer] CSR에서 초기 로딩 시간 단축하기 2 - 라이브러리 청크 단위로 정적 분리  (0) 2025.06.03
[React, Vite, Vite-bundle-analyzer] CSR에서 초기 로딩 시간 단축하기 1 - 코드 스플리팅, 지연 로딩하기 (+ 번들 시각화)  (0) 2025.06.02
'웹/React' 카테고리의 다른 글
  • [React] 좋아요 낙관적 업데이트 적용하기
  • [React] memo, useCallback을 사용한 렌더링 최적화
  • [React] 폰트 최적화 + preload 적용해 사용자 경험 개선하기
  • [React, Vite, Vite-bundle-analyzer] CSR에서 초기 로딩 시간 단축하기 2 - 라이브러리 청크 단위로 정적 분리
Hyemimi
Hyemimi
배움의 과정에서 느껴지는 소소한 즐거움을 중요시합니다 🌱
  • Hyemimi
    Hyemi.techlog
    Hyemimi
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • 웹 (15)
        • React (10)
        • Next (1)
      • 앱 (0)
        • Flutter (0)
      • 회고 (2)
        • 카카오테크 부트캠프 (4)
      • 언어 (1)
        • JavaScript (0)
        • TypeScript (1)
        • Python (0)
      • CS (3)
      • 알고리즘 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    최적화
    KTB
    OSSCA
    부트캠프추천
    폰트 최적화
    카카오
    부트캠프
    오픈소스 컨트리뷰션 아카데미
    카테부
    비동기
    react
    CSR
    카테부커뮤니티
    판교부트캠프
    kakaotechbootcamp
    Vite
    Kakao
    preload
    카카오테크부트캠프
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
Hyemimi
[코드 개선하기] try, catch vs React Query의 onSuccess, onError : 비동기 처리 로직 통일하기
상단으로

티스토리툴바