본문 바로가기
Java Web/Spring Boot

[Spring Boot] 예외 처리 (exception)

by 스응 2023. 4. 12.
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
반응형

댓글