일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- asynccustomautoconfiguration
- Sleuth
- aws secretmanager
- java lambda
- EnableWebMvc
- asyncconfigurer
- DeferredImportSelector
- b3-propagation
- traceasynccustomautoconfiguration
- java
- traceId
- awssecretsmanagerpropertysources
- spring
- elasticsearch
- jpa
- Spring Boot
- micrometer tracing
- java list
- spring3 spring2 traceid
- map
- list
- HashMap
- spring MVC
- kotlin
- @FunctionalInterface
- CompletableFuture
- Spring JPA
- java.util.list
- SpringMVC
- ResponseBody
- Today
- Total
du.study기록공간
[Spring MVC] Exeption 처리방법 - @ControllerAdvice, @ExceptionHandler 본문
저번 Exeption처리 방법으로 AbstractHandlerExceptionResolver를 사용하는 방법으로 포스팅을 한 적이 있습니다.
관련 글 : https://duooo-story.tistory.com/15
이번에는 @ControllerAdvice, @ExceptionHandler 를 사용한 Exception방법에 대해서 기록하려 합니다.
먼저 @ControllerAdvice 는 전역 컨트롤러로 불러며, 컨트롤러 공통적으로 사용할 것이 있을때, 해당 어노테이션을 사용할 수 있습니다. 예를 들면 다음과 같은 상황에서 사용할 수 있습니다.
1. Exception 처리
2. @InitBinder를 이용한 설정세팅 ( 이전 포스팅에서 언급한 적이 있지만, 너무 다양한 기능을 지원해주기에 추후에 포스팅으로 작성할 예정입니다.)
3. @ModelAttribute 를 이용한 컨트롤러 공통 데이터 세팅
이번에는 예외처리를 이용하는 테스트를 위해 @ExceptionHandler를 사용하겠습니다.
먼저 해당 어노테이션을 선언하는 class를 생성합니다.
@GetMapping("/common-error")
@ResponseBody
public String commonErrorTest(){
throw new CommonException();
}
@RestControllerAdvice
public class CommonController {
@ExceptionHandler(CommonException.class)
public ResponseEntity<BaseDomain> commonErrorException(CommonException ex){
BaseDomain baseDomain = new BaseDomain(ex.getErrorType().getErrorCode(),ex.getErrorType().getErrorMsg());
return ResponseEntity.badRequest().body(baseDomain);
}
}
public class BaseDomain {
private Integer errorCode;
private String errorMsg;
public BaseDomain(Integer errorCode, String errorMsg){
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
.....
}
public class CommonException extends RuntimeException {
protected ErrorCodable errorType;
protected String causeMsg;
public CommonException() {
this.errorType = ErrorType.UNKNOWN_ERROR;
}
.....
}
public enum ErrorType implements ErrorCodable{
SUCCESS(0, "SUCCESS", 500),
INVALID_VALUE(1000, "INVALID_VALUE",403),
UNKNOWN_ERROR(9999,"UNKNOWN_ERROR",500)
;
.....
}
에러를 발생시키기위해 컨트롤러 /common-error를 호출하여 throw new CommonException();를 통하여 강제로 에러를 뱉게 하였습니다.
해당 CommonException에러를 @RestControllerAdvice를 속의 @ExceptionHandler(CommonException.class) 가 캐치하게되고, ResponseEntity를 통하여 http status변경 및 코드와 body를 심어서 다음과 같은 결과를 리턴받게 됩니다.
해당 예재에서는 badRequest같은 함수를 사용하였지만 직접 HttpStatus를 입력할 수 있습니다.
'스프링' 카테고리의 다른 글
Spring AOP - 관점 지향 프로그래밍 (0) | 2019.11.30 |
---|---|
configureHandlerExceptionResolvers, extendHandlerExceptionResolvers 차이점 (0) | 2019.11.22 |
[Spring MVC] Exeption 처리방법 - AbstractHandlerExceptionResolver (1) | 2019.11.17 |
Customizing Validation Tasks (0) | 2019.11.16 |
[Spring MVC] @Validated(@Valid) and BindingResult (0) | 2019.11.12 |