반응형
보통 기본적인 유효성 검증은 Validation 어노테이션들로 설정한다.
만약 더 섬세한 유효성 검증이 필요할때는 자신만에 어노테이션을 만들어 설정할 수 있다.
만약 연락처 필드의 유효성 검증(PhoneValidator)을 만든다고 가정해보겠다.
// @Phone 어노테이션
@Inherited
@Documented
@Repeatable
@Constraint(validatedBy = PhoneValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@ReportAsSingleViolation
public @Interface Phone {
Stirng message() default "please input a phone number.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
boolean onlyNumber() default false; // true일땐 숫자 검증
}
// @Phone 어노테이션 구현체
public class PhoneValidator implements ConstraintValidator<Phone, String> {
private boolean onlyNumber = false;
@Override
public void initialize(Phone phone) {
this.onlyNumber = phone.onlyNumber();
}
@Override
public boolean isValid(String input, ConstraintValidatorContext cxt) {
if (input == null) return false;
if (this.onlyNumber) {
return input.matches("[0-9]*");
} else {
return input.matches("[0-9()-]*");
}
}
}
// 사용법
@Phone(onlyNumber=true)
private String phone;
사용한 어노테이션들은 다음과 같다
- @Constraint : Validation을 수행할 구현체를 설정한다.
- @Inherited : 자식클래스가 어노테이션을 상속 받을 수 있다.
- @Documented : 문서에도 어노테이션의 정보가 표현된다.
- @Repeatable - 반복적으로 어노테이션을 선언할 수 있게 한다.
- @ReportAsSingleViolation : 여러 어노테이션을 상속해서 사용할 경우, 메세지를 하나만 사용하도록 설정
- @Retention : 어노테이션이 적용되는 범위를 설정한다.
- RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해서 참조가 가능하다.
- RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효하다.
- RetentionPolicy.SOURCE : 어노테이션 정보는 컴파일 이후 없어진다. - @Target : 어노테이션이 사용될 위치를 설정한다.
- ElementType.PACKAGE : 패키지 선언 시 사용
- ElementType.TYPE : 타입 선언 시 사용
- ElementType.CONSTRUCTOR : 생성자 선언 시 사용
- ElementType.FIELD : 멤버 변수 선언 시 사용
- ElementType.METHOD : 메소드 선언 시 사용
- ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언 시 사용
- ElementType.LOCAL_VARIABLE : 지역 변수 선언 시 사용
- ElementType.PARAMETER : 매개 변수 선언 시 사용
- ElementType.TYPE_PARAMETER : 매개 변수 타입 선언 시 사용
- ElementType.TYPE_USE : 타입 사용 시 사용
반응형
'Spring' 카테고리의 다른 글
스프링 배치(Spring Batch)란? 소개 및 예제 (0) | 2022.02.22 |
---|---|
H2 Database를 활용해 In-memory Database 사용하기 (0) | 2022.02.07 |
Junit 테스트 시 테스트 목록 보이게 하기(IntelliJ IDEA) (0) | 2021.12.19 |
Spring Boot + Prometheus + Grafana를 이용한 모니터링(3/3) (0) | 2021.12.14 |
Spring Boot + Prometheus + Grafana를 이용한 모니터링(2/3) (0) | 2021.12.14 |