spring mvc 2(김영한) - 오류처리, 컨버터, 파일업로드

  • 오류 처리
    • response.sendError(404, "404오류");
    • extends webServerFactoryCustomizer<ConfigurableWebServerFactory>
    • void customize(ConfigurableWebServerFactory factory)
    • new ErrorPage(status, path)
    • factory.addErrorPages();
    • 예외 발생 시 WAS로 다시 가서 필터 서블릿 인터셉터 컨트롤러를 재호출한다.

 

  • 필터 오류 처리
    • add DispatcherType ERROR(서버 오류 반환)
    • 기본값은 REQUEST(클라이언트 요청)

 

  • 인터셉터 오류 처리
    • excludePathPatterns 에서 error 페이지 경로 추가하기
    • 오류 발생 시, after completion 호출 후 에러 페이지로 이동
    • 추가 안 한다면, post handler 거쳐서 이동

 

  • 스프링 기본 에러 반환
    • return /error 경로 지정하면 생성한 오류 페이지 자동 반환
    • 우선순위는 templates(500, 5xx) -> static(500, 5xx) -> templates(error.html)
    • API 에러 처리는 @RequestMapping에 produces = MediaType JSON으로 처리
    • BasicErrorController에서는 produces 자동 구현되어있음(/error)

 

  • HandlerExceptionResolver
    • implements HandlerExceptionResolver
    • e instanceOf IllegalArgumentException
    • response.sendError() || ModelAndView || response.getWriter().println() 으로 json 반환도 가능
    • WAS로 안 돌아감
    • webConfig에 extendHandlerExceptionResolvers 빈등록 필요
    • CustomException에 @ResponseStatus 지정 가능, reason 속성으로 메세지 지정도 가능
      return ResponseStatusException으로 바로 반환도 가능

 

  • 컨버터
    • implements Converter interface <S, T>
    • @Override convert()
    • ConversionService
    • DefaultConversionService, addConverter(new CustomConverter()) 등록 후,
    • 서비스 의존주입 받아서 service.convert("10", Integer.class)
    • 뷰 템플릿에서는 ${{}} 또는 th:field로 컨버터 적용가능

 

  • Formatter
    • Formatter<Number> 확장받아서
    • parse 메서드 오버라이드; NumberFormat.getInstance(locale), return numberFormat.parse(변수)
    • print 메서드 오버라이드 numberFormat.format(변수)
    • 컨버전 서비스 등록 시 포맷터 추가 가능(addFormatter())
    • 스프링 기본 제공 포맷터
      @NumberFormat, @DateTimeFormat 등

 

  • 파일
    • 파일업로드
      • multipart/form-data 타입으로 전송
      • 서로 다른 타입의 테이터를 한 번의 form 전송으로 전송
      • spring.servlet.multipart.max-file-size 또는 max-request-size 설정
      • file.dir 파일 저장할 주소를 변수로 생성한 후 @Value("${file.dir}")로 가져와서 사용가능
      • MultiPart(Part) -> part.write(fileDir + part.getSubmittedFileName());
      • MultipartFile로 파라미터 받고 !file.isEmpty()일 경우에 file.transferTo(new File(fileDir + file.getOriginalFilename()))
      • 업로드 시 확장자 분리 -> originalFilename.substring(lastIndexOf(".") + 1)
        새로운 파일 저장경로에 확장자 붙여서 저장

 

    • 첨부 이미지 다운로드
      • @ResponseBody로 반환 + return new UrlResource("file:" + file~.getFullPath(filename));
    • 첨부파일 다운로드 시에는 UrlResource + header 설정해주고 넘겨줘야함
      • contentDisponsition = "attachment; filename=\"" +
      • UriUtils.encode(uploadFileName, StandardCharsets.UTF-8) + "\""
      • .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition)

 

 

댓글을 작성해보세요.