인프런 커뮤니티 질문&답변

전민주님의 프로필 이미지

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 통합 테스트 시 @Transactional로 DB를 롤백 시키는데 id는 여전히 건너뛰어지는 이유

해결된 질문

24.01.21 10:51 작성

·

499

0

[질문 템플릿]
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님의 프로필 이미지

2024. 01. 21. 11:16

안녕하세요. 전민주님, 공식 서포터즈 OMG입니다.

키 생성을 DB에 위임하는 경우 정합성을 보장하기 위해 롤백이 되더라도 다시 재사용할 수 없습니다.

참고 자료에는 MySQL의 Auto Increment기준으로 되어있지만, 자료 안의 StackOverFlow에 보면 오라클의 시퀀스(h2의 시퀀스도 동일할 것으로 예상)도 같은 이유로 트랜잭션에 독립적이라고 합니다 😀

 

image

 

참고) https://wisdom-and-record.tistory.com/135

감사합니다.

1

Kim DongKyun님의 프로필 이미지

2024. 01. 21. 11:15

안녕하세요!

 

id 자동 생성 전략을 사용 할 시, 엔티티의 ID는 DB의 값을 바탕으로 주입되게 됩니다.

 

[롤백 설정이 된 테스트에서 인서트 쿼리가 나가는 이유]

 

"id 값을 부여하는 건 결국 DB라고 생각했는데" 에서 이미 답을 말씀하셨는데요!

 

롤백 설정을 통해 엔티티를 DB에 커밋하지는 않았지만, DB 에서 해당 엔티티의 아이디를 자동으로 생성해주는(부여해주는) 과정에서 호출된 DB의 설정 및 함수(AUTO_INCREMENT, nextval 등) 는 롤백되지 않아서 id의 값은 올라갑니다.