[JPA] ConstraintViolationException vs DataIntegrityViolationException

Hyeokwoo Kwon·2022년 4월 1일
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개의 댓글