JPA 엔티티에 대한 테스트 메소드를 작성하다가, 예외가 발생하는 코드를 그냥 실행했을 때는 ConstraintViolationException
이 발생하고, assertThatThrownBy().inInstanceOf()
을 이용해 예외의 타입을 확인했을 때는 DataIntegrityViolationException
으로 변하는 일을 겪었다.
두 예외가 어떤 차이를 가지는지 궁금해서 찾아봤고, 여기에는 찾아보면서 알게 된 내용을 간단하게 정리했다.
여러 가지 상황에서 같은 일이 일어났지만, 여기에서는 내가 겪은 상황이었던 unique constraint에 반하는 중복된 데이터를 삽입하려고 할 때 발생한 예외에 대해서 정리했다.
javax.validation.ConstraintViolationException
RuntimeException
을 상속하는 unhandled exception이다.org.springframework.dao.DataIntegrityViolationException
RuntimeException
을 상속하는 unhandled exception이다.PersistenceExceptionTranslationPostProcessor
가 테스트 도중 발생하는 ConstraintViolationException
을 스프링이 이해할 수 있는 예외인 DataIntegrityViolationException
으로 변환한다.ConstraintViolationException
이,DataIntegrityViolationException
이 걸러지는 것으로 보인다.(추가)
javax.validation.constraints.NotNull 어노테이션으로 not null 처리한 필드에 null이 들어가는 경우에도 ConstraintViolationException
이 발생하는데, 이 경우에는 예외를 거를 때에도 ConstraintViolationException
으로 처리해야 한다. hibernate를 거치지 않아서 그런 걸까...?