스프링 MVC 2편 - API 예외 처리

hyuk·2024년 3월 14일
0
post-thumbnail

📌 API 예외 처리 방법

물론,BasicErrorController를 확장하여 JSON 형식으로 응답할 수 있지만, 스프링은 API에서 오류가 발생했을 때 제공하는 기능들이 있어 이에 대해 알아보자 !

  • 스프링 부트가 기본으로 제공하는 ExceptionResolver 는 다음과 같다.
  1. ExceptionHandlerExceptionResolver → 우선순위이 가장 높음

  2. ResponseStatusExceptionResolver

  3. DefaultHandlerExceptionResolver

우선순위가 높은 ExceptionHandlerExceptionResolver를 일반적으로 사용하여 이번 포스트에서는 해당 예외처리 기능과 @ControllerAdvice 를 알아보자 !

@ExceptionHandler

같은 예외 상황이라도 컨트롤러에 따라 다른 예외 응답을 내려줘야 할 수 있기에 보다 자세한 API 예외처리를 @ExceptionHandler을 통해 가능하다.

	@ExceptionHandler(부모예외.class)
	public String 부모예외처리() (부모예외 e) {
		... 생략 ...
    }
    
	@ExceptionHandler(자식예외.class)
	public String 자식예외처리() (자식예외 e) {
		... 생략 ...
    }
  1. @ExceptionHandler에 지정한 부모 클래스는 자식 클래스까지 예외처리 가능 O

  2. 자식예외가 우선순위가 더 높다.

  3. @ExceptionHandler 예외를 지정하지 않을 경우, 메서드 파라미터의 예외가 지정.


@ControllerAdvice

: 대상으로 지정한 컨트롤러에 @ExceptionHandler ,@InitBinder 기능 부여 !

@ExceptionHandler 애노테이션을 사용하였을 때는, 오류코드와 정상 코드가 한 컨트롤러에 섞여있는 모습을 볼 수 있다. 그럴 경우, @ControllerAdvice, @RestControllerAdvice을 사용해보자 !

@ControllerAdvice(annotations = RestController.class)
public class testControllerAdvice1 {} // 특정 애노테이션 클래스 지정

@ControllerAdvice("org.example.testControllers")
public class testControllerAdvice3 {} // 특정 패키지 지정

@ControllerAdvice(assignableTypes = {Interface.class, Abstract.class})
public class testControllerAdvice3 {} // 특정 클래스 지정 가능

> 대상 컨트롤러 지정을 생략하면 모든 컨트롤러 적용

📌 정리

앞서, @ExceptionHandler@ControllerAdvice 알아보았다. 해당 기능을 학습하고 정리한 생각은 다음과 같다.

  • @ExceptionHandler : 메서드 단위로 예외에 따른 각기 다른 응답을 제공하고자 할 경우
  • @ControllerAdvice : Controller 단위로 공통으로 예외를 처리할 경우

정리하자면 로직을 구현하면서 예외처리를 해야할 때 위 애노테이션을 적절히 조합하여 코드의 중복을 막고, 보다 클린한 코드로 구현하는 것이 중요하다고 생각한다 !


@RestControllerAdvice@ResponsoBody 기능이 추가

📌 본 포스트는 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술 통해 학습한 내용을 요약 및 정리한 것입니다.

profile
차곡차곡쌓아가는학습노트

1개의 댓글

comment-user-thumbnail
2024년 12월 5일

화이팅입니다

답글 달기