spring mvc 2(김영한) - 오류처리, 컨버터, 파일업로드
2022.04.22
- 오류 처리
- 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으로 바로 반환도 가능
- CustomException에 @ResponseStatus 지정 가능, reason 속성으로 메세지 지정도 가능
- 컨버터
- 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)
새로운 파일 저장경로에 확장자 붙여서 저장
- 업로드 시 확장자 분리 -> 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)
- 첨부파일 다운로드 시에는 UrlResource + header 설정해주고 넘겨줘야함
댓글을 작성해보세요.