스프링을 공부하다 보니, 예외처리가 상당히 중요한 것 같습니다.
따라서, 스프링 예외처리에 관한 공부 기록을 남겨봅니다!
Spring 예외처리는 어떻게 할까요?
" @Controller 및 @ControllerAdvice 클래스는 컨트롤러 메서드에서 발생하는 예외를 처리하기 위해 @ExceptionHandler 메서드를 가질 수 있습니다. "
스프링 공식 문서를 보면 이렇게 써져 있습니다. 이를 통해 예외 처리의 기본 원리를 알아보겠습니다. 그 전에, @ExceptionHandler에 관해 알아보겠습니다!
@ExceptionHandler
@ExceptionHandler 메서드는 컨트롤러 메서드에서 발생하는 특정 예외를 처리할 수 있습니다.
@RestControllerAdvice와 함께 사용하여 전역 예외 처리를 구현할 수 있습니다.
메서드 인수: @ExceptionHandler 메서드는 @RequestMapping 메서드와 동일한 메서드 인수를 지원합니다.
반환 값: @ExceptionHandler 메서드는 @RequestMapping 메서드와 동일한 반환 값을 지원합니다.
기본 원리
- @ExceptionHandler, @InitBinder, @ModelAttribute 메서드는 선언된 @Controller 클래스(또는 클래스 계층) 내에서 적용됩니다. 이러한 메서드를 전역적으로(여러 컨트롤러에 걸쳐) 적용하고자 할 경우, @ControllerAdvice 또는 @RestControllerAdvice 어노테이션이을 붙여 클래스 선언 가능합니다.
- @ControllerAdvice는 @Component로도 어노테이트되어 있으므로, 컴포넌트 스캐닝을 통해 스프링 빈으로 등록될 수 있습니다.
- @RestControllerAdvice는 @ControllerAdvice와 @ResponseBody가 결합된 어노테이션으로, @ExceptionHandler 메서드를 메시지 변환을 통해 응답 본문으로 렌더링합니다.
쉽게 말해, 예외처리 클래스를 하나 파서 빈으로 등록 + @ExceptionHandler 사용하면 된다는 뜻입니다. 그러면 이제 동작 원리를 알아보겠습니다.
동작원리
애플리케이션 시작 시, @RequestMapping 및 @ExceptionHandler 메서드에 대한 클래스는 @ControllerAdvice로 어노테이트된 스프링 빈을 감지하고, 런타임에 해당 메서드를 적용합니다. 전역 @ExceptionHandler 메서드(즉, @ControllerAdvice에서 선언된 메서드)는 로컬 메서드(즉, @Controller에서 선언된 메서드) 이후에 적용됩니다.(Controller 예외 먼저, 이후 ControllerAdvice 예외 적용). 반면, 전역 @ModelAttribute 및 @InitBinder 메서드는 로컬 메서드 이전에 적용됩니다.
-> 애플리케이션을 시작하면, @ExceptionHandler가 빈으로 등록되어있는 클래스 안에서 일어나는 예외처리를 낚아채 예외처리를 진행합니다.
@Controller
public class SimpleController {
// ...
@ExceptionHandler
public ResponseEntity<String> handle(IOException ex) {
// 예외 처리 로직
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("IOException occurred: " + ex.getMessage());
}
}
위 코드는 스프링 공식문서에 나와있는 예제 코드인데, 참고하며 작성하니 많은 도움이 되었습니다.
모르는 것이 있으면 다른 블로그 찾아보기 보다는 스프링 공식문서 참고하는 것이 참 좋은 것 같습니다!
'스프링 > 개념' 카테고리의 다른 글
엔티티 매니저와 영속성 컨텍스트 (0) | 2024.09.10 |
---|---|
JPA 에 관하여 [자바 ORM 표준 JPA 프로그래밍] (0) | 2024.09.10 |
계층형 패키지 구조 vs 도메인형 패키지 구조 (0) | 2024.09.09 |
HTTP 상태 코드 정리 (0) | 2024.09.09 |
HTTP 메서드에 관해서 (0) | 2024.09.09 |