728x90
문제
String 타입의 필드를 특정 형식으로 받아오고 싶은데 ....
이 문제를 Controller 에서 처리 하기엔 코드가 복잡해 졌다.
@Constraint 어노테이션을 활용하여 커스텀 Validatation을 만들자
Controller 에서 dto를 요청으로 받아올때 String 값을
yyyy-MM-dd HH:mm
이런 형식으로 받아오고 싶었다.
1. 어노테이션 만들기
// CustomDateTimeFormat.java
@Constraint(validatedBy = DateTimeFormatValidator.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomDateTimeFormat {
String message() default "올바른 날짜 및 시간 형식이 아닙니다.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String pattern() default "yyyy-MM-dd HH:mm";
}
2. 제약조건을 처리할 Validator 클래스를 만든다
요청으로 받아올 value 와 특정패턴과 일치하는지 확인하는 로직을 만들어주자
// DateTimeFormatValidator.java
public class DateTimeFormatValidator implements ConstraintValidator<CustomDateTimeFormat, String> {
private String pattern;
@Override
public void initialize(CustomDateTimeFormat constraintAnnotation) {
this.pattern = constraintAnnotation.pattern();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return false; // null 체크
}
return value.equals(pattern);
}
}
Validator 클래스는 ConstraintValidator<어노테이션 이름, String> 을 구현해야 한다.
ConstraintValidator 에서 initialize 메서드에서는 어노테이션에서 설정한 속성을 가져오고 isValid 메서드에서 실제 유효성 검사 로직을
구현하면된다.
검사하는 로직에선 equals , matcher 과 같이 요청 받은값과 내가 만든패턴을 비교해서 boolean 값으로 응답해준다.
실패할 경우
String message() default "올바른 날짜 및 시간 형식이 아닙니다.";
위에서 만든 message 값이 나타나게 해준다.
3. 사용방법
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class CreateEventRequestDto {
@NotNull(message = "제목을 입력해 주세요.")
@Size(max = 100,message = "제목은 100자를 넘을 수 없습니다.")
private String eventName;
@CustomDateTimeFormat
private String couponDeadline;
private int discountRate;
private int discountPrice;
}
어노테이션을 사용하면 적용된다.
728x90
'개-발 > Java + Spring + Kotlin' 카테고리의 다른 글
[JAVA] CountDownLatch 스레드 대기 시키기 (2) | 2024.01.05 |
---|---|
[Spring] 선착순 이벤트 구현 ( 동시성 Pessimistic Lock) (3) | 2024.01.04 |
[Spring] AOP 를 활용한 중복요청 방지 (따닥방지) (0) | 2023.12.19 |
[JAVA] Stream 이해 (Parallelism 병렬처리) (0) | 2023.06.12 |
[JAVA] Stream 이해 (Lazy 지연연산) (0) | 2023.06.12 |