업무하면서 예외처리에 대해서 고민할 일이 있었다

 

정리해보자

 

보통 예외처리는 공통으로 처리하는게 많다

그 공통을 어떻게 처리할까?

 


 

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 {};
}

 

 


참고

https://jeong-pro.tistory.com/195

+ Recent posts