티스토리 뷰
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)
'Framework > Spring Data JPA' 카테고리의 다른 글
우아한테크캠프 Pro 5기 - Spring Data JPA (0) | 2022.11.24 |
---|---|
[JPA/Hibernate] 프록시와 연관관계 관리 (0) | 2021.06.29 |
[JPA/Hibernate] 고급 매핑 (0) | 2021.06.28 |
[JPA/Hibernate] 연관관계 매핑 기초 (0) | 2021.05.25 |
[JPA/Hibernate] 엔티티 매핑 (0) | 2021.05.10 |
댓글