@GetMapping("") public User get(@RequestParam(required = false) String name, @RequestParam(required = false) Integer age){ User user = new User(); user.setName(name); user.setAge(age); // 에러 발생 시키기 int a = 10+age;
return user; }
@PostMapping("") public User post(@RequestBody User user){ System.out.println(user); return user; } }
Client에게 친절한 Exception 처리는 기본적으로 두 가지 방식이 있다.
이를 Advice(조언) 이라고 한다. Server에서 Client에게 오류에 대한 조언을 해주는 것이다.
관련 Annotation
@RestControllerAdvice
페이징 처리를 하는 view resolver 영역의 white label page, error page를 global하게 처리할 수 있는 집합 장소
@ExceptionHandler
Global하게 처리할 때는 RestControllerAdvice Annotation이 붙은 클래스 내에, 특정 Controller의 예외 처리를 할 때 특정 컨트롤러 내부에 사용한다.
동일한 Handler가 Global, Controller에 모두 존재하면 특정 Controller 내부의 handler가 처리된다.
@GetMapping("") public User get( @Size(min = 2) @RequestParam String name, @NotNull @Min(1) @RequestParam Integer age){ User user = new User(); user.setName(name); user.setAge(age);
return user; } }
처음 접근은 Client단에서 값을 잘못입력했을 때
어떠한 Exception이 발생하는지 확인하는 것으로 시작한다.
1 2 3 4 5 6 7 8 9 10 11 12 13
// ApiController 클래스에서 발생한 오류 @RestControllerAdvice(basePackageClasses = ApiController.class) publicclassApiControllerAdvice{ // Exception 클래스 내부의 객체가 들어오면 실행 (모든 Exception을 받는다) @ExceptionHandler(value = Exception.class) public ResponseEntity exception(Exception e){ // Exception의 클래스 이름을 출력하여 확인한다. System.out.println(e.getClass().getName()); // 테스트 코드이므로 Client 단에는 아무것도 출력되지 않도록 하였습니다. return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(""); } ... }