티스토리 뷰

회원가입을 진행하는데 회원이름이 겹치지 않게 unique 조건을 걸어두었습니다.

 

회원 엔티티
회원가입서비스

 

그리고 간단히 중복되는 이름으로 가입하는 테스트를 만들어 중복될 경우 어떤 Exception이 발생하는지 해보았습니다.

결과는 아무 예외도 일어나지 않았습니다.

쿼리를 보면 두번의 회원가입 모두 정상처리가 되어있습니다.

 

??? 분명히 중복인데 ???

 

unique 설정이 잘못 되었나 싶어 MySQL DB를 확인해 보았습니다.

member_name 기준으로 Unique가 True인 인덱스가 잘 생성되어 있습니다.

 

 

그렇다면 문제는 JPA에 있다는 것

 

테스트에서 @Transaction을 제거한 결과

DataIntegrityViolationException이 발생하였습니다.

 

 

객체를 저장하는 JPA 영속성 컨텍스트에서는 unique속성에 대한 자체 검증은 하지 않고 테스트시 RollBack에 의해 DB에 쿼리가 적용이 되지 않으면서 예외가 발생하지 않았던것 입니다.

생각해보면 당연한데 테스트시 RollBack을 위해 당연시 사용하던 @Transaction을 무분별 하게 사용하면 안되겠습니다.

 

그렇다면 테스트는 RollBack을 해야하는데 어떻게 해결할까


해결방법

  1. 영속성 Flush
  2. @Transaction 제거

두번째 방법은 메서드 전체의 트랜잭션 처리가 불가능하기때문에 첫번째 방법을 사용합니다.

 

영속성 컨텍스트 Flush

saveAndFlush로 DB에 바로 Flush하는 것입니다.

지금은 로직이 단순해서 save와 flush를 동시에 하지만 여러 로직을 추가하면 테스트 마지막에 flush()를 호출하면 됩니다.


결론

JPA 속성을 잘 생각하며 개발하자

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함