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

Seunghoon Choi님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

기본 키 매핑

SEQUENCE 전략 초기값과 호출 횟수 문의드립니다.

해결된 질문

작성

·

797

8

안녕하세요. 강의 열심히 듣고 있는 주니어 개발자입니다.

강의 내용 똑같이 수행했으나 시퀀스 값이 다른 점이 있어 문의드립니다.

  1. (33:05) 부분에서 시퀀스 전략 속성값 initialValue=1, allocationSize=50 으로 설정했을시 persist 이전에 초기값이 -49라고 나오지만 제 환경에서는 초기값이 1로 나옵니다.

     

    H2 DB 2.1.214, Hibernate 5.6.10을 사용중인데 혹시 버전이 달라서 그런걸까요?


    로그에는 시퀀스에 대한 call next value를 호출하지 않으며 제 생각에도 initialValue=1로 명시되어 있기 때문에 초기값이 1인게 정상인 것 같은데 제가 놓치는 부분이 있는지 문의드립니다.

     

  2. 위 질문의 연장선으로 persist 1번 수행시 call next value 수행 결과는 아래와 같은데요.

     

    DB 시퀀스 자체의 increment값이 50이어서 51이 되는것은 이해하였습니다.

     

    JPA에서 51번째 데이터까지는 DB 시퀀스를 참조하지 않고 메모리에서 꺼내와야하는데 persist로 객체를 2번 저장시 아래와 같이 call next value가 2번 호출이 되고 시퀀스 값은 101이 됩니다.

    (33:43) 여기서 2번 호출 되는 이유가 JPA 애플리케이션에서 사용하는 allocationSize가 50이기 때문에 추후 자신이 사용할 메모리 시퀀스값을 선점하기 위해서라고 이해했는데요. (DB에는 51로 증가시켜놓고, 2부터 51까지 사용하기 위함)

     

    이렇게 되면 제 경우에는 2를 사용하기 위해서 시퀀스 값을 101로 올려놓는 이상한 동작을 하는 것인데 이해가 가지 않습니다.

     

    또한 위와 같이 52번째 객체 저장시 call next value가 한번 더 수행되어 시퀀스 값은 151이 됩니다.

    의도한대로 작동은 하지만 시퀀스가 한단계씩 밀려서 작동한다는 것이 이해가 가지 않습니다.

     

답변 2

2

고민하던 내용인데 내용 공유 감사합니다! :)

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. Seunghoon Choi님

자바 코드의 시퀀스와, DB의 시퀀스 둘다 같은 값으로 설정해야 합니다.

테이블의 시퀀스를 지우고 자바 코드의 엔티티와 똑같이 맞추어 실행해보시겠어요?

감사합니다. 질문할 시간에 직접 해보는게 나았겠네요 ㅜ
단순한 버전 차이인 것 같아요.
버전 맞춰서 해보니까 동일하게 나옵니다. ㅎㅎ

imageH2 1.4.200 버전까지는 초기값이 -49로 설정되고

image참고) CURRENT_VALUE

 

imageH2 2.0.202 버전부터는 초기값이 1로 설정되네요.

image참고) BASE_VALUE

관련 수정사항
https://github.com/h2database/h2database/commit/85225545497538e9a7d86075cd342fa98cf33205

추가)
call next value 쿼리와 실행값이 동일하게 보이는 것으로 보아 실제 시퀀스값이 변경된 것이 아니라
h2 2.x 버전부터 웹콘솔에서 표시해주는 값이 변경된 것 같습니다.
작동 원리는 강의 내용과 동일합니다!

김영한님의 프로필 이미지
김영한
지식공유자

Seunghoon Choi님 좋은 내용 공유해주셔서 감사합니다^^