본문 바로가기

개발 공부

try-catch & then-catch

비동기 로직을 작성하다 보면 try-catch와 then-catch 모두 자주 마주치게 됩니다.

이 둘은 에러를 핸들링한다는 목적은 같지만, 쓰임새코드 스타일, 처리 흐름에서 차이가 있습니다.

 


try-catch

try-catch는 동기/비동기 코드에서 발생할 수 있는 예외를 잡아내기 위한 전통적인 방법입니다.

주로 async/await와 함께 쓰입니다.

 

async function getUserData() {
  try {
    const res = await fetch('/api/user');
    const data = await res.json();
    return data;
  } catch (error) {
    console.error('에러 발생:', error);
    throw error;
  }
}
  • await 키워드는 Promise가 resolve 또는 reject될 때까지 기다린 후 값을 반환함
  • try 블록 안에서 에러가 발생하면 catch로 흐름이 넘어감
  • 코드 흐름이 동기적이기 때문에 가독성이 좋음

 

 


 

then-catch

then-catch는 Promise 체이닝 방식으로, 콜백 형식으로 비동기 결과를 처리합니다.

function getUserData() {
  return fetch('/api/user')
    .then((res) => res.json())
    .then((data) => {
      console.log('유저 데이터:', data);
      return data;
    })
    .catch((error) => {
      console.error('에러 발생:', error);
      throw error;
    });
}

 

  • then()은 이전 Promise가 성공(resolve)했을 때 실행됨
  • catch()는 에러(reject)가 발생했을 때 실행됨
  • 콜백 지옥을 피하면서도 연속적인 처리가 가능

 


어느 쪽을 써야 할까?

상황 추천 방식 이유
여러 비동기 호출을 순차적으로 처리 try-catch async/await로 가독성이 높아짐
단순 API 호출 후 처리 then-catch 간결하고 체이닝하기 쉬움
함수 안에서 return 흐름이 중요 try-catch 흐름 제어가 명확함
체이닝된 여러 Promise 처리 then-catch 하나의 체인으로 처리 가능

 

 


 

예시: 회원가입 처리

1. try-catch  (React + async/await)

const handleSignup = async (formData: SignupForm) => {
  try {
    const res = await axios.post('/api/signup', formData);
    toast.success('회원가입 완료!');
    navigate('/welcome');
  } catch (err) {
    if (axios.isAxiosError(err) && err.response?.status === 409) {
      toast.error('이미 가입된 이메일입니다.');
    } else {
      toast.error('회원가입 중 오류가 발생했습니다.');
    }
  }
};

 

 

  • await으로 동기적인 흐름을 유지하며 코드 가독성이 좋음
  • 에러를 구체적으로 분기 처리하기 쉬움 (e.g. 409 Conflict 처리)

 

2. then-catch 

const handleSignup = (formData: SignupForm) => {
  axios.post('/api/signup', formData)
    .then(() => {
      toast.success('회원가입 완료!');
      navigate('/welcome');
    })
    .catch((err) => {
      if (axios.isAxiosError(err) && err.response?.status === 409) {
        toast.error('이미 가입된 이메일입니다.');
      } else {
        toast.error('회원가입 중 오류가 발생했습니다.');
      }
    });
};

 

 

  • 단순한 로직엔 여전히 직관적임
  • 코드 흐름이 덜 직관적이지만, Promise를 직접 반환해야 할 때 유리함 (e.g. .finally(), 체이닝 등)

 

 

 

 

 

'개발 공부' 카테고리의 다른 글

웹 서버(Web Server), 웹 애플리케이션 서버(WAS)  (0) 2025.09.20
거시적인 관점에서 코드를 짜기  (0) 2025.09.08
Pub/Sub (3) - Next.js + Zustand  (0) 2025.06.30
Pub/Sub (2) - Angular + RxJS  (0) 2025.06.29
Pub/Sub (1)  (0) 2025.06.28