티스토리 뷰

728x90

1. 이 포스트는 Spring : Web MVC + Security + JDBC 시리즈에 연장이다. xml파일 설정은 사용하지 않는다.

  1-1 하려는 것은 우선 in-memory로 인증을 구현한다.

  1-2 Database를 생성하고 hibernate로 유저 등록을 구현한다. 

  1-3 가입정보에 대한 Validation처리를 작성한다. Customer Validatior로 구현한다. 이 포스트 내용

  1-4 In-memory가 아닌 DaoAuthenticationProvider로 hibernate를 사용한 Spring security 인증처리로 변경

  1-5 위에 것을 한번에 다 할려면 난이도가 헬이라서 이렇게 분리해서 한다.

 

2. 이 포스트는 Custom Validator를 만들어 Email을 검증하고 유저가 검증 비밀번호를 동일하게 입력한지를 검증한다.

  2-1 Email validator 생성

  2-2 비밀번호 검증

 

3. Email Validator를 생성한다.

  3-1 Field에 사용할 ValidEmail Annotation을 생성한다.

    3-1-1 이 annotation을 검증할 클래스를 @Contraint validatedBy 속성으로 지정한다.

    3-1-2 이 Validator는 field에서 사용할 예정이므로 @Target은 Field만 설정하였다.

    3-1-3 이메일 검증로직은 이미 정해진 룰이 있으므로 value를 따로 받을 필요가 없다. 메시지 설정만 제공하면 된다.

    3-1-4 groups, payload는 boilerplate 코드라고 생각하면 된다.

 

package pe.pilseong.custom_registration.validation;

...

@Constraint(validatedBy = EmailValidator.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidEmail {
  String message() default "Invalid E-mail";
  
  Class<?>[] groups() default{};
  
  Class<? extends Payload>[] payload() default {};
}

 

  3-2 검증 로직을 가지고 있을 EmailValidator클래스를 생성한다. 

    3-2-0 하이버네이트에서 같은 이름의 Validator를 가지고 있지만 여기서는 따로 작성한다.

    3-2-1 ConstraintValidator 인터페이스를 구현하고 있고

      3-2-1-1 Generic에 들어갈 Type은 검증할 Annotation과 검증대상의 입력형이 된다.

 

    3-2-2 아래 코드의  EMAIL_PATTERN은 인터넷에 regex email pattern이라고 검색하면 나온다.

      3-2-2-1 자바 언어에서 String내의 \처리를 위해 중복으로 \\로 escape가 아님을 명시해 주어야 한다.

 

    3-2-3 아래는 java에서 regex를 지원하기 위한 Pattern, Matcher를 사용하고 있다.

      3-2-3-1 Java Regex에 관해 알고 싶으면 아래 링크를 참조한다.

 

 

Java Regex | Regular Expression - javatpoint

Java Regex tutorial - Regular Expression in java with examples, api, matcher, pattern, regex character classes, regex quantifiers and regex meta characters.

www.javatpoint.com

      3-2-3-1 복잡하게 이런 utility를 사용하지 않고 그냥 String의 matches 메소드를 사용해도 된다.

 

    3-2-4 isValid는 검증로직을 구현하는 메소드로 첫번째 인자는 검증할 입력값이 들어온다.

 

package pe.pilseong.custom_registration.validation;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class EmailValidator implements ConstraintValidator<ValidEmail, String> {

  private Pattern pattern;
  
  private Matcher matcher;
  
  private static final String EMAIL_PATTERN =
      "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$";
    
  @Override
  public boolean isValid(String email, ConstraintValidatorContext context) {
    pattern = Pattern.compile(EMAIL_PATTERN);
    
    if (email == null) {
      return false;
    }
    
    matcher = pattern.matcher(email);
    
    return matcher.matches();
  }
}

 

4. 이제 사용하는 부분이 남았다. UserDTO의 email을 수정한다.

  4-1 제일 아래 email의 @ValidEmail annotation을 지정하고 있다.

  4-2 여기에 입력 글자 수를 검증하는 @Size validator도 지정하여 일정한 길이의 입력으로 유도하고 있다.

 

@Data
public class UserDTO {
  
  @NotNull(message = "is required")
  @Size(min = 4, max = 30, message = "Length ranges from 4 to 30")
  private String userName;
  
  @NotNull(message = "is required")
  @Size(min = 4, max = 20, message = "Length ranges from 4 to 20")
  private String password;

  @NotNull(message = "is required")
  @Size(min = 4, max = 20, message = "Length ranges from 4 to 20")
  private String matchingPassword;

  @NotNull(message = "is required")
  @Size(min = 3, max = 30, message = "Length ranges from 3 to 30")
  private String firstName;
  
  @NotNull(message = "is required")
  @Size(max = 30, message = "Maximum is 30")
  private String lastName;
  
  @NotNull(message = "is required")
  @Size(min = 5, max = 50, message = "Length ranges from 5 to 50")
  @ValidEmail(message = "Invliad Email")
  private String email;
}

 

5. 실제 화면은 다음과 같다.

 

 

6. 이번 포스트에서 한 것

  6-1 이메일 항목이 정상적으로 입력되었는지를 검증하는 custom validation을 생성하였다.

728x90
댓글