pooney
article thumbnail

일반화 된 예외를 처리하기 위하여 Aop를 활용한 Exception Handling을 할 것입니다.  그렇기 떄문에 우리가 사용하는 시스템에서 예외가 발생했을 때 에러를 Handling 할 수 있는 Spring boot 에서 제공하는 클래스를 만들 것 입니다. 

 

 

 

 

 

 

 

 

 

Controller에 요청을 했을때 예외가 발생하는 코드를 작성하였습니다.

 

 

 

TestController 

@RestController
public class TestController {

    @GetMapping("/user")
    public String user(String id){
         throw new UserNotFoundExtion(String.format("존재하지 않는 회원 [ID : %s]", id));
	}
}

 

UserNotFoundExtion

@ResponseStatus(HttpStatus.BAD_REQUEST)
public class UserNotFoundExtion extends RuntimeException {
    public UserNotFoundExtion(String errormsg) {
        super(errormsg);
    }
}

 

 

ExceptionResponse

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExceptionResponse {
    private Date date;  //예외 발생 날짜
    private String msg; //예외 메시지 
    private String content; //예외가 어느 요청에서 났는지 확인
}

 

예외가 발생하면 해당 객체에 값을 넣어 사용자에게 전달할 클래스입니다. 

 

CustomizedExceptionHandler

@RestController
@ControllerAdvice
public class CustomizedExceptionHandler extends ResponseEntityExceptionHandler {

    //Exception을 통해 예외를 받고 WebRequest를 통행 어디서 에러가 발생했는지 받을 것입니다.
    @ExceptionHandler(Exception.class)
    public final ResponseEntity<Object> allException (Exception e , WebRequest request){
        ExceptionResponse exceptionResponse =
                new ExceptionResponse( new Date(), e.getMessage(), request.getDescription(false));
        return new ResponseEntity(exceptionResponse , HttpStatus.INTERNAL_SERVER_ERROR);

    }
}

 

@RestController를 등록하여 웹서비스에서 사용할 수 있게 만들어 줍니다. 그다음 @ControllerAdvice를 등록하여 모든 컨트롤러가  실행이 될떄 해당 해당 어노테이션을 가지고 있는 빈이 자동으로 실행이 됩니다. 만약 에러가 발생하면 해당 클래스에서 정의한 메소드가 자동으로 실행되어 처리가 될 것입니다.  @ExceptionHandler은 해당 예외가 발생 했을때 해당 메소드가 실행 될 수 있께 정의하는 어노테이션입니다.  해당 코드는 Exception.class를 넣어줌으로써 모든 예외에 대한 처리를 담당하게 되고 INTERNAL_SERVER_ERROR 코드를 리턴하게 됩니다. 

 

 

결과 

 

요청 결과 Status 코드가 500에러가 발생했으며 date, msg, content가 정상적으로 출력되는 것을 확인 할 수 있습니다. 하지만 모든 예외를 처리하는 것이 아닌 특정 UserNotFound가 발생하면 4xx의 Status를 리턴하는게 맞으니 코드를 추가하도록 하겠습니다. 

 

 

 

 

 

CustomizedExceptionHandler

@RestController
@ControllerAdvice
public class CustomizedExceptionHandler extends ResponseEntityExceptionHandler {

    //Exception을 통해 예외를 받고 WebRequest를 통행 어디서 에러가 발생했는지 받을 것입니다.
    @ExceptionHandler(Exception.class)
    public final ResponseEntity<Object> allException (Exception e , WebRequest request){
        ExceptionResponse exceptionResponse =
                new ExceptionResponse( new Date(), e.getMessage(), request.getDescription(false));
        return new ResponseEntity(exceptionResponse , HttpStatus.INTERNAL_SERVER_ERROR);

    }
    //UserNotFoundExtion.class 예외가 발생 했을때 작동 
    @ExceptionHandler(UserNotFoundExtion.class)
    public final ResponseEntity<Object> userFoundException (Exception e , WebRequest request){
        ExceptionResponse exceptionResponse =
                new ExceptionResponse( new Date(), e.getMessage(), request.getDescription(false));
        return new ResponseEntity(exceptionResponse , HttpStatus.NOT_FOUND);

    }
}

기존 코드에 @ExceptionHandler(UserNotFoundExtion.class)를 추가하여  UserNotFoundExtion이 발생했을때 해당 메소드가 실행 되게 하여 HttpStatus.NOT_FOUND를 반환하게 하는 코드를 추가하였습니다.

 

 

 

 

Status가 500 에러에서 404 를 정삭적으로 출력하는 것을 확인 할 수 있습니다 . 이처럼 AOP를 적절히 사용하여 예외에대한 핸들링이 가능하니 상황에 맞게 사용하시기 바랍니다. 

profile

pooney

@pooney

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!