본문 바로가기
Spring

Spring Boot Exception Handling 노트

by SuldenLion 2022. 11. 6.
반응형

스프링 부트의 예외 처리 방식

- @ControllerAdvice를 통한 모든 Controller에서 발생할 수 있는 예외 처리 (모든 컨트롤러에서 발생할 예외를 정의)

- @ExceptionHandler를 통한 특정 Controller의 예외 처리 (발생하는 예외마다 처리할 메소드를 정의)

 

예외 클래스

- 모든 예외 클래스는 Throwable 클래스를 상속받고 있음. Exception은 수 많은 자식 클래스가 있음. RuntimeException은 Unchecked Exception이며, 그 외 Exception은 Checked Exception으로 볼 수 있음.

 

  Checked Exception Unchecked Exception
처리 여부 반드시 예외 처리 필요 명시적 처리 강제하지 않음
확인 시점 컴파일 단계 실행 중 단계
예외 발생시 트랜잭션 롤백하지 않음 롤백함
대표 예외 IOException
SQLException
NullPointerException
IllegalArgumentException
IndexOutOfBoundException
SystemException

@ControllerAdvice, @RestControllerAdvice

- Spring에서 제공하는 annotation. @Controller나 @RestController에서 발생하는 예외를 한 곳에서 관리하고 처리할 수 있게 해주는 annotation임. 설정을 통해 범위 지정가능, Default값으로 모든 Controller에 대해 예외 처리를 관리함. ex) @RestControllerAdvice(basePackages = "...") 와 같이 패키지 범위 설정 가능.

예외 발생시 json 형태로 결과를 반환하기 위해서는 @RestControllerAdvice를 사용하면 됨.

 

@ExceptionHandler

- 예외 처리 상황이 발생하면 해당 Handler로 처리하겠다고 명시하는 annotation. 어노테이션 뒤에 괄호를 붙여 어떤 ExceptionClass를 처리할지 설정할 수 있음. ex) @ExceptionHandler(OOException.class)

Exception.class는 최상위 클래스로 하위 세부 예외 처리 클래스로 설정한 핸들러가 존재하면, 그 핸들러가 우선처리하게 되며, 처리 되지 못하는 예외 처리에 대해 ExceptionClass에서 핸들링함. @ControllerAdvice로 설정된 클래스 내에서 메소드로 정의할 수 있지만, 각 Controller 안에 설정도 가능. 전역 설정(@ControllerAdvice)보다 지역 설정(@Controller)로 정의한 Handler가 우선순위를 가짐.

@ExceptionHandler(Exception.class)                 <                @ExceptionHandler(NullPointerException.class)

                                                                 (우선순위 높음)

 

Custom Exception

HttpStatus는 Enum Class이다. (Enum Class : 서로 관련있는 상수들을 모아 Symbolic한 명칭의 집합으로 정의한 것. 클래스처럼 보이게 하는 상수)

error type : HttpStatus의 reasonPhrase

error code : HttpStatus의 value

message : 상황별 디테일 message

 

                            Throwable

                                   ↑

                            Exception

                                   ↑

                HttpStatus / ExceptionClass

 

 

 

반응형

'Spring' 카테고리의 다른 글

Test Coverage 노트  (0) 2022.11.08
RestTemplate, TDD 노트  (0) 2022.11.07
Spring Boot Validation 노트  (0) 2022.11.05
Logback 노트  (0) 2022.11.04
ORM, JPA, Spring Data JPA 노트  (0) 2022.11.03

댓글