JPA와 영속성 컨텍스트

3748 단어 SpringJPAJPA

영속성 컨텍스트

영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 뜻이다.
애플리케이션이 DB에서 꺼내온 객체를 보관하는 역할을 함.
영속성 컨텍스트는 EntityManager를 통해 엔티티를 조회하거나 저장할 때 엔티티를 보관하고 관리한다.

엔티티 생명주기

  • 비영속 : 영속성 컨텍스트와 관계가 없는 새로운 상태
// 엔티티를 생성
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
  • 영속 : 엔티티 매니저를 통해 엔티티가 영속성 컨텍스트에 저장되어 관리되고 있는 상태
// 엔티티 매니저를 통해 영속성 컨텍스트에 엔티티를 저장
em.persist(entity);

-> persist는 실제로 DB에 저장하는 것이 아니라, 영속성 컨텍스트를 통해서 엔티티를 영속화 한다는 뜻
persist() 시점에는 영속성 컨텍스트에 저장한다. DB저장은 이후이다.

영속성 컨텍스트의 이점

  1. 1차 캐시
  2. 동일성 보장(Identity)
  3. 트랜잭션을 지원하는 쓰기 지연
  4. 변경감지 (Dirty Checking)
  5. 지연로딩(Lazy Loading)

1차캐시

영속성 컨텍스트에는 1차캐시가 존재
엔티티를 영속성 컨텍스트에 저장하는 순간 1차캐시에 객체가 key(id), value(entity)값으로 저장됨

엔티티 매니저가 조회를 할 때 먼저 영속성 컨텍스트에 있는 1차 캐시에서 해당 엔티티를 찾고
엔티티가 존재할 경우 DB에 접근하지 않고 반환

엔티티가 존재하지 않을 경우 엔티티 매니저가 em.flush()할 때에 데이터베이스에 접근해서 엔티티를 꺼내오고 해당 엔티티를 1차 캐시에 저장

동일성 보장(Identity)

영속성 컨텍스트에서 꺼내온 객체는 동일성이 보장됨
같은 엔티티를 두 번 조회할 경우 두 개의 엔티티는 동일한 엔티티이다.
1차 캐시로 반복 가능한 읽기등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공

Member member1 = em.find(Member.class, "member1");
Member member2 = em.find(Member.class, "member1");

System.out.println(member1 == member2) => true

좋은 웹페이지 즐겨찾기