Exception

둥냥둥냥둥·2023년 7월 5일
0

Spring Boot Web 예외처리

  • Exception

Exception 순서

  1. Request 요청이 들어오면 처음에 Filter 구간을 통과한다.
  2. 그 후 DispatcherServlet 도착을 한다.
  3. 이때 Handler Mapping을 통해서 어떠한 주소를가진 controller에 Mapping을 해야하는지 결정을 한다.

이렇게 처리해야할 주소와 해당 controller가 매칭이 되면은 4번으로 넘어간다.

  1. Handler Interceptor 통과를 한다.
  2. Handler Interceptor 진행(내용 추후 보강예정)
  3. (5)번이 지난 후 우리가 작성한 Controller에 해당 request 들어온다.
    • 그리고 우리는 Service 로직, DB를 통한 데이터를 처리하고 응답을 내린다.
  4. 여기서 예외가 터진다면, Exception Handler에서 해당 예외를 Catch한다.
    • 그 에러의 응답을 만들어서 (9) 번으로 내려준다.
  5. (8)번의 경우에는 예외가 없는 정상적인 경우에 내려준다.

Annotation설명
@ControllerAdviceGlobal 예외 처리 및 특정 package / Controller 예외처리
@ExceptionHandler특정 Controller의 예외처리

Spring Boot Web 예외처리 실전적용 - 01

run time exception

@Slf4j
@RestController
@RequestMapping("/api")
public class RestApiController {


    @GetMapping(path = "")
    public void hello(){

        throw new RuntimeException("run time exception call");  //run time exception 확인
    }
 }


IndexOutOfBoundsException

@Slf4j
@RestController
@RequestMapping("/api")
public class RestApiController {


    @GetMapping(path = "")
    public void hello(){
//        throw new RuntimeException("run time exception call");  //run time exception 확인

        var list = List.of("hello");
        var element = list.get(1);
        log.info("element : {}", element);
    }
}

IndexOutOfBoundsException 예외 처리 후

@Slf4j
@RestControllerAdvice(basePackageClasses = {RestApiBController.class})
public class RestApiExceptionHandler {


    @ExceptionHandler(value = {Exception.class})
    public ResponseEntity exception(
            Exception e
    ){
        log.error("RestApiExceptionHandler",e);
        return ResponseEntity.status(200).build();
    }
 }


위와같이 발생했던 예외를 잡을 수 있다.
하지만 log에서 IndexOutOfBoundsException인데 해당 Exception은 클래스를 본면 RuntimeException이 있고 -> Exception을 상속 받고있다. 그러므로 우리가 Handler에서 지정한 Exception에 대해서 Catch한다.

  • RuntimeException이 있고 -> Exception을 상속


그렇다면 우리는 원하는 예외만 잡아 보도록 해보자

@ExceptionHandler(value = {IndexOutOfBoundsException.class})
    public ResponseEntity outOfBound(
            IndexOutOfBoundsException e
    ){
        log.error("IndexOutOfBoundsException",e);
        return ResponseEntity.status(200).build();
    }

그 결과 log.error("IndexOutOfBoundsException",e) 작성했던 것이 log로 나왔다. 기존에는 Exception 으로 잡기위한 것을 했다면, 이번에는 명확하게 IndexOutOfBoundsException으로 잡겠다 라며 지정 해줬다.

profile
Java 먹자

0개의 댓글