@RestControllerAdvice
- Web Application의 입장에서 바라 보았을 때, 에러가 났을 때 내려 줄 수 있는 방법은 많지 않다
- 에러 페이지
- 4xx Error or 5xx Error
- Client가 200외에 처리를 하지 못할 때는 200을 내려주고 별도의 에러 Message 전달
@ControllerAdvice, @RestControllerAdvice : Global 예외처리및 특정 Package/ Controller 예외처리
@ExceptionHandler : 특정한 예외에 대한 처리
@RestControllerAdvice public class GlobalControllerAdvice{ @ExceptionHandler(value=Exception.class) public ResponseEntity exception(Exception e){ System.out.println(e.getClass().getName()); System.out.println(e.getLocalizedMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(""); } @ExceptionHandler(value=MethodArgumentNotValidException.class) public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); } }
- 위와 같이 @RestControllerAdvice를 붙이면 전역적으로 예외처리를 진행하게 됨. basePackage 를 명시하면 해당 패키지 아래의 모든 예외들을 처리하게 됨
- @ExceptionHandler를 특정 클래스 안에 넣게 되면 그 클래스에서 일어나는 예외는 해당 메써드로만 처리하게 되고 Global Handler가 있다 하더라도 local의 것을 우선시 하게 됨
Tips
- 호출하는 쪽에서 복구하리라 여겨지는 상황이라면 checkedException 사용
- 프로그래밍 오류를 나타낼 때는 런타임 예외
- 런타임 예외의 대부분은 전제조건을 만족하지 못했을 때 발생함
- 애플리케이션의 로직을 담기 위한 예외는 체크 예외로 만든다 → 그렇게 하여 강제적으로 try catch가 로직상에 들어갈 수 있도록 하기
공격이나 버그에 대한 대응
서버에 남기고 공격이나 버그는 개발자가 즉각 알아차리고 대응해야 하기 때문에 슬랙이나 메일 혹은 문자로 보내줘야합니다
다른 사람의 여행을 조회한다는것 자체가 해킹을 시도했거나 클라이언트 코드에 버그가 있거나 하는 사항입니다 두가지 상황 모두가 개발자가 알아차리고 즉각 대응을해줘야하는 부분이에요
예외전환
- 목적
- 런타임 예외로 포장해서 필요하지 않은 try/catch 사용 안하도록
- 로우레벨의 예외를 좀 더 의미있고 추상화된 예외로 바꿔서 던지기 위하여