[SPRINGBOOT] 예외처리

승 아·2023년 6월 13일

Spring MVC에서의 예외 처리

@ExceptionHandler를 이용한 Controller 레벨에서의 예외 처리

  • Response Body의 내용만으로는 요청 데이터 중에서 어떤 항목이 유효성 검증에 실패했는지 알 수가 없음
    -> 클라이언트가 전달받는 Response Body는 애플리케이션에서 예외(Exception)가 발생 시 내부적으로 Spring에서 전송함
    직접 처리하도록

  • @ExceptionHandler 애너테이션 이용 : 발생하는 에러정보를 받음

  • ErrorResponse 클래스 생성 : Request Body에 대한 유효성 검증 실패 시 필요한 에러 정보만 담아서 클라이언트에게 응답으로 전송

Response Body를 보면 JSON 응답 객체가 배열

  • DTO 클래스에서 검증해야 되는 멤버 변수에서 유효성 검증에 실패하는 멤버 변수들이 하나 이상이 될 수 있기 때문에 유효성 검증 실패 에러 역시 하나 이상이 될 수 있음

-> 한 개 이상의 유효성 검증에 실패한 필드의 에러 정보를 담기 위해서 List 객체를 이용

But
1. 각 Controller 클래스마다 코드 중복이 발생
2. 에러 종류가 많아질수록, 하나의 Controller 클래스 내에서도 @ExceptionHandler를 추가한 에러 처리 핸들러 메서드가 늘어남

-> @RestControllerAdvice 애너테이션을 추가한 클래스를 이용하면 예외 처리를 공통화할 수 있음

exceptionadvice클래스를 만들고 @RestControllerAdvice 애너테이션을 추가해 예외처리 중복 방지를 위해 에러처리를 공통화 해줌
@RestControllerAdvice : Controller 클래스에서 발생하는 예외 처리

비즈니스 로직에 대한 예외 처리

  • 애플리케이션에서 발생하는 예외는 체크 예외와 언체크 예외가 있음

체크 예외

  • 예외를 잡아서 체크 후 복구 or 회피 등 구체적 처리 해야하는 예외
    ex) ClassNotFoundException

언체크 예외

  • 예외를 잡아서 어떤 처리를 할 필요 없는 예외
    ex) NullPointerException, ArrayIndexOutOfBoundsException

    • 흔히 개발자가 코드를 잘못 작성해서 발생하는 이런 오류들은 모두 RuntimeException을 상속한 예외들

    • RuntimeException 이용해서 개발자가 직접 예외를 만들어야 할 경우도 있음

의도적인 예외 던지기

  • java에서는 throw 키워드 사용 메서드를 호출한 지점으로 던짐
    ex) 서비스 계층의 메서드는 API계층인 controller의 핸들러 메서드가 잡아서 처리

-> 이미 controller에서 발생하는 예외를 Exception Advice에서 처리하도록 공통화 해두었으므로, 서비스 계층에서 던진 예외도 Exception Advice에서 처리하면 됨

BUT

  • 서비스 계층에서 예외를 그대로 던지고(throw), Exception Advice에서 예외를 그대로 잡는 것(catch)은 예외의 의도가 명확하지 않음
  • 구체적인 예외 정보를 얻는 것이 어려움

사용자 정의 예외(Custom Exception) 사용

  • 서비스 계층에서 던질 Custom Exception에 사용할 ExceptionCode를 enum으로 정의
  • 서비스 계층에서 사용할 Custom Exception 정의
profile
개발 공부를 기록하는 공간

0개의 댓글