스프링 통합 테스트 시 @Transactional로 DB를 롤백 시키는데 id는 여전히 건너뛰어지는 이유
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
섹션 6의 JPA 강의를 듣다가 생긴 궁금증입니다!
spring1이라는 멤버를 가입시키고 h2 콘솔을 통해 확인해보니 멤버 spring1의 id는 10이었다고 가정해보겠습니다. 이 직후에 스프링 통합 테스트에서 회원가입() 테스트 메서드를 한 번 돌리고, 다시 spring2라는 멤버를 가입시켜보면 멤버 spring2의 id 값은 11이 아닌 12가 됩니다.
JPA가 보내는 insert 쿼리에선 id가 null로 넘어가니까 id 값을 부여하는 건 결국 DB라고 생각했는데 왜 테스트 후 롤백을 해도 11번 id가 건너뛰어지는 것일까요? 이 부분의 매커니즘이 궁금합니다!
답변 2
1
안녕하세요. 전민주님, 공식 서포터즈 OMG입니다.
키 생성을 DB에 위임하는 경우 정합성을 보장하기 위해 롤백이 되더라도 다시 재사용할 수 없습니다.
참고 자료에는 MySQL의 Auto Increment기준으로 되어있지만, 자료 안의 StackOverFlow에 보면 오라클의 시퀀스(h2의 시퀀스도 동일할 것으로 예상)도 같은 이유로 트랜잭션에 독립적이라고 합니다 😀

참고) https://wisdom-and-record.tistory.com/135
감사합니다.
1
안녕하세요!
id 자동 생성 전략을 사용 할 시, 엔티티의 ID는 DB의 값을 바탕으로 주입되게 됩니다.
[롤백 설정이 된 테스트에서 인서트 쿼리가 나가는 이유]
"id 값을 부여하는 건 결국 DB라고 생각했는데" 에서 이미 답을 말씀하셨는데요!
롤백 설정을 통해 엔티티를 DB에 커밋하지는 않았지만, DB 에서 해당 엔티티의 아이디를 자동으로 생성해주는(부여해주는) 과정에서 호출된 DB의 설정 및 함수(AUTO_INCREMENT, nextval 등) 는 롤백되지 않아서 id의 값은 올라갑니다.
..
0
74
2
Unused property.....
0
98
2
project JDK is misconfigured
0
130
2
외부 API의 ID 타입(String/UUID)과 내부 도메인의 ID 타입(Long)이 불일치할 때의 설계 정석
0
82
2
단위/통합 테스트 버전충돌 문제
0
91
2
❗️springboot 4.0.2 버전 aspectj dependency 설정❗️
0
228
1
왜 컨트롤러는 변한게 없는데 새로 만든 html 파일이 뜨나요?
0
101
2
윈도우 build test오류 질문
1
102
2
테스트 관련 공부에 대한 조언을 얻고 싶습니다
0
98
2
테스트 실행 시 에러 질문
0
289
1
name을 통한 비교와 객체를 통한 비교
0
77
1
빌드 후 libs 없음
1
128
1
윈도우 gradlew.bat 에러
0
167
1
@PostMapping("/members/new")가 동작하지 않습니다
0
88
1
java static class와 kotlin class
0
77
1
스프링 DB연결
0
126
1
소요 시간
0
85
2
ddl.sql에 빨간 밑줄
1
101
2
welcome page 에러
0
180
3
잘 모르겠습니다.
0
163
2
fail을 똑같이 쳤는데 오류가 발생해요
0
156
2
index.html Welcome page
0
121
1
프로젝트 gradle-groovy ?
0
364
1
테스트코드 메서드명 한글
0
199
2





