Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Flèche

[JPA]영속성컨텍스트2 본문

spring

[JPA]영속성컨텍스트2

철학자 2021. 4. 4. 18:00

영속성 컨텍스트와 1차 캐쉬

  • 1차 캐시 : 영속성 컨텍스트는 내부에 캐시를 가지고 있는데 이것을 1차 캐시라 한다.
    영속 상태의 엔티티는 모두 이곳에 저장된다. 쉽게 말해 영속성 컨텍스트 내부에 Map이 하나 있는데 (1차 캐시), 키는 @Id로 매핑한 식별자고
    값은 엔티티 인스턴스다.

  • em.find()를 호출했는데 엔티티가 1차 캐시에 없으면 엔티티 매니저는 데이터베이스를 조회해서
    엔티티를 생성하고 1차 캐시에 저장한 후에 영속 상태의 엔티티를 반환한다.

영속성 컨텍스트의 쓰기지현

  • 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 데이터베이스에 엔티티를 저장하지 않고 내부 쿼리 저장소에 INSERT SQL을 모아둔다.
    그리고 트랜잭션을 커밋할 때 모아둔 쿼리를 데이터베이스에 보내서 저장시킨다.
    이를 트랜잭션을 지원하는 쓰기 지연이라 한다.

더티체킹

Member memberA = em.find(Member.class, "memberA");
memberA.setUsername("hi");
memberA.setAge(10);
  • memberA 객체의 멤버가 변경되면 JPA가 자동으로 update쿼리를 작성한다.

영속성 컨텍스트에서 준영속 상태로

em.flush(), em.clear()를 하면 DB에 데이터를 반영하고, 영속성 컨텍스트를 지웁니다.
그러면 em.find()를 호출하면 영속성 컨텍스트에 없으니 DB에서 조회하고, 조회 쿼리를 볼 수 있습니다.
실제로 em.flush(), em.clear()를 직접 호출하는 경우는 거의 없다고한다.

  • em.detach(member) 준영속 상태로 변경
  • em.clear() 영속성 컨텍스트를 초기화시킴 => 더티체킹이 작동X
  • em.close() 모든 영속성 컨텍스트의 내용을 준영속으로 만듦