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
[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 개념 연결
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 |