<aside> 💡 JSON String으로 받은 데이터를 Enum으로 Controller단의 RequestDto에서 변환 및 유효성 체크를 하려면 어떻게 해야될까?

</aside>

아래와 같이 어노테이션을 통해 유효성 검증을 작성하고 싶습니다.

public class UserStatusRequestDto {
    @ValidEnum(enumClass = UserStatus.class, ignoreCase = true)
    private UserStatus userStatus;

    private Long userId;
}

1. JSON String → Enum 변환

사용자 상태 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);
    }
}

2. Custom Validator 만들기

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개의 메소드는 필수로 정의해야 합니다.