일반화 된 예외를 처리하기 위하여 Aop를 활용한 Exception Handling을 할 것입니다. 그렇기 떄문에 우리가 사용하는 시스템에서 예외가 발생했을 때 에러를 Handling 할 수 있는 Spring boot 에서 제공하는 클래스를 만들 것 입니다.
Controller에 요청을 했을때 예외가 발생하는 코드를 작성하였습니다.
TestController
@RestController
public class TestController {
@GetMapping("/user")
public String user(String id){
throw new UserNotFoundExtion(String.format("존재하지 않는 회원 [ID : %s]", id));
}
}
UserNotFoundExtion
@ResponseStatus(HttpStatus.BAD_REQUEST)
public class UserNotFoundExtion extends RuntimeException {
public UserNotFoundExtion(String errormsg) {
super(errormsg);
}
}
ExceptionResponse
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExceptionResponse {
private Date date; //예외 발생 날짜
private String msg; //예외 메시지
private String content; //예외가 어느 요청에서 났는지 확인
}
예외가 발생하면 해당 객체에 값을 넣어 사용자에게 전달할 클래스입니다.
CustomizedExceptionHandler
@RestController
@ControllerAdvice
public class CustomizedExceptionHandler extends ResponseEntityExceptionHandler {
//Exception을 통해 예외를 받고 WebRequest를 통행 어디서 에러가 발생했는지 받을 것입니다.
@ExceptionHandler(Exception.class)
public final ResponseEntity<Object> allException (Exception e , WebRequest request){
ExceptionResponse exceptionResponse =
new ExceptionResponse( new Date(), e.getMessage(), request.getDescription(false));
return new ResponseEntity(exceptionResponse , HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@RestController를 등록하여 웹서비스에서 사용할 수 있게 만들어 줍니다. 그다음 @ControllerAdvice를 등록하여 모든 컨트롤러가 실행이 될떄 해당 해당 어노테이션을 가지고 있는 빈이 자동으로 실행이 됩니다. 만약 에러가 발생하면 해당 클래스에서 정의한 메소드가 자동으로 실행되어 처리가 될 것입니다. @ExceptionHandler은 해당 예외가 발생 했을때 해당 메소드가 실행 될 수 있께 정의하는 어노테이션입니다. 해당 코드는 Exception.class를 넣어줌으로써 모든 예외에 대한 처리를 담당하게 되고 INTERNAL_SERVER_ERROR 코드를 리턴하게 됩니다.
결과
요청 결과 Status 코드가 500에러가 발생했으며 date, msg, content가 정상적으로 출력되는 것을 확인 할 수 있습니다. 하지만 모든 예외를 처리하는 것이 아닌 특정 UserNotFound가 발생하면 4xx의 Status를 리턴하는게 맞으니 코드를 추가하도록 하겠습니다.
CustomizedExceptionHandler
@RestController
@ControllerAdvice
public class CustomizedExceptionHandler extends ResponseEntityExceptionHandler {
//Exception을 통해 예외를 받고 WebRequest를 통행 어디서 에러가 발생했는지 받을 것입니다.
@ExceptionHandler(Exception.class)
public final ResponseEntity<Object> allException (Exception e , WebRequest request){
ExceptionResponse exceptionResponse =
new ExceptionResponse( new Date(), e.getMessage(), request.getDescription(false));
return new ResponseEntity(exceptionResponse , HttpStatus.INTERNAL_SERVER_ERROR);
}
//UserNotFoundExtion.class 예외가 발생 했을때 작동
@ExceptionHandler(UserNotFoundExtion.class)
public final ResponseEntity<Object> userFoundException (Exception e , WebRequest request){
ExceptionResponse exceptionResponse =
new ExceptionResponse( new Date(), e.getMessage(), request.getDescription(false));
return new ResponseEntity(exceptionResponse , HttpStatus.NOT_FOUND);
}
}
기존 코드에 @ExceptionHandler(UserNotFoundExtion.class)를 추가하여 UserNotFoundExtion이 발생했을때 해당 메소드가 실행 되게 하여 HttpStatus.NOT_FOUND를 반환하게 하는 코드를 추가하였습니다.
Status가 500 에러에서 404 를 정삭적으로 출력하는 것을 확인 할 수 있습니다 . 이처럼 AOP를 적절히 사용하여 예외에대한 핸들링이 가능하니 상황에 맞게 사용하시기 바랍니다.
'Spring boot' 카테고리의 다른 글
Spring boot @JsonFilter (0) | 2020.07.05 |
---|---|
Spring boot @Valid를 사용하여 유효성 체크 (0) | 2020.07.05 |
Spring boot API 요청 시 Status 변경 (0) | 2020.07.05 |
Spring boot ServletUriComponentsBuilder (0) | 2020.07.05 |
Spring boot DispacherServlet이란? (0) | 2020.07.05 |