작성
·
133
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
sql 쓰기 지연 저장소에 쿼리가 저장되는 타이밍이 헷갈립니다
em.find() 이후 member.setXXX 같은 경우는
트랜잭션 커밋 호출 -> 플러시 호출 -> 스냅샷, 1차 캐시 비교 -> 다르면 쓰지 지연 저장소에 쿼리 생성해서 저장
em.remove는 수정과 동일하게 동작
Member 객체 생성해서
em.persist(memberNew) 같은 경우에는
persist 하는 순간 1차 캐시, 스냅샷 저장 + 쓰기 지연 저장소에 쿼리도 생성해서 저장
해당 순서가 맞을까요?
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다. bae jewoo님의 질문에 답변해 드리겠습니다.
bae jewoo님께서 질문하신 “sql 쓰기 지연 저장소에 쿼리가 저장되는 타이밍”에 대해, JPA에서 쓰기 지연이라는 개념이 실제로 어떻게 동작하는지에 대한 궁금증 보입니다.
먼저 bae jewoo님께서 말씀하신 흐름은 대체로 맞습니다. 쓰기 지연 저장소는 영속성 컨텍스트의 하나의 기능으로, 트랜잭션을 통해 데이터 베이스에 전달되는 쿼리들(INSERT, UPDATE, DELETE 등)을 트랜잭션 커밋 시점까지 임시로 모아두는 역할을 합니다.
여기에 대한 좀 더 자세한 설명은 다음과 같습니다:
em.persist(member)
를 호출할 경우, 해당 엔티티는 영속 상태가 되며, INSERT 쿼리는 쓰기 지연 SQL 저장소에 저장되나 바로 데이터베이스로 전송되지는 않습니다. 1차 캐시에 엔티티가 저장되며, 스냅샷(초기 상태 복사본)도 함께 생성됩니다.
엔티티의 상태가 변경되어 em.find()
이후 member.setXXX()
와 같은 수정 작업이 일어날 경우, 실제 트랜잭션 커밋 시에 1차 캐시에 저장된 엔티티의 현재 상태와 스냅샷(초기 상태)을 비교합니다. 상태가 변경되었다면(다르면), 이 변경 사항을 반영하는 UPDATE 쿼리가 쓰기 지연 SQL 저장소에 생성되며, 커밋 시점에 데이터베이스로 전송됩니다.
em.remove()
함수를 사용하여 엔티티를 삭제하는 경우에도 해당 DELETE 쿼리가 쓰기 지연 SQL 저장소에 저장되며, 트랜잭션 커밋 시에 데이터베이스로 전송됩니다.
하지만, 이 내용만으로는 충분하지 않을 수 있으므로, 상세한 설명과 예제가 있는 기존 질문을 참고하시는 것을 추천드립니다.
JPA 1차 캐시와 쓰기지연 DB 질문 드립니다. 여기서는 persist와 flush의 동작 방식에 대해 설명하고 있으며, 쓰기 지연 저장소의 역할에 대해 설명합니다.
1차캐시와 SQL 쓰기지연 저장소에 저장되는 시점이 궁금합니다. 이 질문에서는 1차 캐시와 쓰기 지연 저장소에 대한 궁금증을 해소할 수 있는 예를 확인하실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.