본문 바로가기
Spring

Custom Validation

by step 1 2021. 6. 19.
반응형

1. AssertTrue / False 와 같은 method 지정을 통해서 Custom Logic 적용 가능

     //  입력받은 날짜가 올바른 형식인지 확인 함수 앞에 is라는 명칭을 붙여줘야 동작한다.
    @AssertTrue(message = "yyyyMM의 형식에 맞지 않습니다.")
    public boolean isreqYearMonthValidation(){
        System.out.println("assert true call");
        // LocalDate은 기본적으로 yyyyMMdd 형식이므로 받은 데이터에 강제적으로 DD값을 임의로 붙여준다.
        String bDate = getReqYearMonth() + "01";
        try{
            LocalDate localDate = LocalDate.parse(bDate, DateTimeFormatter.ofPattern("yyyyMMdd"));
            System.out.println(this.reqYearMonth);
            System.out.println(localDate);
        } catch (Exception e){
            e.printStackTrace();
            return false;
        }
        return true;
    }

위와 같이 사용자가 정의할 수 있지만 재사용이 불가능 하다.

 

2. ConstraintValidator를 적용하여 재사용이 가능한 Custom Logic 적용 가능

어노테이션 생성

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 YearMonth {

    String message() default "yyyyMM 형식에 맞지 않습니다.";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

    // 여기까지 기본 어노테이션 데이터 가져옴

    // 아래부터 사용자가 작성 
    // 기본패턴 작성
    String pattern() default "yyyyMMdd";

}

유효성 체크할 클래스 입력

package com.example.validation.validator;

import com.example.validation.annotation.YearMonth;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

// YearMonth: 원하는 어노테이션, String: 그 어노테이션에 들어가는 값
public class YearMonthValidator implements ConstraintValidator<YearMonth, String > {

    private String pattern;

    @Override
    public void initialize(YearMonth constraintAnnotation) {
        this.pattern = constraintAnnotation.pattern();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        System.out.println("isValid 호출");
        // yyyyMM
        // LocalDate은 기본적으로 yyyyMMdd 형식이므로 받은 데이터에 강제적으로 DD값을 임의저 붙여준다.
        String bDate = value + "01";
        try{
            LocalDate localDate = LocalDate.parse(bDate, DateTimeFormatter.ofPattern(this.pattern));
            System.out.println(value);
            System.out.println(localDate);
        } catch (Exception e){
            e.printStackTrace();
            return false;
        }
        return true;
    }
}

dto -> 사용자가 만든 어노테이션 입력

@Size(min = 6, max = 6, message = "6자리여야 합니다")
    @YearMonth
    private String reqYearMonth; // yyyyMM

 

객체내에 또 다른 객체를 배열로 받는 경우

dto -> @Valid 어노테이션을 입력하여 유효성 검사를 진행하도록 설정한다.

@Valid
private List<Car> cars;

Car 내부 

package com.example.validation.dto;

import com.fasterxml.jackson.annotation.JsonProperty;

import javax.validation.constraints.NotBlank;

public class Car {

    @NotBlank
    private String name;

    @NotBlank
    @JsonProperty("car_number")
    private String carNumber;

    @NotBlank
    @JsonProperty("TYPE")
    private String type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCarNumber() {
        return carNumber;
    }

    public void setCarNumber(String carNumber) {
        this.carNumber = carNumber;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", carNumber='" + carNumber + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}

확인 -> Car 배열 내부에 공백을 체크하도록 설정하여서 에러 발생

정상처리 확인

반응형

'Spring' 카테고리의 다른 글

Server to Server의 연결 - get  (0) 2021.06.26
Exception 처리  (0) 2021.06.19
Validation  (0) 2021.06.19
Json으로 출력된 데이터 확인  (0) 2021.06.13
주요 어노테이션  (0) 2021.06.13