Spring Boot API

Exception

NEWDODORIPYO 2022. 8. 16. 23:02

스프링 부트의 예외 처리 방식

스프링 부트의 예외 처리 방식은 2가지가 존재합니다

  • @ControllerAdvice를 통한 모든 Controller에서 발생할 수 있는 예외처리
  • @ExceptionHandler를 통한 특정 Controller의 예외처리

❗쉽게 생각하자면 @ControllerAdvice 로 모든 컨트롤러에서 발생할 예외를 정의하고 ,

@ExceptionHandler를 통해 발생하는 예외 마다 처리할 메서드를 정의한다고 생각하자

@ControllerAdvice , @RestControllerAdvice

  • @ControllerAdvice는 Spring에서 제공하는 어노테이션
  • @Controller나 @RestController 에서 발생하는 예외를 한 곳에서 관리하고 처리할 수 있게 하는 어노테이션
    • 설정을 통해 범위 지정이 가능하며 , Default 값으로 모든 Controller에 대해 예외 처리를 관리함
      • @RestControllerAdvice(basePackages=”com.Apicontroller”) 와 같이 패키지 범위를 설정할 수 있음
  • 예외 발생 시 Json의 형태로 결과를 반환하기 위해서는 @RestControllerAdvice를 사용하면 됨

@ExceptionHandler

  • 예외 처리 상황이 발생하면 해당 Handler로 처리하겠다고 명시하는 어노테이션
  • 어노테이션 뒤에 괄호를 붙여 어떤 ExceptionClass를 처리할지 설정할 수 있음
    • ex) @ExceptionHandler(00Exception.class)
  • Exception.classs는 최상위 클래스로 하위 세부 예외 처리 클래스로 설정한 핸들러가 존재하면, 그 핸들러가 우선 처리하게 되며 , 처리되지 못한 예외 처리에 대해 Exception.class에서 핸들링함
  • @ControllerAdvice로 설정된 클래스 내에서 메서드로 정의할 수 있지만, 각 Controller 안에 설정도 가능하다
    • 전역 설정(@ControllerAdvice)보다 지역 설정(Controller)으로 정의한 Handler가 우선순위를 가짐

코드로 보기

Controller

@RestController // Json 형태로 데이터 반환
@RequestMapping("/api/")
@Log4j2
@RequiredArgsConstructor
public class Controller {

    @PostMapping("/exception")
    public void ExceptionTest()throws Exception{
        throw new Exception();
    }
}

  • Exception을 Test 해보기 위해 만들었다
  • Exception 을 던지기만 하는 api

AroundHubExceptionHandler

@RestControllerAdvice // Controller 에서 발생한 에러는 여기서 처리한다
public class AroundHubExceptionHandler {

    private final Logger logger = LoggerFactory.getLogger(AroundHubExceptionHandler.class);

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity<Map<String ,String>> ExceptionHandler(Exception e){

        HttpHeaders httpHeaders = new HttpHeaders();

        HttpStatus httpStatus = HttpStatus.BAD_REQUEST;

        logger.info("Advice 내 ExceptionHandler 호출");

        Map<String,String> map = new HashMap<>();
        map.put("error type",httpStatus.getReasonPhrase());
        map.put("code","400");
        map.put("message","에러 발생");

        return new ResponseEntity<>(map, httpHeaders , httpStatus);
    }
}
  • Controller에서 발생하는 Exception을 처리한다

swagger-ui Test

swagger-ui에서 Post를 날려보면 설계한 에러가 발생한다