작성
·
144
·
수정됨
1
안녕하세요. 트랜잭션 커밋전에 쿼리를 생성해서 쓰기지연저장소에 저장하는것인지, 아니면 트랜잭션 커밋 이후 내부적으로 flush()호출 시 쿼리를 생성해서 쓰기지연 저장소에 저장하는것인지에 대해서 강의와 다른질문들, 구글링을 종합해보면 insert, update, delete를 할때에 쓰기지연저장소에 SQL쿼리를 생성해서 저장하는 시점이 약간 다른거같아서 아래와 같이 정리해 보았는데, 전체적으로 제가 이해한바가 맞는지 확인하고 싶어서 질문드립니다. 감사합니다.
<update>
0. em.find()나, em.persist()로 인해 이미 1차캐시에 있는 엔티티의 필드값 변경
1. 트랜잭션 커밋. JPA는 트랜잭션을 커밋할때 변경된 엔티티 유무와 상관없이 항상 내부적으로 엔티티매니저의 flush()가 호출된다.
2. 영속성컨텍스트의 엔티티와 스냅샷을 비교한다.
3. UPDATE SQL을 생성해서 쓰기지연SQL저장소에 SQL쿼리를 저장한다.
4. 쓰기지연SQL저장소에있는 쿼리를 데이터베이스에 전송(=flush)한다.
5. 쓰기지연SQL저장소에있는 쿼리를 데이터베이스에 전송하고나서, 엔티티트랜잭션에 의해 트랜잭션이 커밋된다.
<insert>
1. em.persist()를 하면, 해당 엔티티가 1차캐시에 추가되고, INSERT SQL을 생성해서 쓰기지연SQL저장소에 SQL쿼리를 저장한다.
2. 트랜잭션 커밋. JPA는 트랜잭션을 커밋할때 변경된 엔티티 유무와 상관없이 항상 내부적으로 엔티티매니저의 flush()가 호출된다.
3. 쓰기지연SQL저장소에있는 쿼리를 데이터베이스에 전송(=flush)한다.
4. 쓰기지연SQL저장소에있는 쿼리를 데이터베이스에 전송하고나서, 엔티티트랜잭션에 의해 트랜잭션이 커밋된다.
<delete>
1. em.remove()를 하면, 해당 엔티티가 1차캐시에서 제거되고, DELETE SQL을 생성해서 쓰기지연SQL저장소에 SQL쿼리를 저장한다.
2. 트랜잭션 커밋. JPA는 트랜잭션을 커밋할때 변경된 엔티티 유무와 상관없이 항상 내부적으로 엔티티매니저의 flush()가 호출된다.
3. 쓰기지연SQL저장소에있는 쿼리를 데이터베이스에 전송(=flush)한다.
4. 쓰기지연SQL저장소에있는 쿼리를 데이터베이스에 전송하고나서, 엔티티트랜잭션에 의해 트랜잭션이 커밋된다.
답변 3
1
1
0
안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님의 질문에 답변해 드리겠습니다.
JPA에서 insert
, update
, delete
쿼리가 생성되고 쓰기 지연 저장소에 저장되는 시점을 상세히 이해하려는 모습이 인상적입니다. 각 연산에 대한 과정을 간단히 요약하면 다음과 같습니다.
em.find()
나 em.persist()
를 통해 이미 1차 캐시에 있는 엔티티의 필드 값을 변경한 후, 변경 감지가 발생합니다.flush()
를 호출합니다.flush()
가 호출되면, 영속성 컨텍스트의 엔티티와 스냅샷을 비교하여 변경 사항을 감지하고, UPDATE SQL
을 생성하여 쓰기 지연 SQL 저장소에 저장합니다.em.persist()
를 호출하면, 엔티티가 영속 상태가 되고 1차 캐시에 추가됩니다. 이때 INSERT SQL
이 생성되어 쓰기 지연 저장소에 저장됩니다.flush()
가 다시 호출되고, 쓰기 지연 저장소에 있는 쿼리가 데이터베이스로 전송됩니다.em.remove()
를 호출하면, 엔티티가 1차 캐시에서 제거되고 DELETE SQL
이 생성되어 쓰기 지연 저장소에 저장됩니다.flush()
가 호출되고, 저장소에 있는 쿼리가 DB로 전송됩니다.이 내용은 JPA의 기본적인 쓰기 지연과 변경 감지 메커니즘을 이해하는 데 반드시 필요합니다. 오리쉐리님께서 작성한 흐름은 대체로 정확하며, 이 흐름을 이해하면 JPA의 영속성 관리에 대해 깊이 있는 이해를 가질 수 있게 됩니다. 추가적으로 궁금한 점이 있으시면 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
아래는 관련된 질문의 링크입니다. 추가적인 정보를 얻으실 수 있습니다:
- JPA 1차 캐시와 쓰기지연 DB 질문 드립니다.
- 1차캐시와 SQL 쓰기지연 저장소에 저장되는 시점이 궁금합니다.
감사합니다.