본문 바로가기
Study/SpringBoot

[SpringBoot] REST 애플리케이션 예외처리

by 오늘만 사는 여자 2021. 11. 5.
728x90
반응형

스프링 부트 어플리케이션에서 예외처리하는 방법은 3가지다:

  1. 전역 처리 Global Level using -  @ControllerAdvice
  2. 컨트롤러단에서 처리 Controller Level using @ExceptionHandler 
  3. 메소드단위 처리 Method Level using try/catch  


쉽게 어노테이션으로 관리가 가능하다.

@ExceptionHandler 와 @ControllerAdvice 를 이용해서 에러를 관리할 수 있다.

 

@ExceptionHandler 어노테이션은 @Controller, @RestController가 적용된 bean내에서 발생하는 예외를 처리할 수 있도록 해준다.

예시는 아래와 같이 작성만해 주면 된다.

 

@RestController
public class TestClass{
    ......
    /** 
     * 이 컨트롤러 내에서 발생하는 모든 예외를 처리한다     *  
     * */  
    @ExceptionHandler(value = Exception.class)  
    public String exeHandler(Exception e){  
    	System.out.println("ㅇㅇㅇ");
        return e.getMessage();  
    }  

}

사용법은 간단하다. @Controller, @RestController 어노테이션이 적용된 컨트롤러 클래스에 @ExceptionHandler 어노테이션을 적용한 메소드내에서 에러가 발생했을때 처리 로직을 구현하면된다. 이때 @ExceptionHandler("처리하고 싶은 에러 클래스")를 적용하여 해당 에러만 처리할 수 있도록 설정이 가능하다.

 

위의 예제 소스의 경우 Exception이 발생했을때 exeHandler()를 실행하게 된다.

@ExceptionHandler({err.class, err2.class})처럼 여러개의 에러를 필터링 할 수 있다. 해당 어노테이션은 익셉션 핸들러 어노테이션을 등록한 컨트롤러에서만 동작한다.

@ControllerAdvice의 경우에는 모든 @Controller,@RestController에서 발생하는 예외를 핸들링 할 수 있다.

사용법은 별도 클래스 파일을 만들어서 아래와 같이 소스를 작성해 주면 된다.

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(RestException.class)
	public ResponseEntity<Map<String, Object>> handler(RestException e) {
		Map<String, Object> resBody = new HashMap<>();
		resBody.put("message", e.getMessage());
		System.out.println("예외 처리 됨");
		return new ResponseEntity<>(resBody, e.getStatus());
	}
	
}
public class RestException extends RuntimeException {

	private static final long serialVersionUID = 1L;
	
	private HttpStatus status;
	private String message;

	public RestException(HttpStatus status, String message) {
		this.status = status;
		this.message = message;
	}

	public HttpStatus getStatus() {
		return status;
	}

	public void setStatus(HttpStatus status) {
		this.status = status;
	}

	public String getMessage() {
		return message;
	}

}

위와 같이 소스를 작성하면 모든 @RestController,@Controller에서 발생하는 예외는 모두 handler()를 실행하여 예외를 처리하게 된다.

여기서 @RestControllerAdvice, @ControllerAdvice의 차이점은 리턴 시 json타입으로 데이터를 반환하고 싶을경우 @RestControllerAdvice를 사용하면 된다.

 

Reference : https://m.blog.naver.com/rhkrehduq/221684602680

728x90
반응형

댓글