업무하면서 예외처리에 대해서 고민할 일이 있었다
정리해보자
보통 예외처리는 공통으로 처리하는게 많다
그 공통을 어떻게 처리할까?
1. @ExceptionHandler
- Controller 에서 일어나는 예외를 잡아서 한번에 처리해 줌
- controller, RestController에서 사용 가능
- 리턴타입 , parameter 타입 자유
- 아래 예시처럼 여러개 Exception class 를 여러개 나열 가능
@RestController
public class TestController{
@ExceptionHandler(NullPointerException.class)
public Object nullex(Exception e){
System.err.println(e.getClass());
return;
}
@ExceptionHandler({JdbcSQLException.class, BadSqlGrammarException.class, MyBatisSystemException.class})
public ResponseEntity<customedException> handleJdbcSqlException(Exception exception) {
return customedException(exception);
}
}
2. @RestControllerAdvice
- 전역으로 예외처리 관리 해주는 어노테이션이다
@RestControllerAdvice
public class GlovalExceptionTest{
@ExceptionHandler(NullPointer.class)
public ResponseEntity<CustomException> handleNullpointerException(Exception e){
return new CustomException(e);
}
}
- @RestControllerAdvice = @ControllerAdvice + @ResponseBody
=> 즉, @ControllerAdvice 와 같은 역할인데 @ResponseBody가 추가돼서 , 객체도 리턴이 가능한 것이다.
예외처리 페이지로 리다이렉트만 할것이면 @ControllerAdvice만 써도되고 ,
API 서버라서 객체를 리턴해야 한다면 @ResponseBody 어노테이션이 추가된 @RestControllerAdvice 를 사용하면 된다.
보통은 backend와 frontend를 따로 띄워서 하는게 대부분이기 때문에 (MSA..)
@RestControllerAdvice를 쓰면 될거같다 객체로 리턴!!
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice {
@AliasFor(
annotation = ControllerAdvice.class
)
String[] value() default {};
@AliasFor(
annotation = ControllerAdvice.class
)
String[] basePackages() default {};
@AliasFor(
annotation = ControllerAdvice.class
)
Class<?>[] basePackageClasses() default {};
@AliasFor(
annotation = ControllerAdvice.class
)
Class<?>[] assignableTypes() default {};
@AliasFor(
annotation = ControllerAdvice.class
)
Class<? extends Annotation>[] annotations() default {};
}
참고
'DEVELOP > Backend' 카테고리의 다른 글
[JUnit/Spring] Mockito annotion 차이(@Mock , @MockBean , @Spy , @SpyBean) (0) | 2021.10.27 |
---|---|
[Spring] DataAccessException 이란? (Spring의 예외처리 - 사라진 SQLException) (0) | 2021.05.20 |
[Spring] Application Event란? 업무에서 어떻게 이용 할 수 있을까? (0) | 2020.06.28 |
[Spring] Async로 동작할때 Interceptor를 어떻게 탈까? (2) | 2020.06.11 |
[Spring] Task 실행과 스케줄링 ( TaskExecutor , TaskScheduler) (0) | 2020.05.28 |