[Spring (6) ] 백엔드에서의 유효성 검증(Day 50)

코딩기록·2024년 12월 19일

[ Spring 유효성 검증 내용 처리 ]

0. FYI. Vanilla Code 유효성 검증

  • Java EE 기본 기능인 ValidatorFactory를 이용하여 검증 후 전달

1. 원리

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);
          }
    

    [ 유효성 검증 Annotation ]

1. 자바 기본 내장 기능임

2. 구조

  • @AnnotationName(message="")
    -> message : BindingResult 객체의 FieldErrors 필드의 DefaultMessage에 저장될 값
  • @Size(min=1, max=2)
  • @Max,Min(value=1)
  • @Pattern(regexp = "")

2. Annotation 종류

  • @Pattern(regexp = "")
    : 정규식 표현

  • @NotBlank
    : null이 아니고, 공백만 있는 문자열을 허용하지 않습니다.

  • @NotNull
    : null 값을 허용하지 않습니다.

  • @NotEmpty
    : null 값과 빈 문자열을 허용하지 않습니다.

  • @Size
    (ㅡㅑㅜ: 문자열, 컬렉션, 배열의 길이나 크기가 지정된 범위 내에 있는지 검증합니다.

  • @Min, @Max

  • @Email
    : 유효한 이메일 주소 형식을 검증합니다.

0개의 댓글