티스토리 뷰

Entity Manager Factory

  • Entity Manager를 만드는 공장
  • 만드는 비용이 크기 때문에 애플리케이션 전체에서 하나만 만들어서 공유하도록 설계

Entity Manager

  • 만드는 비용이 거의 들지 않는다.
  • 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안 된다.

 

영속성 컨텍스트(persistence context)

  • Entity Manager를 생성할 때 하나 만들어진다.
  • Entity Manager를 통해 영속성 컨텍스트에 접근하고 관리한다.
  • 영속성 컨텍스트는 Entity를 식별자 값으로 구분하기 때문에 식별자 값이 반드시 있어야 한다.
  • transaction을 commit하는 순간 영속성 컨텍스트에 저장된 entity를 데이터베이스에 반영한다.(flush)

Entity 생명주기

  • 비영속(new/transient) : Entity 객체를 생성하고 영속성 컨텍스트와 관련이 없는 객체 상태.
Member member = new Member();

 

  • 영속(managed) : Entity Manager를 통해 영속성 컨텍스트에 저장되어 영속성 컨텍스트가 관리하는 상태를 영속 상태라 한다.
entityManager.persist(member);

 

  • 준영속(detached) : 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 된다.
entityManager.detach(member);	//member entity를 준영속 상태로 만든다.
entityManager.close();	//영속성 컨텍스트를 닫는다.
entityManager.clear();	//영속성 컨텍스트를 초기화한다.

 

  • 삭제(removed) : Entity를 영속성 컨텍스트와 데이터베이스에서 삭제.
entityManager.remove(member);

 

영속성 컨텍스트의 장점

  • 1차 캐시와 동일성 보장
    • 영속성 컨텍스트 내부에는 @Id를 키값으로 하는 저장 공간(1차 캐시)을 가지고 있다.
    • entityManager.find()를 호출하면 먼저 1차 캐시에서 Entity를 찾고 만약 찾는 Entity가 1차 캐시에 없으면 데이터베이스에서 조회한다.
    • 1차 캐시에 있는 식별자가 같은 entity instance를 호출하면 영속성 컨텍스트는 같은 entity instance를 반환한다.(동일성 보장)
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member2");

System.out.println(a == b);	//true

 

  • 트랜잭션을 지원하는 쓰기 지연
    • Entity Manager는 transaction을 commit하기 직전까지 내부 쿼리 저장소에 INSERT SQL을 모아둔다.
    • 모아둔 쿼리를 데이터베이스에 한 번에 전달해서 성능을 최적화할 수 있다.
  • 변경 감지(dirty checking)
    • 최초 상태를 복사해서 저장(스냅샷)해두고 flush 시점에 변경된 entity가 있는지 확인한다.
    • JPA는 쿼리를 미리 생성해두고 재사용할 수 있기 때문에 모든 필드를 UPDATE하는 쿼리를 생성한다.

 

  • 지연 로딩
    • 실제 사용될 때까지 데이터 로딩을 미룬다.
Member member = em.fine(Member.class, "member1");
Team team = member.getTeam(); //프록시 객체를 저장하고 실제 사용될 때까지 데이터 로딩을 미룬다.
team.getName();	//팀 객체 실제 사용

 

참고

김영한, 『자바 ORM 표준 JPA 프로그래밍』, 에이콘출판주식회사(2015)

댓글
Total
Today
Yesterday
링크
Apple 2023 맥북 프로 14 M3, 스페이스 그레이, M3 8코어, 10코어 GPU, 512GB, 8GB, 한글