Spring Boot (20) 예외 처리 실습

넙데데맨·2022년 10월 4일
0
post-custom-banner

@RestControllerAdvice를 활용한 예외처리

@RestControllerAdvice를 활용한 핸들러 클래스 생성

CustomExceptionHandler.java

@RestControllerAdvice
public class CustomExceptionHandler {
    private final Logger LOGGER = LoggerFactory.getLogger(CustomExceptionHandler.class);

    @ExceptionHandler(value = RuntimeException.class)
    public ResponseEntity<Map<String,String>> handleException(RuntimeException e, HttpServletRequest request){
        HttpHeaders responseHeaders = new HttpHeaders();
        HttpStatus httpStatus = HttpStatus.BAD_REQUEST;

        LOGGER.error("Advice 내 handleException 호출, {}, {}",request.getRequestURI(),e.getMessage() );

        Map<String,String> map = new HashMap<>();
        map.put("error type", httpStatus.getReasonPhrase());
        map.put("code","400");
        map.put("message",e.getMessage());
        return new ResponseEntity<>(map,responseHeaders,httpStatus);
    }
}

@ExceptionHandler가 적용된 클래스에 오류가 발생을 알리는 응답 메시지를 구성해서 리턴한다.

해당 예외를 발생시킬 컨트롤러 호출

ExceptionController.java

@RestController
@RequestMapping("/exception")
public class ExceptionController {
    @GetMapping
    public void getRuntimeException(){
        throw new RuntimeException("getRuntimeException 메서드 호출");
    }
}

컨트롤러로 요청 보내기

요청 시 다음과 같이 오류에 대한 메시지를 반환하는 것을 확인할 수 있다.

특정 Controller에서만 작동하는 예외 처리

ExceptionController.java

@RestController
@RequestMapping("/exception")
public class ExceptionController {
    private final Logger LOGGER = LoggerFactory.getLogger(ExceptionController.class);

    @GetMapping
    public void getRuntimeException(){
        throw new RuntimeException("getRuntimeException 메서드 호출");
    }
    @ExceptionHandler(value = RuntimeException.class)
    public ResponseEntity<Map<String,String>> handleException(RuntimeException e, HttpServletRequest request){
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.setContentType(MediaType.APPLICATION_JSON);
        HttpStatus httpStatus = HttpStatus.BAD_REQUEST;

        LOGGER.error("클래스 내 handleException 호출, {}, {}",request.getRequestURI(),e.getMessage() );

        Map<String,String> map = new HashMap<>();
        map.put("error type", httpStatus.getReasonPhrase());
        map.put("code","400");
        map.put("message",e.getMessage());
        return new ResponseEntity<>(map,responseHeaders,httpStatus);
    }
}

Controller 클래스에 @ExcpetionHandler를 선언한 메소드를 작성 후 컨트롤러에 요청할 시 클래스 내 handleException 호출 이라는 메시지가 뜨게 된다.

@ControllerAdvice와 컨트롤러 내에 같은 예외처리를 할 시 우선순위가 높은 클래스 내 핸들러 메서드가 사용되는 것을 확인할 수 있다.

profile
차근차근
post-custom-banner

0개의 댓글