Table of Contents
예외 처리
- 서버는 클라이언트가 요청을 보내면 반드시 클라이언트에게 요청에 대한 응답을 해야 한다
- 서버가 응답을 반환하지 않으면, 클라이언트는 우리의 서비스를 떠나기 전까지 다른 요청을 보내지 못하고 계속 대기 해야 한다
- 이는 유저의 사용자 경험을 떨어트리고, 서비스 이탈을 초래한다
- 하지만 서버에서는 예상치 못한 일로 기대한 응답을 반환하지 못하는 경우가 생긴다
- 이런 상황에서도 서버는 어쨋든 응답을 반환해야 하는데 이를 예외 처리(Exception Handling)라고 한다
예외 발생 원인
- 예외가 발생하는 경우는 다양하지만 우리가 사전에 대비할 수 있는 예외는 다음과 같다
- 클라이언트의 잘못된 요청 (상태코드 400번대)
- 서버에서의 프로그래밍 오류 (상태코드 500번대)
클라이언트 문제
- 400 (Bad Request): 요청이 유효하지 않아 서버가 요청을 이해할 수 없음을 의미
- 잘못된 바디, 잘못된 타입, 불필요한 값, 필수값 누락 등 -> 요청을 다시 작성하도록 유도
- 401 (UnAuthorized): UnAuthorized 라고 하지만, 의미상 UnAuthenticated임 (로그인 필요한 경우)
- jwt 토큰 누락, 유효하지 않은 jwt 토큰 등 -> 로그인 하도록 유도
- 403 (Forbidden): 이게 UnAuthorized에 맞는 응답. 리소스에 필요한 권한을 가지고 있지 않음을 의미
- 권한이 없는 경우 -> 이 전 페이지로 돌아가도록 유도
- 404 (Not Found): 서버에 존재하지 않는 API 또는 resource를 요청한 경우
- 존재하지 않는 API 또는 리소스를 요청한 경우 -> 이 전 페이지로 돌아가도록 유도
- 422 (Unprocessable Entity): 요청이 올바로 만들어 졌지만, validation이 실패한 경우
- 데이터 검증에 실패한 경우 -> 요청을 다시 작성하도록 유도
- 429 (Too Many Requests): 사용자가 지정된 시간에 너무 많은 요청을 보낸 경우(“rate limiting”)
서버 문제
- 500 (Internal Server Error): 서버에 문제가 있음을 의미 (보통 백엔드 코드나 데이터베이스에서 에러가 발생한 경우)
- 일반적으로 500대 에러는 서버 내부의 문제이기 때문에 클라이언트에 보여주면 안된다
- 500대 에러는 내부적으로 로깅, 개발자에게 알림, 클라이언트에게는 400대 에러로 처리하는게 좋다
예외 처리 코드
메세지 규격화
- 예외가 발생했을 때 클라이언트에게 반환할 메세지, 그리고 로깅 메세지의 형태를 미리 정의하고 지키는게 좋다
{
"timestamp": 에러가 발생한 시간,
"statusCode": HTTP 상태코드,
"error": 에러 제목,
"message": 추가 설명
}
코드 작성 위치
- 예외를 발생시키는 코드는 컨트롤러단에 작성해서 비즈니스 로직과 분리한다
- 예외를 처리하는 코드는
- 지역적인 경우에는 컨트롤러단에 만든다
- 전역적인 경우는 따로 예외 처리 계층을 만든다