강의

멘토링

로드맵

Inflearn brand logo image

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

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

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

기본 키 매핑

allocationSize에 대해 질문드립니다.

작성

·

228

1

1. 처음 em.persist()를 할떄 allocation했던거 만큼의 시퀀스 값을 미리 가져와서 메모리에 값을 저장해놓는다. 이떄 1부터 50의 값이 메모리에 저장된다.

2. db에 시퀀스의 값(현재값)은 50까지 줬으니 51로 되어있다.

3. 이후 em.persist()를 하면 메모리에 있는 값이 사용되고, 만약 50까지 다 사용하고 나서 em.persist()를하게 되면 51부터 다시 allocation했던거 만큼의 시퀀스 값을 미리 가져와서 메모리에 값을 저장해놓는다. 이때 51부터 100의 값이 메모리에 저장된다. db에 시퀀스의 값(현재값)은 100까지 줬으니 101로 되어있다.

 

이러한 동작 과정으로 이해를 했는데요. 이렇게 이해하는게 맞을까요?

 

+ 근데 그럼 여쭤보고 싶은게

  1. em.persist()를 한번만 할 경우, call next value for MEMBER_SEQ5를 한번만 호출하고

    image.png

    이런식으로 되어있지만, em.persist()를 2번 이상으로 하게되면, call next value for MEMBER_SEQ5를 두번 호출하고

    image.png

    이런식으로 되더라구요... 그 이유를 도무지 모르겠습니다..

     

답변 4

0

안녕하세요. 오리쉐리님, 공식 서포터즈 y2gcoder입니다.

혹시 main 메서드를 두 번 실행하셨다면, 이 때는 애플리케이션이 2번 구동된 상태로 이해하시면 좋을 것 같습니다. DB 입장에서는 애플리케이션이 2번 실행하면서 시퀀스 값을 2번 가져가는 것이기 때문입니다.

아니면 main 메서드를 한 번 실행할 때 main 메서드 내에서 persist()를 두 번 실행하셨을까요?

감사합니다.

0

안녕하세요. 오리쉐리님, 공식 서포터즈 David입니다.

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 ZIP파일로 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx


주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요


추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명 (오류 화면, 오류 로그 포함)


링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

0

오리쉐리님의 프로필 이미지
오리쉐리
질문자

메모리에 저장된 시퀀스 값들이 소모되고, 추가적으로 다음 세트를 가져와야 하는 상황 모두 아닌데도 불구하고 왜 call next value for MEMBER_SEQ 를 두번 호출하나요??

https://read-write-developer.tistory.com/m/143 해당 블로그를 참고헀는데도 이해가 잘 안됩니다ㅜㅜ

0

안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님.

allocationSize와 관련된 JPA의 시퀀스 전략에 대해 궁금하신 점이 있군요. JPA에서 시퀀스를 사용하면서 allocationSize를 설정할 때 내부적으로 동작하는 방식에 대한 이해가 필요합니다.

기본적으로 JPA의 SEQUENCE 전략은 데이터베이스 시퀀스에서 값을 가져와 엔티티의 ID를 자동으로 생성하는 방법입니다. allocationSize를 설정하면, JPA는 해당 값만큼의 시퀀스 값을 한꺼번에 가져와 메모리에 저장해두고 사용합니다. 이를 통해 데이터베이스 접근을 줄여 성능을 개선하는 효과가 있습니다. 설명하신 동작 과정은 전반적으로 맞습니다. 하지만 추가적인 부분을 설명드리면 다음과 같습니다:

  1. 초기 메모리 시퀀스 확보: em.persist()가 처음 호출되면, JPA는 데이터베이스 시퀀스에서 allocationSize만큼 값을 가져옵니다. 이를 통해 메모리에 ID 값을 준비해두고, 그 값들을 순차적으로 사용합니다.

  2. 시퀀스 재호출: 메모리에 있는 시퀀스 값이 소진되면, JPA는 다시 데이터를 가져와 allocationSize만큼 메모리에 저장합니다. 이 과정에서 DB 시퀀스 값이 증가합니다. 예를 들어, allocationSize가 50이라면 처음에는 1부터 50까지, 이후에는 51부터 100까지를 가져오는 방식입니다.

질문하신 상황에서 처음 em.persist()를 호출할 때는 allocationSize만큼의 값을 미리 가져가게 되어 한 번의 시퀀스 호출이 발생하는 것으로 이해하실 수 있습니다. 하지만 여러 번 호출하는 경우, 그 과정 내에서 메모리에 저장된 시퀀스 값들이 소모되고, 추가적으로 다음 세트를 가져와야 하는 상황이 발생할 수 있는 것입니다. 이때 추가적인 시퀀스 호출이 발생하게 됩니다.

관련된 내용을 이해하는 데 도움이 될 수 있는 기존 답변 몇 가지를 공유드립니다:
1. SEQUENCE 전략 초기값과 호출 횟수 문의드립니다.

  • 이 게시물에서는 시퀀스 전략의 초깃값과 메모리에 할당된 시퀀스의 관리 사항이 다뤄지고 있습니다. 본 게시물에서 호출 관련하여 어려움을 겪고 있다면 여기에 대한 답변을 통한 유사한 문제 해결법을 참고하실 수 있습니다.
  1. call next value의 역할이 궁금합니다.

    • 이 게시물은 시퀀스 호출의 시점과 횟수에 대한 설명을 포함하고 있으며, 이를 통해 수강생이 보다 구체적으로 이해할 수 있도록 자세한 설명을 확인할 수 있습니다.
  2. 기본키중 sequence에 대해 질문 남깁니다.

    • 여기도 비슷한 맥락에서 sequence와 관련된 부분을 다루고 있어 도움이 될 수 있습니다.

위 게시물들에서 제공되는 답변을 통해 allocationSize와 call next value에 대한 이해를 보다 깊이 있게 할 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

질문하기