[java] Hibernate Validator를 사용하여 객체 그래프 유효성 검사를 수행할 수 있나요? 가능하다면 어떻게 구현하는 건가요?

객체 그래프 유효성 검사를 구현하기 위해 다음의 단계를 따를 수 있습니다:

  1. javax.validation 패키지에서 제공하는 어노테이션들을 사용하여 각 객체의 유효성 규칙을 정의합니다. 예를 들어, @NotNull, @Size, @Pattern 등의 어노테이션을 사용하여 필드의 null 체크, 길이 체크, 패턴 매칭 등의 유효성 검사 규칙을 정의할 수 있습니다.

  2. 객체 그래프 내에서 유효성 검사를 수행할 클래스에 @Valid 어노테이션을 추가합니다. 이 어노테이션은 해당 클래스 내부의 객체 그래프를 유효성 검사 대상으로 지정합니다.

  3. 유효성 검사를 수행할 때 Validator 인터페이스를 사용합니다. ValidatorFactory를 이용하여 Validator 객체를 생성한 후, validate() 메서드를 호출하여 객체 그래프를 검사합니다. 유효하지 않은 경우, ConstraintViolation 객체를 통해 오류 정보를 확인할 수 있습니다.

아래는 Hibernate Validator를 사용하여 객체 그래프 유효성 검사를 수행하는 예제 코드입니다:

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

public class Main {
    public static void main(String[] args) {
        // Validator 팩토리 생성
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        // 객체 그래프 생성
        User user = new User("John", 25, null);

        // 유효성 검사 수행
        Set<ConstraintViolation<User>> violations = validator.validate(user);

        for (ConstraintViolation<User> violation : violations) {
            System.out.println(violation.getPropertyPath() + ": " + violation.getMessage());
        }
    }
}

class User {
    @NotNull
    private String name;

    @Min(18)
    private int age;

    @Valid
    private Address address;

    // 생성자, Getter/Setter 등 생략
}

class Address {
    @NotBlank
    private String city;

    @NotBlank
    private String street;

    // 생성자, Getter/Setter 등 생략
}

위의 예제에서는 User 클래스와 Address 클래스의 유효성을 검사하고 있습니다. User 클래스의 address 필드에는 @Valid 어노테이션을 추가하여 해당 객체 그래프를 유효성 검사 대상으로 설정하였습니다.

유효성 검사를 수행한 후, Set<ConstraintViolation<User>> 객체에 저장된 오류 정보를 출력하는 예제입니다.