스프링 부트 3.2.1 버전을 기준으로 작성됨
Bean Validation
: Bean Validation 2.0(JSR-380)이라는 기술 표준
//build.gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'
@NotBlank
: 빈값, 공백 만 있는 경우를 허용 x
@NotNoull
: null 허용 x
@Range(min,max)
: 범위 안의 값만 허용
@Max(n)
: 최대치 설정
이를 사용하면 이전에 사용했던
WebDataBinder
을 사용하지 않아도 된다.
스프링 부트는 자동으로 글로벌 Validator로 등록
LocalValidatorFactoryBean
을 글로벌 Validator로 등록FieldError
, ObjectError
를 생성해서 BindingResult
에 담아줌@ModelAttribute
각각의 필드에 타입 변환 시도typeMismatch
로 FieldError
추가타입 에러는 typeMismatch FieldError
// errors.properties
//{0}은 필드명
#Bean Validation 추가
NotBlank={0} 공백X
Range={0}, {2} ~ {1} 허용
Max={0}, 최대 {1}
공백일 수 없습니다.
흔히 Dto (데이터 전송 객체)를 만들어서 받는다.
등록 Dto , 수정 Dto 등..
HTML Form -> ItemSaveForm -> Controller -> Item 생성 -> Repository
- 장점 : 전송하는 폼 데이터가 복잡해도 거기에 맞춘 별도의 폼 객체를 사용해서 데이터를 전달 받을 수 있다.
보통 등록과, 수정용으로 별도의 폼 객체를 만들기 때문에 검증이 중복되지 않는다
- 단점 : 폼 데이터를 기반으로 컨트롤러에서 Item 객체를 생성하는 변환 과정이 추가된다.
@Data
public class ItemSaveForm {
@NotBlank
private String itemName;
@NotNull
@Range(min = 1000, max = 1000000)
private Integer price;
@NotNull
@Max(value = 9999)
private Integer quantity;
}
@PostMapping("/add")
public String addItem(@Validated @ModelAttribute("item") ItemSaveForm form,
BindingResult bindingResult, RedirectAttributes redirectAttributes) {
// 필요한 필드 넣어서 생성자 생성
Item item = new Item(생성자 사용);
}
수정도 Dto를 만들어서 필요한 필드 넣고 받아주면 된다.
@ModelAttribute
는 HTTP 요청 파라미터 (쿼리, Post Form) 해당
@RequestBody
는 HTTP Body 데이터 객체변환에 사용 (API JSON 요청)
@Slf4j
@RestController
@RequestMapping("/validation/api/items")
public class ValidationApiController {
@PostMapping("/add")
public Object addItem(@RequestBody @Validated ItemSaveForm form, BindingResult bindingResult) {
log.info("API 컨트롤러 호출");
if (bindingResult.hasErrors()) {
log.info("검증 오류 발생 errors={}", bindingResult);
return bindingResult.getAllErrors();
}
log.info("성공 로직 실행");
return form;
}
}
타입에러등으로 JSON을 Dto로 생성하지 못하면 컨트롤러 자체가 호출되지 않고 Validator도 역시 실행되지 않는다.
HttpMessageConverter 단계에서 실패하면 예외가 발생
예외 처리 필요
@ModelAttribute
@RequestBody
🔖 학습내용 출처