44DAYS) [Spring MVC] 예외 처리 - @Exceptionhandler, @Restcontrolleradvice

nacSeo (낙서)·2022년 12월 20일
0

◉ 학습목표

1. @Exceptionhandler 애너테이션을 사용해 예외를 처리할 수 있다.
2. @Restcontrolleradvice 애너테이션을 사용해 예외를 처리할 수 있다.
  1. @Exceptionhanlder 애너테이션을 사용한 예외 처리

⦿ 학습내용

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

✔︎ Controller 클래스 레벨에서 @ExceptionHandler 애너테이션을 사용하면 해당 Controller에서 발생하는 예외 처리 가능
✔︎ 필요한 Error 정보만 담을 수 있는 Error 전용 Response 객체를 사용하면 클라이언트에게 좀 더 친절한 에러 정보 제공 가능

  • ErrorResponse 클래스 생성
  • Controller에서 ErrorResponse를 사용하도록 handleException() 수정

☞ @ExceptionHandler의 단점

✔︎ Controller마다 동일하게 발생하는 예외 처리에 대한 중복 코드 발생 가능
✔︎ 다양한 유형의 예외를 처리하기에는 적절 ❌

  • 하나의 Controller 클래스 내에서 @ExceptionHandler를 추가한 에러 처리 핸들러 메서드가 늘어남
  1. @Restcontrolleradvice 애너테이션을 사용한 예외 처리

⦿ 학습내용

☞ @RestControllerAdvice를 사용한 예외 처리 공통화

✔︎ @RestControllerAdvice 애너테이션을 추가한 클래스를 이용하면 예외 처리 공통화 가능

  • 특정 클래스에 @RestControllerAdvice 애너테이션을 추가하면, 여러 개의 Controller 클래스에 다음 애너테이션들이 추가된 메서드를 공유해서 사용 ⭕️
    • @ExceptionHandler
    • @InitBinder, @ModelAttribute : JSP, Thymeleaf 같은 서버 사이드 랜더링(SSR) 방식에서 주로 사용
      ※ 지금은 클라이언트 사이드 랜더링(CSR) 방식인 REST API 기반 애플리케이션에 대해 학습하므로 자세하게 ❌
  • 적용 순서
    • Controller 클래스에 @ExceptionHandler가 추가된 메서드들을 제거
    • 예외들을 공통으로 처리할 ExceptionAdvice 클래스 정의
    • ExceptionAdvice에 @RestControllerAdvice 애너테이션 추가
      ⇒ Controller 클래스에서 발생하는 예외 도맡아 처리
    • ExceptionAdvice 클래스 내부에 @ExceptionHandler를 이용해 Exception 핸들러 메서드 구현
    • ErrorResponse 클래스를 수정하며 여러 기능들에 대해 역할을 분리하여 구현
      of() 메서드 : 네이밍 컨벤션(Naming Convention), 주로 객체 생성시 어떤 값들의(of~) 객체를 생성한다는 의미에서 사용
    • ErrorResponse 클래스의 메서드를 사용하도록 ExceptionAdvice 클래스의 Exception 핸들러 메서드 수정

✔︎ JSON 형식의 데이터를 Response Body로 전송하기 위해 ResponseEntity로 래핑할 필요 ❌

  • @RestControllerAdvice vs @ControllerAdvice
    : @RestControllerAdvice = @ControllerAdvice + @ResponseBody

✔︎ ResponseStatus 애너테이션으로 HTTP Satatus를 대신 표현 가능

◉ 느낀 점

☞ 기본적인 예외처리 방식들을 알 수 있는 시간이었다. @ExceptionHandler만 이용하면 분명한 단점들이 존재하기에, @RestControllerAdvice를 대부분 사용하겠지만, 이를 이해하기 위해 우선 @ExceptionHandler부터 학습할 수 있는 기회가 있어서 좋았다. 물론, 기능들이 늘어남에 따라 ErrorResponse 클래스를 구현하는데에 복잡하고 이해하는데에 어려움이 많았지만, 그만큼 이 기능 덕분에 편리해진 느낌이다.

Spring을 배울 때마다 신기한 게, 분명 복잡하고 어려운 내용들이지만, 이를 통해 구현하게 되면 결과적으로 가독성이 좋고 편리해진다. 참 아이러니한 것 같다 😅 이 아이러니함에서 벗어나기 위해서는 Spring 학습을 정말 잘해놔야한다는 생각이 든다.

◉ 내일의 키워드

・ 비즈니스적인 예외 던지기(Throw) 및 예외 처리
・ 애플리케이션 예외 처리 실습
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글