[Spring] @ExceptionHandler

Jin·2023년 9월 6일
0

Spring

목록 보기
4/9
post-thumbnail

1. @ExceptionHandler란?

  • Controller 계층에서 발생하는 에러를 잡아서 메서드로 처리해주는 기능
  • Service, Repository에서 발생하는 에러는 제외

사용 예시

  • 하나의 Exception 처리
    @Controller
    public class SimpleController {
    
        // ...
    
        @ExceptionHandler
        public ResponseEntity<String> handle(IOException ex) {
            // ...
        }
    }
  • 여러 개의 Exception 처리
    @Controller
    public class SimpleController {
    
        // ...
    
        @ExceptionHandler({FileSystemException.class, RemoteException.class})
        public ResponseEntity<String> handle(Exception ex) {
            // ...
        }
    }
    • value 값으로 특정 Exception들을 설정
    • 여러 개의 Exception을 잡아야 하면 구체적으로 명시해주는 것을 권장
      • @ExceptionHandler({FileSystemException.class, RemoteException.class})

2. @ControllerAdvice

  • @ControllerAdvice@Controllerhandler에서 발생하는 에러들을 모두 잡아줌
    **@ControllerAdvice**
    public class ExceptionHandlers {
    
        **@ExceptionHandler(FileNotFoundException.class)**
        public ResponseEntity handleFileException() {
            return new ResponseEntity(HttpStatus.BAD_REQUEST);
        }
    }

범위 설정

  • @ControllerAdvice는 모든 에러를 잡아줌
  • 일부 에러만 처리하고 싶은 경우에는 따로 설정하면 됨
    1. 애노테이션

      @ControllerAdvice(annotations = RestController.class)
      public class ExampleAdvice1 {}
    2. basePackages, basePackagesClasses

      @ControllerAdvice("org.example.controllers")
      public class ExampleAdvice2 {}
      • basePackages
        • 탐색 패키지 지정
        • org.example.controllers 패키지, 하위 패키지까지 모두 탐색
      • basePackagesClasses
        • 탐색 클래스 지정
        • 클래스의 맨 위에 있는 package부터 시작
    3. assignableTypes

      @ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
      public class ExampleAdvice3 {}

주의사항

  • 애노테이션, 베이스패키지 등 설정자들은 Runtime시 수행 → 너무 많은 설정자들을 사용하면 성능이 떨어질 수 있음

@ControllerAdvie 인터페이스

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
**@Component**
public @interface ControllerAdvice {
		// ...
}

@RestControllerAdvice

  • **@RestControllerAdvice@ControllerAdvice@ResponseBody를 가지고 있음**
  • @ControllerAdvice와 동일한 역할을 수행하고, @ResponseBody를 통해 객체를 리턴할 수 있음

@RestControllerAdvice 인터페이스

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
**@ControllerAdvice**
**@ResponseBody**
public @interface RestControllerAdvice {
		// ...
}

@ControllerAdvice vs @RestControllerAdvice

  • @ControllerAdvice
    • @Component 애노테이션을 가지고 있음 → 컴포넌트 스캔을 통해 스프링 빈으로 등록됨
  • @RestControllerAdvice
    • @ControllerAdvice@ResponseBody 애노테이션으로 이루어져 있음 → HTML 뷰 보다는 Response body로 값을 리턴할 수 있음

참고 페이지

[스프링부트] @ExceptionHandler를 통한 예외처리

profile
블로그 이사했습니다! 💨💨 https://guswls28.tistory.com

0개의 댓글