작성
·
408
0
1차 캐시가 다 유지된다고 하셨는데 한 가지 의문이 들어 정확히 알고 싶어 질문 올립니다.
말씀하신 그대로 1차 캐시의 모든 정보가 유지가 되는건지 아니면 아래의 과정이 맞는건지 궁금합니다.
memberA를 영속성 컨텍스트에 저장을 하고 이후 memberB를 em.persist() -> flush를 했을 때 Entity는 변경후 데이터 , 스냅샷이 변경 전 데이터가 들어가고 commit을 하면 하면 스냅샷이 변경 후 데이터로 변경되고 rollback을 하면 다시 Entity가 변경 전 데이터로 돌아가는 것이 아닐까 하는 생각이 들었습니다.
답변 2
1
안녕하세요. soul1902님
영속성 컨텍스트의 데이터의 데이터는 객체와 관계있기 때문에 commit, rollback과 관계없이 유지됩니다.
memberA의 데이터를 memberB로 변경하면 영속성 컨텍스트 안에서는 즉시 변경됩니다.
다만 일반적인 웹 애플리케이션에서는 하나의 트랜잭션 안에서만 영속성 컨텍스트를 유지합니다.
따라서 커밋이나 롤백이 이루어지고 나면 영속성 컨텍스트도 함께 제거되는 방식을 많이 사용합니다.
따라서 일반적인 상황에서는 커밋이나 롤백 이후에는 영속성 컨텍스트가 사라진다고 보셔도 괜찮습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요.
1차 캐시의 내부 동작과정을 설명드리면, 엔티티를 조회할 경우 1차 캐시를 먼저 확인하고 캐시에 없으면 데이터베이스에서 조회한 후, 1차 캐시에 저장합니다. 이후 이 엔티티를 다시 조회할 경우, 1차 캐시에 해당 엔티티가 있기 때문에 캐시에 저장된 값을 가져오며 데이터베이스를 조회하지 않습니다.
또한, memberA를 영속성 컨텍스트에 저장한 후 memberB를 persist()와 flush()를 한다면, memberA가 1차 캐시에 저장된 상태에서 memberB가 데이터베이스에 저장됩니다. 그리고 commit을 하면 memberB는 데이터베이스와 1차 캐시에 저장되며, 스냅샷이 변경된 후 데이터로 변경됩니다. rollback을 하면 memberB는 데이터베이스에서 삭제되며, 1차 캐시에도 없어집니다. 이때 memberA는 여전히 1차 캐시에 저장되어 있습니다.
더 자세한 내용은 JPA의 영속성 컨텍스트와 관련된 개념을 찾아보시면 도움이 될 것입니다. 감사합니다.