본문 바로가기
Today I Learned 2024. 6. 17.

(24.06.17)[10주차] Validator 객체 생성과 테스트 코드에서의 활용

Validation을 사용하면 단순하게 예외가 발생되고 던져지는 것 뿐만아니라, Validator라는 객체로 Validation적용이 된 필드를 검증할 수도 있다.

 

테스트 코드를 작성하는 과제에서 사용하기 위해 미리 찾아보고 학습한 것으로 정리


 

Validator 객체 & Validator로 테스트코드에서의 검증

  • 엔터티 또는 DTO에서의 필드를 Spring Boot의 Validation의 Annotation을 통해 코드가 작성이 되었고, @Validated와 @Valid를 통해서 필드의 유효성이 코드 진행에서 검사가 진행이 될 수 있음
    • 그렇다면, 이것을 따로 검사할 수 있는 방법, 그리고 이 방법을 통해서 Validation에 대해 필드의 검증을 테스트 코드에서 쓸 수 있는 방법으로 Validator 객체를 사용할 수 있고 이를 정리

Validation 적용 DTO 예시

public class FeedReqDto {

    @NotBlank
    private String contents;
}
  • @NotBlank 의 Validastion  Annotation으로 contents 필드는 빈 칸으로 Request 받을 수 없음

 

Validator 객체

  • 데이터 입력값에 유효성을 다시 검증하기 위해 필요한 객체

 

Validator 객체 생성

  • Validation을 사용할 때 사용되었던, Java의 Bean Validastion API 를 활용해서 생성
  • 생성  Flow
    1. Bean Validastion API 를 통해서 ValidationFactory를 생성
    2. ValidationFactory를 사용해서 Validator 객체 가지고오기
   @BeforeEach
    void setUp() {
        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
        validator = validatorFactory.getValidator();
    }
  • Test Code 중 Validation 유효성 검사를 위해서 BeforeEach 를 통해 검증을 할 Validator객체를 지정하는 setUp() 

.buildDefaultValidationFactory()

  • Validation  클래스에서 ValidationFactory를 생성할 때 필요한 메서드

.getValidator()

  • Validation Factory에서 Validator객체를 생성할 때 필요한 메서드

 

Validator로 검증하기

// when
...
Set<ConstraintViolation<FeedReqDto>> validatedSet = validator.validate(feedReqDto);
...
  • Test Code에서 when에서 검증하는 코드

.validate(검증할 객체)

  • validator가 해당 객체를 검증할 때 필요한 메서드
  • 검증을 끝난 다음에는 ConstraintViolation<T> 인터페이스 구현체가 검증할 객체의 위반 사항들을 Set 자료구조료 반환
    • 객체의 각 필드에 적용된 Validation Annotation들(@NotBlank, @Size 등등) 에 관한 위반정보를 담고 있음

 

Test Code에서의 검증

// then
...
assertEquals("contents", violation.getPropertyPath().toString(), "@NotBlank Validation 적용이 안되었습니다.");
...
  • 위 코드에서의 violation은 violationSet 중 하나로 가정

ConstraintViolation의 주요 메서드

  • getPropertyPath() : 유효성 검사 위반 속성의 경로=필드 을 반환
    • 위에선 "contents' 필드가 반환 되고, assertEquals로 검증을 진행하는 코드
    •  Path 타입이 때문에, toString() 으로 캐스팅 해주면, 필드 이름을 얻을 수 있음
  • getMessage() : 유효성 검사 위반되었을 때, 위반한 메시지를 반환
    • @NotBlank(message = "해당 필드를 작성해주세요") 이렇게 커스텀 해놓는다면, getMessage()로는 "해당 필드를 작성해주세요"  메시지 String반환
  • getInvalidValue() : 유효성 검사 위반된 속성의 그 값을 반환
    • Object타입으로 반환