내가 겪은 문제 API 통신을 할 때 @ExceptionHandler 애너테이션이 호출되지 않는 문제가 있었다. 문제가 발생하는 코드는 아래와 같다. ApiExceptionController @Slf4j @RestController public class ApiExceptionController { @GetMapping("/api/members/{id}") public MemberDto getMember(@PathVariable("id") String id) { if (id.equals("ex")) { throw new RuntimeException("잘못된 사용자"); } if (id.equals("bad")) { log.info("ApiExceptionController 호출"); throw new ..
클라이언트-서버 간의 통신 클라이언트와 서버 간에 통신에는 HTML을 통한 통신도 있지만 API를 통한 통신도 존재한다. 스프링에서 API 통신을 할 때 예외가 서블릿에서 별도로 처리되지 않으면 WAS로 예외를 넘겨주면서 500 에러를 발생시킨다. 여기서 문제점은 WAS로 넘어간 예외는 항상 500 에러를 발생시키기 때문에 각 상황에 맞는 예외처리가 되지 않는다. (404 에러를 발생시키고 싶은데 500 에러로 처리됨 등) 위 그림을 보면 핸들러에서 발생한 예외가 서블릿(스프링에서는 디스패처 서블릿)으로 넘어가게 되는데 서블릿에서 해당 예외를 별도로 처리하는 로직이 존재하지 않는다면 WAS로 예외를 넘겨버린다. WAS로 넘어간 예외는 말했듯이 500 에러를 발생시킨다. API 마다 다르게 예외 처리 위의..
내가 겪은 문제 WAS로 예외 또는 sendError가 전송되었을 때, 해당 에러를 처리할 예외 페이지를 등록했음에도 서블릿의 기본 예외 페이지가 보였다. 예외 페이지 등록 public class WebServerCustomizer implements WebServerFactoryCustomizer { @Override public void customize(ConfigurableWebServerFactory factory) { ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST, "/error-page/400"); ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page..
groups 기능 사용할 때 class가 아닌 interface로 만들어야한다. // public interface SaveCheck {} public class SaveCheck{} exception [Request processing failed; nested exception is javax.validation. ValidationException: HV000045: A group has to be an interface. hello.itemservice.domain.item.SaveCheck is not.] with root cause
Validator란? 스프링에서 사용자가 입력한 값에 대해서 올바른지에 대한 검증기를 제공한다. 바로 Validator 인터페이스이다. 상품의 가격을 입력해야 하는데 숫자가 아닌 문자를 입력했거나 제한된 값을 넘어서거나 등등 이에 대응할 수 있게 해준다. Validation 인터페이스는 다음과 같은 메서드를 제공한다. public interface Validator { /** * Can this {@link Validator} {@link #validate(Object, Errors) validate} * instances of the supplied {@code clazz}? * This method is typically implemented like so: * return Foo.class.isAs..