바로 전 글에서 @ExceptionHandler를 사용하여 예외처리를 깔끔하게 처리했다. 하지만 컨트롤러의 정상 처리와 예외 처리 코드가 하나의 컨트롤러에 섞여있다. 이를 @ControllerAdvice를 사용하여 둘을 분리할 수 있다. ExControllerAdviceExControllerAdvice라는 클래스를 하나 만들어보자. 그 후, 기존 ApiExceptionV2Controller에서 예외처리를 하던 코드를 ExControllerAdvice에다가 옮기고 실행했다.@Slf4j@RestControllerAdvicepublic class ExControllerAdvice { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(Illegal..
HTML vs Api 오류전에 언급한 Spring mvc 패턴과 Restful Api의 차이가 여기서 한 번 더 나온다. 이 둘의 차이가 헷갈리다면 아래 글을 참고하기 바란다.2023.08.16 - [Spring/Spring Exception] - Spring Exception 4. Api 예외 처리 (Spring mvc VS RestfulApi) Spring Exception 4. Api 예외 처리 (Spring mvc VS RestfulApi)Spring mvc 패턴 VS RestfulApi 이전 글에도 언급했지만 mvc 패턴과 Api의 차이를 명확히 알아야 이해할 수 있다. 이 둘의 가장 큰 차이점만 언급하겠다. Spring mvc 패턴 View 지향: Spring MVC 패턴은 주로 웹 애toyc..
기본 제공 ResolverSpring Boot가 기본으로 제공하는 ExceptionResolver는 아래와 같다. 1. ExceptionHandlerExceptionResolver2. ResponseStatusExceptionResolver3. DefaultHandlerExceptionResolver ExceptionHandlerExceptionResolver는 Api 예외처리할 때 @ExceptionHandler로 대부분 처리한다. ResponseStatusExceptionResolver는 HTTP 상태 코드를 지정해 준다. ex) @ResponseStatus(value = Httpstatus.NOT_FOUND)DefaultHandlerExceptionResolver는 스프링 내부 기본 예외를 처리한다..
예전 로직지금까지는 예외가 발생하고 WAS까지 예외가 던져지고, WAS에서 오류페이지를 찾은 후 다시 /error로 호출했다.하지만 이렇게 여러 필터 및 인터셉터를 거치는 과정은 매우 비효율적이고 복잡하다.이때 ExceptionResolver를 활용하면 이러한 과정을 거치지 않고 예외를 깔끔하게 처리할 수 있다. UserException 정의 예외 추가RuntimeException을 상속받는 사용자 정의 예외를 추가했다. public class UserException extends RuntimeException{ public UserException() { super(); } public UserException(String message) { super(message);..
HandlerExceptionResolver만약 클라이언트의 요구사항이 추가되어서 bad라는 uri가 들어올 경우, 클라이언트에게 서버 문제가 아닌, 클라이언트의 문제라는 것을 알려주려면 어떻게 해야 할까? 기존 컨트롤러에 추가해 보자. @Slf4j@RestControllerpublic class ApiExceptionController { @GetMapping("/api/members/{id}") public MemberDto getMember(@PathVariable String id) { if (id.equals("ex")) { throw new RuntimeException("잘못된 사용자"); } if (id.equals("b..
BasicErrorControllerBasicErrorController에는 html view렌더링 이용시 이미 만들어져있듯 Api에 대한 내용 또한 이미 만들어져 있다.html view렌더링에 대한 응답과 json에 대한 응답은 다르지만 유입 경로는 동일하다. @RequestMapping(produces = MediaType.TEXT_HTML_VALUE) public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {...} @RequestMapping public ResponseEntity> error(HttpServletRequest request) {...} BasicErrorControlle..
Spring mvc 패턴 VS RestfulApi이전 글에도 언급했지만 mvc 패턴과 Api의 차이를 명확히 알아야 이해할 수 있다.이 둘의 가장 큰 차이점만 언급하겠다. Spring mvc 패턴View 지향: Spring MVC 패턴은 주로 웹 애플리케이션의 사용자 인터페이스(UI)를 개발하는 데 사용된다.컨트롤러가 뷰를 반환하고, JSP와 같은 뷰 템플릿 엔진을 통해 HTML을 생성하여 클라이언트에게 제공한다. RestfulApi데이터 지향: API 방식은 주로 데이터를 주고받는 데 사용된다.JSON, XML과 같은 데이터 형식을 사용하여 클라이언트와 서버 간 데이터를 교환한다. 뷰를 생성하는 대신, 데이터만 반환한다. 이 둘의 차이를 꼭 알아야, 이해가 가능하다. Api의 경우 웹 페이지가 아닌 ..
2023.08.12 - [Spring/Spring mvc] - Spring Exception 1. 서블릿1 (Spring에서 예외처리를 어떻게 할까?)2023.08.14 - [Spring/Spring mvc] - Spring Exception 2. 서블릿2 (Filter와 Interceptor를 안 거치려면?)BasicErrorController이전 글들을 보면 WebServerCustomizer를 만들어 오류 종류에 따라 어떠한 페이지로 가는지 경로를 정해줬고, 예외 처리용 컨트롤러를 직접 만들었다. 하지만 SpringBoot는 앞서 배운 내용을 기본으로 제공한다. 이러한 기본적인 내용들은 BasicErrorController에 모두 정의되어 있다. new ErrorPage로 상태코드와 예외를 설정하지..
서블릿 예외 처리 - 필터바로 전 포스트에서 예외 발생 시 오류 페이지 요청 흐름에 대해 알아보았다.2023.08.12 - [Spring/Spring mvc] - Sprinng Exception 1. 서블릿불필요한 호출오류가 발생시에 WAS 내부에서 다시 호출을 진행하는데 불필요하게 인터셉터, 서블릿, 필터가 2번씩 비효율적으로 호출된다. 하지만 로그인 기능 같은 경우, 이미 필터, 인터셉터에서 검증을 했는데, 한번 더 호출되는 것은 비효율적이다. 클라이언트에서 발생한 요청인지, 오류 페이지를 보여주기 위한 요청인지 구분해야 한다.서블릿은 이럴 때 사용하기 위해 DispatcherType이라는 옵션을 제공한다. DispatcherTypeDispatcherType에는 5가지 타입이 존재하는데, 아래 두 가..
서블릿 예외 처리 - 시작스프링에서 예외처리를 하는 방법을 이해하려면, 먼저 서블릿 예외 처리를 알아야 이해를 할 수 있으므로, 서블릿 예외처치를 먼저 학습한다. 서블릿은 2가지 방식으로 예외처리를 지원한다.Exceptionresponse.sendError(Http 상태 코드, 오류 메시지) [여기서 response는 HttpServletResponse)Exception자바 직접 실행 vs 웹 애플리케이션자바main이라는 이름의 쓰레드가 실행된다.실행 도중에 예외를 잡지 못하고 main메서드를 넘어 예외가 발생하면, 쓰레드가 종료된다. 웹 애플리케이션각 사용자 요청별로 쓰레드가 할당된다.애플리케이션에서 예외를 잡지 못하고, 서블릿 밖으로 예외 전달 시 아래와 같이 동작한다.WAS(여기까지 전파) Exce..