유효성 검증
포스트
취소

유효성 검증

유효성 검증(validation)이란?

  • 오류를 방지하기 위해 미리 검증을 하는 과정

유효성 검증에 대한 주의점

  • 검증해야 할 값이 많은 경우 코드의 길이가 길어진다.
  • 구현에 따라서 달라질 수도 있겠지만 Service Logic과의 분리가 필요하다.
  • 검증하는 코드가 흩어져 있는 경우 검증 위치가 불분명하며 재사용의 한계가 생긴다.
  • 구현 방식에 따라 다르겠지만 Validation Logic이 변경되면 참조하는 클래스에서 Logic이 변경되어야 하는 부분이 발생할 수 있다.
  • (중요 ★) 별로의 Logic이 필요한 어노테이션들 중에서
    다른 VO 객체에서도 반복되는 내용이 있다면
    아예 커스텀 어노테이션과 유효성 검증 클래스를 만드는 것이 낫다.

필요 dependency

  • xml
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
        <version>3.2.0</version>
    </dependency>
    
  • gradle
    implementation 'org.springframework.boot:spring-boot-starter-validation:3.2.0'
    

유효성 검증 어노테이션

  • 길이 측정
    • @Size(min=”최솟값”, max=”최댓값”)
      • 문자 길이 설정
      • int Type 사용불가
  • null 또는 공백 여부 확인
    • @NotNull
      • null 사용불가
    • @NotEmpty
      • null 사용불가
      • ”” 사용불가
    • @NotBlank
      • null 사용불가
      • ”” 사용불가
      • ” “ 사용불가
  • 날짜 확인
    • @Past
      • 과거 날짜
    • @PastOrPresent
      • 과거 날짜 또는 오늘 날짜
    • @Future
      • 미래 날짜
    • @FutureOrPresent
      • 미래 날짜 또는 오늘 날짜
  • 데이터 차이 비교
    • @Max(value=”숫자”)
      • 최댓값
    • @Min(value=”숫자”)
      • 최솟값
  • 별도 Logic에 따른 유효성 검증
    • @Pattern(regexp = “정규식”)
      • 정규식 적용
    • @AssertTure / @AssertFalse
      • 별도 Logic 적용
    • @Valid
      • 해당 Object Validation 실행
        (= 해당 어노테이션을 붙인 객체에 대해서 검사)
  • 형식
    • @Email
      • 이메일 형식

        ※ 공통 속성

        • message : validation이 실패할 경우 반환되는 default 메세지
        • payload : 특정 validation을 group을 지정하는 값
        • groups : 사용자가 추가 정보를 위해 전달할 수 있는 값, 주로 심각도를 나타낼 때 사용

사용 예시

@AssertTure(message="yyyyMMdd의 형식에 맞지 않습니다.")
private String birthday;
public String getBirthday() { return birthday; }
public void setBirthday(String birthday) { this.birthday = birthday; }

//boolean 형식 메소드명은 is로 시작해야 한다.
@AssertTrue
public boolean isBirthday(){
    try {
        LocalDate localDate = LocalDate.parse(getBirthday(), DateTimeFormatter.ofPattern("yyyyMMdd"));
    } catch (Exception e) {
        return false;
    }
    
    return true;
}

Custom Validator

  1. validatior용 패키지를 만든다.
  2. 해당 패키지에 유효성 검사용 자바 클래스를 만든다.
  3. 해당 클래스에 ConstraintValidator 인터페이스를 구현한다.
  4. ConstraintValidator에는 두 값이 필요한데
    첫번째는 검증에 필요한 어노테이션의 종류고
    두번째는 해당 어노테이션을 통해 들어올 값의 자료형이다.
  5. initialize 메소드와 isValid 메소드를 오버라이딩한 다음에 필요한 코드를 작성한다.
    • initialize
      • 어노테이션 등록시 값을 초기화하는 메소드
    • isValid
      • 어노테이션 등록시 해당 값을 검증하는 메소드
      • addConstraintViolation(ConstraintValidatorContext 변수, 전달할 메세지, “키 값”…)를 통해서 에러 메세지 전달 가능
      • addConstraintViolation의 키 값들은 ErrorResponse의 errors[].field에 바인딩된다.
  6. 해당 validatior를 사용할 어노테이션 파일에 가서 @Constraint 어노테이션의 validatedBy 속성의 {} 안에 추가해주면 된다.
    • 예시) @Constraint(validatedBy = { BirthdayValidator.class })
  7. 해당 validatior를 연결시킨 어노테이션을 필요한 곳에 추가해서 사용하면 된다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.