1) 클라이언트가 정보를 전달한다.
fetch("/test", {
method: 'POST',
header: { 'Content-Type' : 'application/json' },
body: JSON.Stringify {
name: "MJ KIM"
}
2) 서버에서 매핑되는 메소드를 호출할 때, 인자로 아래를 전달해 주면
(@RequestBody @Valid Object variable
, bindingResult)
-> Object 객체가 생성되면서 유효성 검사가 진행 되고
-> 유효성 검사 결과는 bindingResult 객체에 저장된다.
@PostMapping("api/v1/test")
// @valid를 통해 객체 생성하면서 유효성 검사 함께 진행
public ResponseEntity<?> createNewPost(
@RequestBody @Valid StudentDto dto, BindingResult bindingResult) {
// 구현 내용은 뒷 항목 참고
}
3) 유효성 검사 결과는 담은 BindingResult 객체에 유효성 에러가 발생했는지 BindingResult.hasErrors() 로 확인하고,
@PostMapping("api/v1/test")
public ResponseEntity<?> createNewPost(
@RequestBody @Valid StudentDto dto, BindingResult bindingResult) {
// ! BindingResult.hasErrors()로 유효성 검사 걸렸는지 확인
if(bindingResult.hasErrors()) {
// 뒷내용은 뒤에서 확인
}
}
4) 에러가 없으면 정상 진행
5) 에러가 있으면,
bindingResult.getFieldErrors()하면 아래와 같은 리스트가 반환되니까,
여기에서 field, defaultMessage만 가져와서 맵으로 만들어서
프론트에 전달

public ResponseEntity<?> a(@RequestBody @Valid ADTO dto, BindingResult bindingResult) {
// 에러가 있으면
if(bindingResult.hasErrors()) {
// getFieldErrors()로 에러 상새내역 리스트를 받고,
// 그 리스트에서 에러 필드랑, 에러 defaultMessage을 추출해서 프론트에 맵으로 전달할게요.
Map<String, String> errorMap = new HashMap<>();
/* fieldErrors의 형태 :
[
{ bindingFailure: false
defaultMessage: "어떠어떤게 잘못됐어요."
field: "number" // 객체의 필드
}
, { bindingFailure: false
defaultMessage: "어떠어떤게 잘못됐어요."
field: "number" // 객체의 필드
}
]
*/
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
fieldErrors.forEach(err -> {
errorMap.put(err.getField(), err.getDefaultMessage()); // 프론트에 전달하기 위해서, 에러 내용을 맵으로 저장
});
return ResponseEntity.badRequest().body(errorMap);
}
@Pattern(regexp = "")
: 정규식 표현
@NotBlank
: null이 아니고, 공백만 있는 문자열을 허용하지 않습니다.
@NotNull
: null 값을 허용하지 않습니다.
@NotEmpty
: null 값과 빈 문자열을 허용하지 않습니다.
@Size
(ㅡㅑㅜ: 문자열, 컬렉션, 배열의 길이나 크기가 지정된 범위 내에 있는지 검증합니다.
@Min, @Max
@Email
: 유효한 이메일 주소 형식을 검증합니다.