<aside> 💡 JSON String으로 받은 데이터를 Enum으로 Controller단의 RequestDto에서 변환 및 유효성 체크를 하려면 어떻게 해야될까?
</aside>
아래와 같이 어노테이션을 통해 유효성 검증을 작성하고 싶습니다.
public class UserStatusRequestDto {
@ValidEnum(enumClass = UserStatus.class, ignoreCase = true)
private UserStatus userStatus;
private Long userId;
}
사용자 상태 UserStatus Enum이 있다고 할 때 우선 Json값을 Enum으로 받으려면 @JsonCreator로 받은 String값을 Enum에 매칭을 해줘야 합니다.
대소문자 구분 없이 String값이 Enum에 없다면 null을 반환합니다.
@Getter
@AllArgsConstructor
public enum UserStatus {
NORMAL("정상"), DORMANT("휴면"), STOP("중지"), DELETE("삭제");
private String title;
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static UserStatus findByCode(String code) {
return Arrays.stream(values())
.filter(type -> type.equals(code.toUpperCase()))
.findAny()
.orElse(null);
}
}
RequestDto에서 UserStatus enum으로 값을 받아 validation 체크를 위해서는 Custom Validator를 만들어야 합니다.
Enum 유효성 체크를 위한 @ValidEnum 어노테이션을 생성해줍니다.
@Constraint(validatedBy = EnumValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidEnum {
String message() default "Invalid value. This is not permitted.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<? extends java.lang.Enum<?>> enumClass();
boolean ignoreCase() default false;
}
message, groups, payload 3개의 메소드는 필수로 정의해야 합니다.
message() : 제약 조건 위배 시 생성할 에러 메시지를 정의합니다.
@ValidEnum 어노테이션을 사용해서 오류가 났을 때 "Invalid value. This is not permitted." 메시지를 출력해줍니다.group() : 상황별 validation 제어를 위해 사용됩니다.payload() : 심각도를 나타냅니다. group()보다 좀 더 세밀하게 제어할 수 있지만 거의 사용하지 않습니다.enumClass() : 제약할 Enum 클래스를 지정합니다.ignoreCase() : 대소문자 구분 여부를 결정합니다.