leehs1590972
@leehs1590972
Reviews Written
5
Average Rating
5.0
Posts
Q&A
@ModelAttribute๋ก ๋ฐ์ ๊ฐ์ฒด์ API ์์ธ ์ฒ๋ฆฌ
๊ณผ๊ฑฐ ์ ๊ฐ ๋ฌ์๋ ๋ต๋ณ์ด ๊ธฐ์ต์ด๋ ๋ค์ ๋ต๋ณ๋ฌ์๋ด ๋๋ค ใ ใ @ModelAttribute๋ก ๋ฐ์ธ๋ฉ ํ๋ ๊ฐ์ฒด์ @Valid๋ฅผ ๋ถ์ฌ์ฃผ๊ฒ ๋๋ฉด ์ ๋ ฅ๊ฐ์ ๋ํ ๊ฒ์ฆ์ ํด์ค๋๋ค. @PostMapping("/images") public ResponseEntity uploadImages(@Valid final ImagesUploadRequest imagesUploadRequest) { awsS3Service.uploadFiles(imagesUploadRequest); return ResponseEntity.status(HttpStatus.CREATED) .build(); }์ ๋ ฅ๊ฐ์ ๊ฒ์ฆ๋ฐ์ ๊ฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.@Getter public class ImagesUploadRequest { @NotBlank(message = "์นดํ ๊ณ ๋ฆฌ๋ ๋ฐ๋์ ์ ๋ ฅํด์ผ ํฉ๋๋ค.") private String category; @NotNull(message = "์ด๋ฏธ์ง๋ ๋ฐ๋์ ์ฒจ๋ถํด์ผ ํฉ๋๋ค.") @Size.List(value = @Size(min = 1, max = 10, message = "์ต๋ 10์ฅ๊น์ง ์ ๋ก๋ํ ์ ์์ต๋๋ค.")) private List files; @Builder private ImagesUploadRequest(final String category, final List files) { this.category = category; this.files = files; } } ์ด๋ ์ ๋ ฅ๊ฐ ๊ฒ์ฆ์ด ์คํจํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด logging์ด ๋๋๊ฒ์ ์ ์ ์๋๋ฐ์(์ ๊ฐ ๊ณ ์๋ก ๋ฐ์์ํจ ์์ธ๋ 10์ฅ์ ์ด๊ณผํ๋ MultipartFile์ ์์ฒญ์ผ๋ก ๋ณด๋ธ ์ํ์ ๋๋ค.)2023-08-02 20:11:38.075 WARN 94275 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: ์ด์ฉ๊ตฌ ์ ์ฉ๊ตฌ ~~]์ด๋ org.springframework.validation.BindException๋ผ๋ ์์ธ๊ฐ ๋ฐ์ํ๊ณ , ํด๋น ์์ธ๋ฅผ ์คํ๋ง๋ถํธ๊ฐ ๋ก๊น ํด์ฃผ๋๊ฒ์ ์ ์ ์์ต๋๋ค.๋ฐ๋ผ์ @ControllerAdvice ํน์ @RestControllerAdvice๊ฐ ๋ถ์ advice ํด๋์ค์ ํด๋น ์์ธ๋ฅผ ์ก์์ฃผ๊ฒ ๋๋ฉด ์ ๋ ฅ๊ฐ์ ๋ํ ๊ฒ์ฆ ์์ธ๋ฅผ ์ปค์คํ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค!@RestControllerAdvice public class ControllerAdvice { @ExceptionHandler(BindException.class) public ResponseEntity handleBindException(final BindingResult bindingResult) { String defaultMessage = bindingResult.getFieldErrors() .get(0) .getDefaultMessage(); return ResponseEntity.badRequest() .body(ErrorResponse.builder() .errorCode(CommonErrorCode.BIND_FILED_NOT_VALUE.value()) .message(defaultMessage) .build() ); } } ๋๋ถ์ด์ BindingResult ๊ฐ์ฒด ๋ํ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ์ ์ ์์ผ๋ฏ๋ก ํด๋น ๊ฐ์ฒด๋ฅผ ํตํด ์ฐ๋ฆฌ๊ฐ ์ปค์คํ ํ๊ฒ ์ค์ ํ๋ ์์ธ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ธ ๋ฉ์์ง๋ฅผ ์ปค์คํ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค!// ์์ธ ์ฒ๋ฆฌ ์ ์์ธ ๋ฉ์์ง { "timestamp": "2023-08-02T11:11:38.080+00:00", "status": 400, "error": "Bad Request", "path": "/images" } // ์ปค์คํ ์์ธ ์ฒ๋ฆฌํ ๋ฉ์์ง { "message": "์ต๋ 10์ฅ๊น์ง ์ ๋ก๋ํ ์ ์์ต๋๋ค.", "errorCode": -3000 } (์ถ๊ฐ๋ก @RequestBody๋ฅผ ํตํด JSON ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋งคํํ๋ ๊ฒฝ์ฐ์๋ MethodArgumentNotValidException ์์ธ๊ฐ ๋ฐ์ํ๋ฏ๋ก ํด๋น ์์ธ๋ฅผ ์ด์ฉํด ์ปค์คํ ํ๊ฒ ์์ธ ์๋ต์ ํ ์ ์์ต๋๋ค!)
- 3
- 2
- 1K
Q&A
@ModelAttribute๋ก ๋ฐ์ ๊ฐ์ฒด์ API ์์ธ ์ฒ๋ฆฌ
ModelAttribute์ ๋ฐ์ธ๋ฉ ์์ ์ ๋ฐ์๋๋ ์ค๋ฅ์์ ์๋ ์ ์ํ์ ์ ๊ฐ์ด ์ ๋ ฅ๋์ด์ผ ํ๋๊ณณ์ ๋ฌธ์์ด์ด ์ ๋ ฅ๋๋ ๋ถ๋ถ์์ ๋ฐ์ํ ์ ์์ต๋๋ค.(TypeMismatch)์ค์ ๋ก ์ฟผ๋ฆฌ์คํธ๋ง์ ํตํด intํ์ ๊ฐ์ ๋ฌธ์์ด์ ์ ๋ ฅํ๊ฒ๋๋ฉด ์์ธ๊ฐ ๋ฐ์ํ์ง ์๊ณ BeanPropertyBindingResult๊ฐ ์์ฑํ ์๋ฌ ๋ฉ์์ง๊ฐ ๋ก๊ทธ์ ์ฐํ๊ฒ ๋ฉ๋๋ค.์ด๋ ์ฌ์ค ์ง์ ์ ์ธ ์์ธ๊ฐ ๋ฐ์ํ๋ค๊ธฐ ๋ณด๋ค๋ BeanPropertyBindingResult ๊ฐ์ฒด๊ฐ ์์ธ๋ฅผ ๋จน๊ณ ์์ธ์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ก๊ทธ๋ก ์ถ๋ ฅํด์ค๋ค๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.์คํ๋ง ๊ณต์๋ฌธ์์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก @ModelAttribute์ ๋ํ ์์ธ ์ฒ๋ฆฌ๋ BindingResult๋ฅผ ์ด์ฉํ์ฌ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์์ต๋๋ค.https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-modelattrib-method-args๋ํ์ฌ ๊ฐ์ฌ๋์ MVC1 BindingResult2 ๊ฐ์๋ฅผ ์ฐธ๊ณ ํด๋ณด์ ๋ ์ข์๊ฒ ๊ฐ์ต๋๋ค!์ง์ ์ ์ผ๋ก @ModelAttribute์ ์์ธ๋ฅผ ์บ์นํด์ @ExceptionHandler๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ด๋ ๋์ค์ง ์์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค๋ง BindingResult๋ผ๋ ์ข์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ฏ๋ก ํด๋น ๊ฐ์ฒด๋ฅผ ์ด์ฉํด๋ ์ข์๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ ๋๊ธ ๋ฌ์๋ดค์ต๋๋ค!
- 3
- 2
- 1K




