티스토리 뷰
회원가입을 진행하는데 회원이름이 겹치지 않게 unique 조건을 걸어두었습니다.
그리고 간단히 중복되는 이름으로 가입하는 테스트를 만들어 중복될 경우 어떤 Exception이 발생하는지 해보았습니다.
결과는 아무 예외도 일어나지 않았습니다.
쿼리를 보면 두번의 회원가입 모두 정상처리가 되어있습니다.
??? 분명히 중복인데 ???
unique 설정이 잘못 되었나 싶어 MySQL DB를 확인해 보았습니다.
member_name 기준으로 Unique가 True인 인덱스가 잘 생성되어 있습니다.
그렇다면 문제는 JPA에 있다는 것
테스트에서 @Transaction을 제거한 결과
DataIntegrityViolationException이 발생하였습니다.
객체를 저장하는 JPA 영속성 컨텍스트에서는 unique속성에 대한 자체 검증은 하지 않고 테스트시 RollBack에 의해 DB에 쿼리가 적용이 되지 않으면서 예외가 발생하지 않았던것 입니다.
생각해보면 당연한데 테스트시 RollBack을 위해 당연시 사용하던 @Transaction을 무분별 하게 사용하면 안되겠습니다.
그렇다면 테스트는 RollBack을 해야하는데 어떻게 해결할까
해결방법
- 영속성 Flush
- @Transaction 제거
두번째 방법은 메서드 전체의 트랜잭션 처리가 불가능하기때문에 첫번째 방법을 사용합니다.
영속성 컨텍스트 Flush
saveAndFlush로 DB에 바로 Flush하는 것입니다.
지금은 로직이 단순해서 save와 flush를 동시에 하지만 여러 로직을 추가하면 테스트 마지막에 flush()를 호출하면 됩니다.
결론
JPA 속성을 잘 생각하며 개발하자
'Spring' 카테고리의 다른 글
앱 푸시알림동작 원리와 FCM(Firebase Cloud Messaging)을 알아보자 (0) | 2023.03.26 |
---|
- Total
- Today
- Yesterday
- MessageBroker
- Kubernetes
- Stomp Kafka
- Spring RabbitMQ
- Spring 채팅
- Spring 대댓글
- Cache
- Spring WebSocket
- springboot
- authorization
- loadbalancing
- Spring
- 푸시알림동작원리
- Bcypt
- spring orphan
- bcrypt
- Spring Stomp
- FCM
- Vmmem
- nativeQuery
- 로컬캐시
- 게시판 채팅
- Stomp RabbitMQ
- 웹소켓 채팅
- ERD설계
- Security
- ChattingApp
- Authentication
- Flutter
- Vmmem종료
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |