Back-end/Spring-핵심& webMVC

Spring 예외 처리 전략 및 Global 예외처리 // @RestControllerAdivce

prden 2023. 1. 3. 20:08

1. 예외처리 - 발생위치에 따른 구분

Dispatcher Servlet 내에서 발생하는 예외(99%-Controller, Service, Repository) vs. Dispatcher Servlet 전 Filter에서 발생하는 예외

 

2. 예외처리 방법

1. Controller 단에서의 예외처리 @ExceptionHandler

 -  Contorller 메서드 내의 하위 레이어(Service, Repository 등)에서 예외 발생해도 중간에 처리하지 않는 이상 Controller단까지 예외처리가 던져지고 @ExceptionHandler가 예외를 처리하게 됨.

 

2. 전역에서 예외처리 - @(Rest)ControllerAdvice

 - Controller 내의 @ExceptionHandler와 ControllerAdvice의 @ExceptionHandler가 충돌될 때 Controller의 @ExceptionHandler가 처리된다.

 

3. 메소드 단위 내에서 try/catch 처리

 

3. 예외처리 전략

1) 상속구조 만들어서 BusinessException.class 만들고 상속구조 만들어서 @ControllerAdvice로 전역  예외처리 

https://cheese10yun.github.io/spring-guide-exception/

2) ErrorVo 객체를 만들어서 모든 예외는 컨트롤러 단에서 처리하면서 ResponseEntity에서 status code랑 함께 넘겨주기

  • acont의 예외처리

3) ... 

4. @(Rest)ControllerAdvice

예외처리(@ExceptionHandler), 바인딩 설정(@InitBinder), 모델객체(@ModelAttributes)를 모든 컨트롤러 전반에 걸쳐 사용하고 싶은 경우에 사용한다. 

 

범위 지정 또한 가능

  • 특정 애노테이션을 가지고 있는 컨트롤러에만 적용
  • 특정 패키지 이하의 컨트롤러에만 적용
  • 특정 클래스 타입에만 적용 

https://mangkyu.tistory.com/205

 

[Spring] @RestControllerAdvice를 이용한 Spring 예외 처리 방법 - (2/2)

예외 처리는 robust한 애플리케이션을 만드는데 매우 중요한 부분을 차지한다. Spring 프레임워크는 매우 다양한 에러 처리 방법을 제공하는데, 앞선 포스팅에서 @RestControllerAdvice를 사용해야 하는

mangkyu.tistory.com

 

5. NestedRuntimeException

예외를 Wrapping 할 때 편리하게 사용할 수 있는 예외로 NestedRuntimeException과 NestedCheckedException이 있다. (추상 클래스로 두 클래스 모드 상속해서 사용)

  • NestedCheckedException 은 Exception 클래스를 상속하고있기 때문에 try-catch 문으로 감싸주어야 한다. 
  • Checked Exception을 런타임 예외로 던지고 싶을 때 NestedRuntimeException을 사용.(스프링에서 많이 사용함)
public class DYBRuntimeException extends NestedRuntimeException {
    public DYBRuntimeException(String msg) {
        super(msg);
    }

    public DYBRuntimeException(String msg, Throwable t) {
        super(msg, t);
    }
}

6. try-catch는 지양해라

try {
    // 비지니스 로직
}catch (Exception e){
    e.printStackTrace();
}

예외가 발생하면 로직의 흐름을 끊고 종료시키는 것이 바람직하다. 

위와 같이 처리하면 예외가 발생해도 다음의 로직을 처리하게 된다. 따라서 이러한 try-catch방식은 지양해야 한다.

하지만, Checked Exception의 경우 반드시 try-catch로 예외를 감싸야 하므로 예외임.

 

try-catch를 사용해야 하는 경우 라면 아래와 같이 구체적인 Exception을 발생시키는 것이 좋다.

try {
    // 비지니스 로직
}catch (Exception e){
    e.printStackTrace();
    throw new DuplicateMemberException(e);
}

즉, try-catch는 지양하고, 사용하게 된다면 구체적인 exception을 catch 부분에서 발생시키기, 하다못해 구체적인 예외를 발생시키지 않는다면, 로그라도 추가...

7. Java Exception 개념 연결

https://prde.tistory.com/52

 

Exception Handling

예외 처리를 하는 근본적인 이유 : 프로그램이 오작동하거나 비정상 종료를 막기 위해 1. 종류 1) 컴파일 에러(compile-time error) : 구문 체크, 번역, 최적화, 생략된 코드 추가 등을 컴파일러가 한다.

prde.tistory.com

 

'Back-end > Spring-핵심& webMVC' 카테고리의 다른 글

@RequestBody, @RequestPart  (0) 2023.01.15
Lombok @Setter 사용 지양 & lombok.config  (0) 2023.01.07
Spring - 인터셉터  (0) 2023.01.01
SessionStatus, @SessionAttributes, @SessionAttribute  (0) 2023.01.01
Jsp- jstl  (0) 2023.01.01