➡️Entity Manager Factory & Entity Manager
Entity Manager Factory를 이용해서 Entity Manager 생성이 가능하다. Entity Manager Factory 는 비용이 많이 소요되기 때문에 하나의 애플리케이션에서 공유해서 사용이 가능하고, 멀티스레드에서도 동기화 처리를 통해 안전하게 사용이 가능하다. 하지만 Entity Manager는 여러 스레드에서 공유해서 사용되서는 안되기 때문에 스레드마다 Entity Manager를 생성할 필요가 있다.
JPA Database 설정 properties
1
2
3
4
5
|
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test1"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
|
cs |
➡️영속성 컨텍스트
JPA에서 가장 중요한 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻이다. 엔티티 매니저를 생성하면 영속성 컨텍스트가 자동으로 생성되고, Entity Manager를 이용해서 영속성 컨텍스트에 엔티티를 보관/관리한다.
영속성 컨텍스트의 특징
- 엔티티 매니저를 생성할 때 하나 만들어진다.
- 엔티티 매니저를 통해서 영속성 컨텍스트에 접근하고 관리할 수 있다.
엔티티는 4가지 속성을 가지고 있다.
비영속(new/transient): 엔티티 객체를 생성했지만 아직 영속성 컨텍스트에 저장하지 않은 상태를 비영속이라고 한다.
1
|
em.persist(member);
|
cs |
=> EntityManager.persist(entity);
->영속 상태가 된다고 바로 DB에 쿼리가 날라가지 않는다. (즉, DB 저장 X)
=> transaction.commit();
->트랜잭션의 commit 시점에 영속성 컨텍스트에 있는 정보들이 DB에 쿼리로 날라간다.
준영속(detached) : 영속성 컨텍스트 저장되었다가 분리된 상태
- 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.식별자 값을 가지고 있다.
1
2
3
4
5
6
|
// 엔티티를 영속성 컨텍스트에서 분리해 준영속 상태로 만든다.
em.detach(member);
// 영속성 콘텍스트를 비워도 관리되던 엔티티는 준영속 상태가 된다.
em.claer();
// 영속성 콘텍스트를 종료해도 관리되던 엔티티는 준영속 상태가 된다.
em.close();
|
cs |
삭제(removed):삭제된 상태
1
|
em.remove(member);
|
cs |
➡️영속성 컨텍스트 특징
영속성 컨텍스트의 식별자 값
=> 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다.
영속성 컨텍스트와 데이터베이스 저장
=>JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터 베이스에 반영하는데 이를 flush라 한다.
1. 1차 캐시
영속성 컨텍스트 내부에는 캐시가 있는데 이를 1차 캐시라고 한다. 영속 상태의 엔티티를 이곳에 저장한다. 1차 캐시의 키는 식별자 값(데이터베이스의 기본 키)이고 값은 엔티티 인스턴스이다.
조회
1
2
|
Member member = em.find(Member.class, "member1");
|
cs |
2. 동일성 보장
1
2
3
4
|
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.print(a==b) // true
|
cs |
3. 트랜잭션을 지원하는 쓰기지연
em.find(member)를 사용해 member를 저장해도 바로 INSERT SQL이 DB에 보내지는 것이 아니다. 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 내부 쿼리 저장소에 INSERT SQL을 모아둔다. 그리고 트랜잭션을 커밋할 때 모아둔 쿼리를 DB에 보낸다. 이것을 트랜잭션을 지원하는 쓰기 지연이라 한다.
4. 변경감지
JPA로 엔티티를 수정할 때는 단순히 엔티티를 조회해서 데이터를 변경하면 된다.
'Dev > SpringData' 카테고리의 다른 글
[Spring] DTO 사용범위에 대하여 (0) | 2021.11.12 |
---|---|
[JPA]Fetch.Lazy를 설정했을때 @OneToOne에서 발생하는 이슈 (0) | 2021.10.13 |
[JPA] 엔티티 매핑 (0) | 2021.09.10 |
Querydsl 오류 (querydsl error cannot find symbol) (0) | 2021.09.02 |
JPA(Java Persistence API)란? (0) | 2021.06.23 |