일단 씻고 나가자
23.10.31 본문
2023. 10. 31 화요일
- [Spring] Exception을 처리하는 방법?
: 스프링에서 예외를 처리하는 방법은 (REST API) 다음과 같다.
만약 Exception을 handle을 해주지 않으면 기본적인 에러 페이지를 발생시키므로,
구체적인 에러의 내용과 처리를 위해 handle은 중요하다.
기본적으로 JSON 형태로 보내는 것이 좋은 이유는, 직렬화의 이점과 요새는 JSON을 해석하는 해석기도 없는 곳이 없으므로 호환이 좋다.
ResponseEntity는 스프링에서 제공하는, 응답 시의 방법 중 하나.
http status나 header, body를 자유롭게 설정할 수 있다.
따라서 아래의 @ResponseStatus는 ResponseEntity로 대체 가능.
예외 처리의 우선순위는
정확히 해당 Exception을 handle
해당 Exception의 부모 Exception handle
Exception handle
@ExceptionHandler
// @RestController에서 사용하며, @ExcetpionHandler(Exception 클래스.class) 와
@ResponseStatus(value = HttpStatus.스테이터스)를 사용하여 처리한다.
( value = {AException.class, BException.class}처럼 여러 Exception을 받을 수도 있음)
기본적인 응답만 해주면 200 응답을 받기 때문에, @ResponseStatus를 추가하여 정책에 맞는 status를 추가한다.
일반적으로 custom exception을 체크하고, 마지막엔 Exception으로 나머지를 퉁치는 구조.
@RestControllerAdvice
// 기존 컨트롤러 내부에서 @ExceptionHandler을 붙이는 방식은 컨트롤러가 지저분해지기도 하고, 새로운 컨트롤러 생성 시 똑같이 다 분기 처리해주어야 하는 불편함이 있었음.
따라서 전역적으로 하나의 클래스에서 Exception을 handling 하고자 한 번에 처리하는 어노테이션.
@ControllerAdvice도 있는데, 이는 Rest의 차이 유무처럼 기존 view로 응답하던 방식에서의 advice.