Spring

[스프링] 검증 : annotation 생성

웨일파도 2023. 7. 5. 13:12
반응형
생년월일을 yyyyMM 6자로 입력받는 annotation 생성하기

 

User.java

package com.example.practice2.validation.model.dto;

// 2.0 validation
import com.example.practice2.validation.annotation.YearMonth;

import javax.validation.constraints.*;

public class User {

 // 생년월일
    // default 형식이 'YYYYMM' -> 199912
    // @Size(min=8, max=8)
    @YearMonth
    private String birth;


    public String getBirth() {
        return birth;
    }

    public void setBirth(String birth) {
        this.birth = birth;
    }

}

YearMonthValidator

package com.example.practice2.validation.validator;

import com.example.practice2.validation.annotation.YearMonth;

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

public class YearMonthValidator implements ConstraintValidator<YearMonth, String> {

    private String pattern;

    @Override
    public void initialize(YearMonth constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);

        // YearMonth 어노테이션에 있는 pattern메소드 값으로 세팅하여 사용
        this.pattern = constraintAnnotation.pattern();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // pattern디폴트 값은 'YYYYMM'
        try {
            LocalDate.parse(value + "01", DateTimeFormatter.ofPattern(this.pattern));
        } catch (Exception e) {
            return false;
        }
        return true;
    }

}

interface Yearmonth

package com.example.practice2.validation.annotation;

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 = { })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)

public @interface YearMonth {
    String message() default "{year month 형식에 맞지 않음 (예) 199012}";

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

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

    String pattern() default "yyyyMMdd";

}

형식에 맞게 보냈을 때 

birth : 199405

형식에 맞지 않게 보냈을 때

birth : 19940507

반응형