PHpullh
학습 라이브러리/Java/검증 패턴과 Validation

JAVA · 예외처리

검증 패턴과 Validation

입력 검증을 체계적으로 수행하는 패턴과 에러 수집 전략입니다.

예외처리중급validation검증에러수집Validator

핵심 설명

입력 검증을 체계적으로 수행하는 패턴과 에러 수집 전략입니다.

Java code

import java.util.*;

public class ValidationPattern {
    // 검증 결과를 수집하는 패턴
    record ValidationResult(boolean valid, List<String> errors) {
        static ValidationResult ok() {
            return new ValidationResult(true, List.of());
        }
        static ValidationResult fail(List<String> errors) {
            return new ValidationResult(false, List.copyOf(errors));
        }
    }

    // 검증기 합성
    interface Validator<T> {
        Optional<String> validate(T value);

        static <T> ValidationResult validateAll(T value,
                List<Validator<T>> validators) {
            List<String> errors = validators.stream()
                .map(v -> v.validate(value))
                .filter(Optional::isPresent)
                .map(Optional::get)
                .toList();
            return errors.isEmpty()
                ? ValidationResult.ok()
                : ValidationResult.fail(errors);
        }
    }

    record UserForm(String name, String email, int age) {}

    public static void main(String[] args) {
        List<Validator<UserForm>> validators = List.of(
            form -> form.name().isBlank()
                ? Optional.of("이름은 필수입니다") : Optional.empty(),
            form -> !form.email().contains("@")
                ? Optional.of("이메일 형식이 올바르지 않습니다") : Optional.empty(),
            form -> form.age() < 0 || form.age() > 150
                ? Optional.of("나이가 유효하지 않습니다") : Optional.empty()
        );

        UserForm form = new UserForm("", "invalid", -1);
        ValidationResult result = Validator.validateAll(form, validators);

        if (!result.valid()) {
            result.errors().forEach(e -> System.out.println("- " + e));
        }
    }
}

학습 팁

모든 검증 에러를 수집하면 사용자가 한 번에 수정할 수 있습니다. 첫 번째 에러에서 멈추는 것보다 UX가 좋습니다.

주의할 점

검증 로직을 여러 곳에 분산시키면 일관성이 떨어집니다. 중앙화된 검증기를 만들고 재사용하세요.

자주 묻는 질문

검증 패턴과 Validation란 무엇인가요?

입력 검증을 체계적으로 수행하는 패턴과 에러 수집 전략입니다.

검증 패턴과 Validation 학습 시 주의할 점은 무엇인가요?

검증 로직을 여러 곳에 분산시키면 일관성이 떨어집니다. 중앙화된 검증기를 만들고 재사용하세요.