스프링 부트의 예외 처리 방식
스프링 부트의 예외 처리 방식은 2가지가 존재합니다
- @ControllerAdvice를 통한 모든 Controller에서 발생할 수 있는 예외처리
- @ExceptionHandler를 통한 특정 Controller의 예외처리
❗쉽게 생각하자면 @ControllerAdvice 로 모든 컨트롤러에서 발생할 예외를 정의하고 ,
@ExceptionHandler를 통해 발생하는 예외 마다 처리할 메서드를 정의한다고 생각하자
@ControllerAdvice , @RestControllerAdvice
- @ControllerAdvice는 Spring에서 제공하는 어노테이션
- @Controller나 @RestController 에서 발생하는 예외를 한 곳에서 관리하고 처리할 수 있게 하는 어노테이션
- 설정을 통해 범위 지정이 가능하며 , Default 값으로 모든 Controller에 대해 예외 처리를 관리함
- @RestControllerAdvice(basePackages=”com.Apicontroller”) 와 같이 패키지 범위를 설정할 수 있음
- 설정을 통해 범위 지정이 가능하며 , Default 값으로 모든 Controller에 대해 예외 처리를 관리함
- 예외 발생 시 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를 날려보면 설계한 에러가 발생한다
'Spring Boot API' 카테고리의 다른 글
문제야 어디 있니~? LogBack (0) | 2022.08.10 |
---|---|
@Valid 의 종류 알아보기 (0) | 2022.08.10 |
@SpringBootApplication 이 정상적으로 기능하지 못한 이유 (0) | 2022.08.09 |
우선 널 알아야겠구나...! 컴포넌트 스캔 (Component Scan)과 Auto Configuration (0) | 2022.08.09 |