즉, 스레드간의 통신을 위한 장치가 바로 핸들러(Handler)입니다
Exception을 controller나 service단마다 배치할 수도 있지만, 그러면 유지보수가 힘들어진다.
그래서 @ControllerAdvice를 달아주는 Handler에서 Exception들을 통합적으로 관리해준다.
Exception들을 handler에서 관리한다. 사용할 때는 Exception에 Error코드를 담아서 호출하면, handler에서 response를 통해 클라이언트한테 응답한다
@Getter
@AllArgsConstructor
public enum ErrorCode {
ERROR_TEST_1(5000,"첫번째 에러야"),
ERROR_TEST_2(1010,"두번째 에러야")
;
private final int status;
private final String message;
}
@Builder
@Getter
public class ErrorResponse {
private final HttpStatus code;
private final LocalDateTime timestamp;
private final String message;
private final int status;
}
public class CustomException extends RuntimeException{
private final ErrorCode errorCode;
public CustomException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode=errorCode;
}
public ErrorCode getErrorCode() {
return errorCode;
}
}
@ControllerAdvice
@ResponseBody
public class ErrorHandler {
@ResponseStatus(HttpStatus.BAD_GATEWAY)
@ExceptionHandler(ErrorNotFoundException.class)
public ErrorResponse handleNotFound(CustomException e){
return ErrorResponse.builder()
.code(HttpStatus.BAD_REQUEST)
.message(e.getErrorCode().getMessage())
.status(e.getErrorCode().getStatus())
.timestamp(LocalDateTime.now())
.build();
}
}
메소드에 @ResponseBody 로 어노테이션이 되어 있다면 메소드에서 리턴되는 값은 View 를 통해서 출력되지 않고 HTTP Response Body 에 직접 쓰여지게 됩니다.
안붙였을 시
.message(e.getErrorCode().getMessage())
.status(e.getErrorCode().getStatus())
ControllerAdvice 참조 블로그
Spring 공식문서
https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
유효성 검사
너무 한글 블로그 문서들을 맹신하지 말 것. 공식문서나 , 영어문서, Official 문서등을 통해 확인절차를 걸쳐야 한다.
어느 정도 괜찮은 글을 발견했으면, Official이랑 비교해보고 나서 따라해보면서 익히기. 이 때 Getter Setter Constructor등은 Lombok annotation을 이용해 코드를 줄이기. 그리고 보통 블로그 글에는 여러 기능이 합쳐져서 구현될 때가 많은데, 다 따라하려고 할 필요 없고 내가 구현하고자 하는 기능만 따라해보면 된다.