[Project] API 예외 전역 처리하기

김지현·2023년 11월 7일
0

Spring Boot 프로젝트

목록 보기
2/20

spring boot로 익명 게시판 서버 만들기
GitHub : https://github.com/zomeong/Post-Borad

API 예외 처리

이전에 기본 CRUD 기능 구현을 해둔 프로그램의 경우 throw로 예외를 던지면 단순히 에러 화면이 표시가 된다. 이에 대해 판단할 수 있도록 JSON으로 에러 코드와 메세지 데이터를 반환해주는 처리를 하였다.

HTTP 상태 코드

HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 알려준다. 크게 5개의 그룹으로 나뉘며 100~500까지의 번호대로 구분한다.

  • 1XX : 정보 응답
  • 2XX : 성공 응답
  • 3XX : 리다이렉션 메세지
  • 4XX : 클라이언트 에러 응답
  • 5XX : 서버 에러 응답

HandlerExceptionResolver

스프링은 컨트롤러 밖으로 던져진 예외를 해결하고 동작 방식을 새로 정의할 수 있는 방법을 제공한다. HandlerExceptionResolver(줄여서 ExceptionResolver)을 사용하면 된다. 날아온 예외를 ExceptionResolver에서 해결한 후, 정상적인 호출로 WAS로 리턴한다.

@ExceptionHandler

ExceptionHandlerExceptionResolver는 스프링 부트에서 기본으로 제공하는 예외 처리 기능, ExceptionResolver로 @ExceptionHandler 애너테이션을 통해 구현할 수 있다.


🔍 예외 처리 구현 과정
1. Json 형식으로 보낼 오류 필드 클래스 생성

@Data
@AllArgsConstructor
public class ErrorResult {
	private String code;
	private String message;
}
  1. 컨트롤러 생성
@Slf4j
@RestControllerAdvice
public class ApiExceptionController {
}
  • 예외 처리 클래스를 따로 생성하지 않고 메서드 추가만으로도 구현 가능한 듯 하지만.. 깔끔하게 구현하고 싶어서 클래스를 따로 생성하였다.
  • @Slf4j : Simple Logging Facade for Java, 로깅 프레임워크에 대한 추상화 라이브러리
  • @RestControllerAdvice : 여러 컨트롤러에 대해 전역적으로 ExceptionHandler를 적용하여 예외 처리 가능
  1. 메서드 생성
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(IllegalArgumentException.class)
public ErrorResult errorHandle(IllegalArgumentException e){
    log.error("[exceptionHandle] ex", e);
    return new ErrorResult("BAD", e.getMessage());
  • @ResponseStatus : HttpStatus 지정
  • IllegalArgumentException을 캐치하여 처리
  • 1번에서 생성한 에러 스펙에 맞추어 응답 return

⚠️ 이러한 방식 말고도 여러 방법으로 에러 처리가 가능하다.

결과

if (!getPassword.equals(feed.getPassword())){
       throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
}

service에서 던진 IllegalArgumentException을 처리하여 json 형식으로 반환하였다.

0개의 댓글