728x90
728x90
# 관련 포스팅
- 사용자 정의 예외 클래스와 에러 페이지 : https://young0105.tistory.com/227
@ControllerAdvice & @RestControllerAdvice
- 예외 처리를 담당하는 클래스에 붙이는 어노테이션
- 스프링에서 예외 처리를 담당하는 핵심적인 요소 중 하나
# 차이점
- 반환 타입과 기본 응답 형태가 다름
▶ @ControllerAdvice
· View를 렌더링하기 위해 ModelAndView 형태로 객체를 반환하도록 기본 설정되어 있음
- 요청에 대한 응답이 View 형태로 전달됨 (예외 page 리턴)
- JSP 등의 템플릿 엔진을 사용할 수 있음
▶ @RestControllerAdvice
· RESTfull 웹 서비스에서 사용하기 적합한 응답 처리
- 요청에 대한 응답이 JSON 또는 XML 형태로 전달됨
# 예외 처리할 클래스로 지정
- 일반적으로, 'handler'라는 패키지를 생성해서 사용함
1 2 3 4 5 6 | // Rest API와 관련된 예외 발생 시 작동함 @RestControllerAdvice // IoC의 대상이 됨 // View와 관련된 예외 발생 시 작동함 // Global 예외 처리 및 특정 패키지/컨트롤러 예외 처리 @ControllerAdvice // IoC의 대상이 됨 | cs |
728x90
Exception Handler
- 스프링 MVC의 중요한 구성 요소 중 하나
- 코드의 가독성과 유지 보수성을 향상시킬 수 있음
- 구현 방법 : 예외를 처리할 메서드 위에 @ExceptionHandler 어노테이션 사용하기
# 예외를 처리하는 메서드
1 2 3 4 5 6 7 | @ExceptionHandler(value = 예외종류.class) // 어떤 예외가 발생했을 때 처리할지 public ResponseEntity<?> 메서드명(예외종류 e) { // 위에서 지정한 예외 타입을 반드시 매개변수로 // 코드 // 500 (유형에 맞게 상태 코드 지정) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(반환값); } | cs |
- 최상위 예외 클래스 : Exception
→ Exception으로 설정하면 따로 지정되지 않은 예외들은 모두 Exception의 메서드로 처리됨
(따로 지정된 예외들은 해당 메서드로 처리됨)
# 예외에 관한 DTO를 활용한 응답 처리
▶ DTO 예시
더보기
1 2 3 4 5 6 7 8 | @Data public class CustomError { private String parameter; private String field; private String message; } | cs |
▶ 응답 메서드 예시
더보기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @ExceptionHandler(value = MethodArgumentNotValidException.class) public ResponseEntity<?> methodArgumentNotValidException(MethodArgumentNotValidException e) { List<CustomError> errorList = new ArrayList<>(); e.getAllErrors().forEach(error -> { // 에러가 발생한 파라미터 String parameter = error.getCodes()[1].toString().split("\\.")[1]; // 에러가 발생한 필드 (여기서는 유효성 검사에 걸린 제약조건) String field = error.getCode(); // 에러 발생 시 메세지 String message = error.getDefaultMessage(); CustomError customError = new CustomError(); customError.setParameter(parameter); customError.setField(field); customError.setMessage(message); errorList.add(customError); }); // 400 return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorList); } | cs |
320x100
반응형
'Java > Spring Boot' 카테고리의 다른 글
[Spring Boot] 필터 (Filter) (0) | 2023.04.12 |
---|---|
[Spring Boot] JSP 템플릿 엔진 연결하기 (0) | 2023.04.12 |
[Spring Boot] Validation 관련 : BindingResult 클래스 (0) | 2023.04.11 |
[Spring Boot] Validation (유효성 검사) (0) | 2023.04.11 |
[Spring Boot] AOP (관점 지향 프로그래밍) ★ (0) | 2023.04.11 |