Spring/Java

[Spring] Custom Validation

java곰 2024. 6. 27. 23:33

Enum를 사용하여 enum에서 특정 값은 post 요청 시 사용되는 안되는 값이 있어서 해당 값으로 post 요청이 들어오면 예외처리를 하는 custom validation을 구현했습니다.

@Getter
@RequiredArgsConstructor
public enum TransactionAction {
    TOTAL("TOTAL","전체"),
    GIVING("GIVING", "준"),
    RECEIVING("RECEIVING", "받은");

    private final String key;
    private final String title;
}

여기서 TOTAL을 예외처리 할 겁니다!

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ActionValidator.class)
public @interface ActionValid {
    String message() default "잘못된 거래 종류";

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

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

어노테이션을 사용하여 validation할 예정이므로 인터페이스를 만들어줍니다 default message를 적어줘서 호출부에서는 더 깔끔하게 사용할 수 있습니다. 또 field에서 사용할 것이므로 Field만 적어놨습니다. 만약 더 범용적인 어노테이션을 만들고싶으면 ElementType에서 원하는 위치를 찾아서 사용하시면됩니다.

public class ActionValidator implements ConstraintValidator<ActionValid, TransactionAction> {
    @Override
    public boolean isValid(TransactionAction action, ConstraintValidatorContext context) {
        if (action == null) {
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("action is required").addConstraintViolation();
            return false;
        }
        return !action.equals(TransactionAction.TOTAL);
    }
}

실제 구현부입니다. ConstraintValidator를 사용하여 validation을 진행했습니다. custom validation을 사용하여 추가로 NotNull같은 어노테이션이 안먹어서 같이 null check도 해주었습니다!

내용만 보면 금방 하는 내용인데 테스트를 계속 서버에서 해서 20분은 잡아 먹었네요....

다들 스웨거 사용하실 때 url 한 번씩 봐주세요..!