Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- SpringBoot
- springdatajpa
- Exception
- Proxy
- Android
- JDBC
- 스프링 핵심 원리
- db
- jpa
- Spring Boot
- AOP
- transaction
- Greedy
- 알고리즘
- http
- kotlin
- Servlet
- 스프링
- 스프링 핵심 기능
- JPQL
- java
- spring
- 김영한
- Thymeleaf
- QueryDSL
- pointcut
- 자바
- 백준
- 그리디
- 인프런
Archives
- Today
- Total
개발자되기 프로젝트
[API예외] @ControllerAdvice 본문
- @ExceptionHandler 를 사용해서 예외를 깔끔하게 처리할 수 있게 되었지만,
- 정상 코드와 예외 처리 코드가 하나의 컨트롤러에 섞여 있다.
- @ControllerAdvice 또는 @RestControllerAdvice 를 사용하면 둘을 분리할 수 있다.
1.@ControllerAdvice
- Controller에 있던 오류 처리 코드를 분리해 내자.
- @RestControllerAdvice를 적용한 ExControllerAdvice 클래스를 생성하여 코드를 여기로 옮겨놓자.
- 그러면 여러 controller에서 발생한 Exception을 ControllerAdvice에서 처리해줌.
@Slf4j
@RestControllerAdvice
public class ExControllerAdvice {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(IllegalArgumentException.class)
public ErrorResult illegalExHandler(IllegalArgumentException e){
log.error("[exceptionHandler] ex", e);
return new ErrorResult("BAD", e.getMessage());
}
@ExceptionHandler(UserException.class)
public ResponseEntity<ErrorResult> UserExHandler(UserException e){
log.error("[exceptionHandler] ex", e);
ErrorResult errorResult = new ErrorResult("USER-EX", e.getMessage());
return new ResponseEntity<>(errorResult, HttpStatus.BAD_REQUEST);
}
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler
public ErrorResult exHandler(Exception e){
log.error("[exceptionHandler] ex", e);
return new ErrorResult("EX","내무오류");
}
}
- ControllerAdvice 는 대상으로 지정한 여러 컨트롤러에
- @ExceptionHandler , @InitBinder 기능을 부여해주는 역할.
- @ControllerAdvice 에 대상을 지정하지 않으면 모든 컨트롤러에 적용된다. (글로벌 적용)
- @RestControllerAdvice 는 @ControllerAdvice 와 같고, @ResponseBody 가 추가되어 있다.
- @Controller , @RestController 의 차이와 같다. : @ResponseBody있냐 없냐 차이
2. Controller대상 지정
- Controller 지정
- pacakage 지정
- 여러 contoller 지정
// Target all Controllers annotated with @RestController
@ControllerAdvice(annotations = RestController.class)
public class ExampleAdvice1 {}
// Target all Controllers within specific packages
@ControllerAdvice("org.example.controllers")
public class ExampleAdvice2 {}
// Target all Controllers assignable to specific classes
@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
public class ExampleAdvice3 {}
3. 정리
@ExceptionHandler 와 @ControllerAdvice 를 조합하면 예외를 깔~끔하게 해결 가능.
4. GitHub : 211001 @ControllerAdvice
'인프런 > [인프런] 스프링 MVC 2' 카테고리의 다른 글
[TypeConverter] Type Converter (0) | 2021.10.01 |
---|---|
[TypeConverter] Spring Type Converter (0) | 2021.10.01 |
[API예외] @ExceptionHandler (0) | 2021.10.01 |
[API예외] Spring제공 ExceptionResolver2 (0) | 2021.10.01 |
[API예외] Spring제공 ExceptionResolver (0) | 2021.09.29 |
Comments