[JPA] ConstraintViolationException vs DataIntegrityViolationException

Hyeokwoo Kwon·2022년 4월 1일


JPA 엔티티에 대한 테스트 메소드를 작성하다가, 예외가 발생하는 코드를 그냥 실행했을 때는 ConstraintViolationException이 발생하고, assertThatThrownBy().inInstanceOf()을 이용해 예외의 타입을 확인했을 때는 DataIntegrityViolationException으로 변하는 일을 겪었다.
두 예외가 어떤 차이를 가지는지 궁금해서 찾아봤고, 여기에는 찾아보면서 알게 된 내용을 간단하게 정리했다.

여러 가지 상황에서 같은 일이 일어났지만, 여기에서는 내가 겪은 상황이었던 unique constraint에 반하는 중복된 데이터를 삽입하려고 할 때 발생한 예외에 대해서 정리했다.

ConstraintViolationException

  • 문서
  • 패키지: javax.validation.ConstraintViolationException
  • RuntimeException을 상속하는 unhandled exception이다.
  • 제약 조건이 위배되었을 때 발생하는 예외이다.

DataIntegrityViolationException

  • 문서
  • 패키지: org.springframework.dao.DataIntegrityViolationException
  • RuntimeException을 상속하는 unhandled exception이다.
  • 데이터의 삽입/수정이 무결성 제약 조건을 위반할 때 발생하는 예외이다.
  • hibernate 단에서 발생하는 예외이다.

내부에서 일어난 일

  • PersistenceExceptionTranslationPostProcessor가 테스트 도중 발생하는 ConstraintViolationException을 스프링이 이해할 수 있는 예외인 DataIntegrityViolationException으로 변환한다.
  • 예외를 거르지 않았을 때는 ConstraintViolationException이,
    예외를 거르려고 할 때는 변환된 DataIntegrityViolationException이 걸러지는 것으로 보인다.

참고한 글


(추가)
javax.validation.constraints.NotNull 어노테이션으로 not null 처리한 필드에 null이 들어가는 경우에도 ConstraintViolationException이 발생하는데, 이 경우에는 예외를 거를 때에도 ConstraintViolationException으로 처리해야 한다. hibernate를 거치지 않아서 그런 걸까...?

0개의 댓글