개인 프로젝트를 진행중, 유저의 전화번호 필드 검증 테스트를 하는데 오류가 발생했다.
@Import(ValidationConfig.class)
class UserRepositoryTest extends TestcontainersConfiguration {
@Autowired
private UserRepository userRepository;
@Autowired
Validator validator;
@BeforeEach
void setUp() {
userRepository.deleteAll();
}
@Test
@DisplayName("DB에 유저 save 실패 - 전화번호 기입 시 \"-\" 기호 미기입")
void saveFailByWrongTel() {
// given
User user = User.builder()
.nickname("sonny")
.tel("01011112222") // 하이픈 미기입
.pw("1234")
.email("asdfas142@naver.com")
.visibility(VisibilityStatus.FRIENDS_ONLY)
.build();
// when
Set<ConstraintViolation<User>> violations = validator.validate(user);
// then
assertThat(violations).isNotEmpty();
assertThat(violations).anyMatch(violation -> violation.getMessage().equals("전화번호 형식은 XXX-XXXX-XXXX이어야 합니다."));
}
}
위와 같은 테스트코드인데, User 엔티티의 tel(전화번호) 필드에
@Pattern(regexp = "^\\d{3}-\\d{4}-\\d{4}$", message = "전화번호 형식은 XXX-XXXX-XXXX이어야 합니다.")
와 같은 정규식표현을 걸어주었다.
근데 테스트 실행을 하니
Error creating bean with name 'validator' defined in class path resource [com/sns/gobong/config/ValidationConfig.class]: Unable to create a Configuration, because no Jakarta Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
와 같은 오류가 발생했다. 오류의 내용을 읽어보면, Jakarta Bean Validation provider를 찾을 수 없으니 Hibernate Validator 와 같은 provider를 클래스패스에 추가하라는 말이었다.
여기서 hibernate validator를 왜 추가 해야하지? 라는 생각이 들 수 있다.
간단히 정리해보면,
Jakarta Bean Validation는 API는 인터페이스와 기본적인 어노테이션만을 정의한다. 실제 유효성 검사는 이 인터페이스를 구현하는 구현체에 의해 수행이 된다. 이런 구현체 중 가장 널리 사용되는 구현체가 바로 Hibernate Validator이다.
즉, @NotNull, @Size, @Pattern 등의 유효성 검사 어노테이션은 Jakarta Bean Validation에 정의 되어있고, 이런 어노테이션이 실제로 작동하려면 이를 해석하고 유효성 검사를 수행하는 구현체가 Hibernate Validator라는 말이다.
그럼 Hibernate Validation를 dependency에 추가해보자
build.gradle으로 이동하고,
implementation group: 'org.hibernate', name: 'hibernate-validator', version: '8.0.0.Final'
dependencies 블록안에 위 스크립트를 추가해준다.
해당 스크립트는 mvn repository에서 찾을 수 있었다.
의존성을 가져오고 gradle refresh 후에 실패했던 테스트를 다시 실행하니,
테스트에 성공하였다.
'Trouble Shoting' 카테고리의 다른 글
gradle jib 플러그인으로 이미지 빌드할 때 발생한 에러 (Cannot run program "docker-credential-desktop": error=2, No such file or directory) (1) | 2024.10.11 |
---|---|
쿼리 최적화 및 MultipleBagFetchException 해결하기 (0) | 2024.09.20 |