ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java Bean Validation
    STUDY/백엔드 2021. 5. 7. 16:28

    Bean Validation 이란?

    Bean Validation은 JavaBean 유효성 검증을 위한 메타데이터 모델과 API에 대한 정의이며 여기서 언급하고 있는 JavaBean은 직렬화 가능하고 매개변수가 없는 생성자를 가지며, Getter 와 Setter Method를 사용하여 프로퍼티에 접근이 가능한 객체를 의미한다.

     

     

    각 계층마다 데이터 검증 로직이 추가되면 코드 중복이 심하고, 검사 로직 추적이 어려우며 애플리케이션이 복잡해진다. 그래서 Domain Model에 @Notnull, @Min, @Max와 같은 어노테이션을 사용하여 메타데이터를 정의하고, 이를 통해 JavaBean의 유효성을 검증한다.

     

     

    Bean Validation을 실제 동작하도록 구현한 Hibernate Validator를 사용한다. Hibernate Validator를 사용하기 위해서는 pom.xml에 maven을 추가해줘야한다.

    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.7.Final</version>
    </dependency>

     

    제약 위반 메시지에서 동적 표현을 평가하기 위해 Jakarta 표현 언어의 구현에 대한 maven 종속성을 pom.xml 파일에 추가해준다.

    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.0</version>
    </dependency>

     

    [예시]

     

    유효성 검증 객체

    public class Person implements ValidationCheckable{
        @Length(max = 4)
        @NotBlank
        private String name;

        @NotNull
        private int age;

        @NotNull
        private String email;
    }

     

    유효성 검증 수행

    public interface ValidationCheckable {
        // 유효성 검사를 수행하는 Validator를 생성
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
       

       // Validator의 validate 메소드에 검사할 객체를 전달하고,
       // 그 결과를 Set<ConstraintViolation<?>> (제약조건 위반 Set)으로 받는다.

        @JsonIgnore
        default boolean isInvalid() {
            Set<ConstraintViolation<ValidationCheckable>> violations = validator.validate(this);
            return !violations.isEmpty();
        }

        @JsonIgnore
        default String getInvalidMessage() {
            Locale.setDefault(Locale.US);  // locale 설정에 따라 에러 메시지가 달라진다.

            Set<ConstraintViolation<ValidationCheckable>> violations = validator.validate(this);
            StringBuilder message = new StringBuilder();
            violations.forEach(violation -> message.append(String.format("invalid field : %s, message: %s. %n",  violation.getPropertyPath(), violation.getMessage())));
            return message.toString();
        }
    }

     

    beanvalidation.org/2.0/spec/#builtinconstraints

    docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-declaring-bean-constraints

    'STUDY > 백엔드' 카테고리의 다른 글

    Apache MPM  (0) 2022.01.13
    실제 Client IP 구하기  (0) 2021.06.25
    @Transactional  (0) 2021.05.07
    람다 표현식  (0) 2021.05.06
    Optional  (0) 2021.05.06
Designed by Tistory.