ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • spring boot- validation (@Valid) 스프링에서 밸리데이션 처리하기
    WEB/BACK 2022. 2. 1. 14:18
    반응형

    spring boot에서 제공하는 기본 메소드 사용하기

     

    1. DTO 에 원하는 변수 위에다가 @ 

        @Email
        private String email;
    
        @Pattern(regexp = "^\\d{2,3}-\\d{3,4}-\\d{4}$",message = "폰 번호 오류")
        private String phoneNumber;
        
        @Size(min=6, max=6)
        private String reqYearMonth;//yyyyMM

     

    2. controller 에서 @Valid 어노테이션 추가

     @PostMapping("/user")
        public User user(@Valid @RequestBody User user){
            System.out.println(user);
            return user;
        }

    2-2. error결과를 구체적으로 알아오기 BindingResult에 담아옴

    @PostMapping("/user")
        public ResponseEntity user(@Valid @RequestBody User user, BindingResult bindingResult) {
            if (bindingResult.hasErrors()) {
                StringBuilder sb = new StringBuilder();
                bindingResult.getAllErrors().forEach(objectError -> {
                    FieldError field = (FieldError) objectError;
                    String message = objectError.getDefaultMessage();
                    System.out.println("field :" + field.getField());
                    System.out.println(message);
                    sb.append(("field:" + field.getField()));
                    sb.append("message : " + message);
                });
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(sb.toString());
            }
        return ResponseEntity.status(HttpStatus.OK).body("잘됨");
        }

    결과 확인


    사용자 커스텀 밸리데이션 

    1. AssertTrue사용

     @AssertTrue(message = "형식에 맞지 않습니다...")//true로 리턴되어야한다.
        public boolean isReqYearMonthVali(){//boolean type 은 method명을 is로 시작
            System.out.println("isRequestYearMonth....validation");
            try {
                LocalDate localDate = LocalDate.parse(getReqYearMonth()+"01", DateTimeFormatter.ofPattern("yyyyMMdd"));
            }catch(Exception e){
                return false;
            }
                return true;
        }

    설정한 message 를 사용한다.

    2. 사용자가 어노테이션 만들기

    2-1. email.java에서 복사해와서 새로 만든 파일에 붙혀넣기

    package com.example.validation.annotation;
    
    import com.example.validation.validator.YearMonthValidator;
    
    import javax.validation.Constraint;
    import javax.validation.Payload;
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    
    import static java.lang.annotation.ElementType.*;
    import static java.lang.annotation.ElementType.TYPE_USE;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    
    @Constraint(validatedBy = {YearMonthValidator.class})//사용자가 생성
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
    @Retention(RUNTIME)
    public @interface ReqYearMonth {
        String message() default "{yyyyMM 형식에 안맞는다...}";
    
        Class<?>[] groups() default { };
    
        Class<? extends Payload>[] payload() default { };
    
        String pattern() default "yyyyMM";//추가한 부분
    }

    validator class만들기

    package com.example.validation.validator;
    
    import com.example.validation.annotation.ReqYearMonth;
    
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    
    public class YearMonthValidator implements ConstraintValidator<ReqYearMonth,String> {
        private String pattern;
    
        @Override
        public void initialize(ReqYearMonth constraintAnnotation) {
            ConstraintValidator.super.initialize(constraintAnnotation);
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            System.out.println("isRequestYearMonth....validator,..!");
            try {
                LocalDate localDate = LocalDate.parse(value+"01", DateTimeFormatter.ofPattern("yyyyMMdd"));
            }catch(Exception e) {
                return false;
            }
            return true;
        }
    }

     

    반응형

    댓글

Designed by Tistory.