스프링/4. 스프링 MVC-2 87

67. API 예외처리

html 같은 경우는 그냥 4xx, 5xx등의 오류 페이지만 있으면 거의 해결 가능하다. 근데 API는, 각 오류 상황에 맞는 오류 응답 스펙을 클라이언트 사이드와 서버 사이드에서 약속을 하고 데이터를 내려주어야 한다. 먼저, 그냥 가상으로 /api/members/ex 라는 uri로 호출되면 에러를 뿜게 해줬고, 그 외에는 그냥 오브젝트를 만들어서 return 해 줬다. @RestController라 Json객체로 변환되어 들어간다. @RestController @Slf4j public class ApiExceptionController { @GetMapping("/api/members/{id}") public MemberDto getMember(@PathVariable("id") String id){ ..

66. BasicErrorController가 제공하는 정보들

스프링 부트가 자동으로 등록해주는 BasicErrorController는 timestamp status error exception trace message errors path 등을 model에 담아주기에, 이걸 템플릿에서 활용할 수 있다. 하지만 저걸 그래서 템플릿에서 모델에 넣어준 걸 꺼내서 템플릿에 뿌려보면.. 해커의 맛있는 밥이다. 그래서 사실, 원래 저렇게 안나온다. 저거는 내가 application.properties에 server.error.include-exception=true server.error.include-message=always server.error.include-stacktrace=always server.error.include-binding-errors=always ..

65. 스프링 부트 오류페이지

우리가 지금까지 오류페이지를 등록할 때, 에러페이지 컨트롤러를 따로 만들고, 그걸 @Component public class WebServerCustomizer implements WebServerFactoryCustomizer { @Override public void customize(ConfigurableWebServerFactory factory) { ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/404"); ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error-page/500"); ErrorPage errorPageEx ..

63. 서블릿 예외처리 필터

예외 발생 시 WAS 컨트롤러 이미 필터, 인터셉터 등을 거쳤기 때문에 검증같은 것은 완료를 한 것이다. 근데도 또 다시 거친다는 것은 너무 비효율 적이다. 그래서, 결국 저 예외 처리에 대한 호출이 클라이언트가 요청한 것인지, 아니면 서버 내부의 요청인지 구분해서 처리해야 한다. 그것이 DispatcherType에 나타난다. request.getDispatcherType() 하면 알 수 있다. sendError()나 예외를 뿌릴 시는 DispatcherType이 ERROR로 나오고, 고객이 처음 요청했을 시 에는 REQUEST 로 나온다. 중간에 바뀔 수도 있는 거다. ERROR : 오류 REQUEST : 클라이언트 요청 FORWARD : jsp 등 forward를 호출 하는 것을 썼을 때. INCLU..

62. 오류 화면 커스텀

오류 화면이 예쁘지 않다면 사용자는 망한 서비스 라고 생각한다. 우리가 할 일은 1. 커스터마이징을 한다고 스프링에게 일러준다. - 에러페이지 추가, 호출할 컨트롤러 @Component public class WebServerCustomizer implements WebServerFactoryCustomizer { @Override public void customize(ConfigurableWebServerFactory factory) { ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/404"); ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ER..

60. ArgumentResolver 활용

public String homeLoginV3Spring(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) { if(loginMember == null){ return "home"; } model.addAttribute("member", loginMember); return "loginHome"; } 이런 거 인자가 너무 긴데, 물론 이정도도 편리하긴 하지만, 우리가 직접 애노테이션 만들어서 활용할 수는 없을까? @GetMapping("/") public String homeLoginV3ArgumentResolver(@Login Member loginMember, Mode..