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. 예외처리 전략
- https://www.toptal.com/java/spring-boot-rest-api-error-handling
- https://www.baeldung.com/rest-api-error-handling-best-practices
1) 상속구조 만들어서 BusinessException.class 만들고 상속구조 만들어서 @ControllerAdvice로 전역 예외처리
- validationCheck 프론트에서 하고 백엔드에서도 한다면 api server 에서 field등 상세하게 예외 message던져줘야 할까?
- https://github.com/cheese10yun/spring-guide/blob/master/docs/exception-guide.md
2) ErrorVo 객체를 만들어서 모든 예외는 컨트롤러 단에서 처리하면서 ResponseEntity에서 status code랑 함께 넘겨주기
- acont의 예외처리
3) ...
4. @(Rest)ControllerAdvice
예외처리(@ExceptionHandler), 바인딩 설정(@InitBinder), 모델객체(@ModelAttributes)를 모든 컨트롤러 전반에 걸쳐 사용하고 싶은 경우에 사용한다.
범위 지정 또한 가능
- 특정 애노테이션을 가지고 있는 컨트롤러에만 적용
- 특정 패키지 이하의 컨트롤러에만 적용
- 특정 클래스 타입에만 적용
https://mangkyu.tistory.com/205
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 개념 연결
'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 |