이 글은 김영한의 [자바 ORM 표준 JPA 프로그래밍 - 기본편]을 수강하며 정리한 글입니다.
👉 기본 환경
- Language: Java
- IDE: IntelliJ
1. 1차 캐시
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
32
|
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// EntityManagerFactory: Application Loading 시점에 1개만 생성(DB당 1개)
EntityManager em = emf.createEntityManager();
// EntityManager: DB에 저장되는 transaction 단위마다 생성
// JPA의 모든 데이터 변경은 transaction 안에서 실행
EntityTransaction tx = em.getTransaction();
tx.begin(); // transaction 시작 선언
try {
Member member = new Member();
member.setId(2L);
member.setName("HelloB");
em.persist(member); // 1차 cache 저장
tx.commit(); // transaction 종료 후, 1차 캐시에 있던 데이터를 DB에 저장
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
// 트랜잭션 단위로 관리되는 Entity Manager는 Tx가 종료되면 close가 되어야하지만, emf는 Application 종료 시, close되어야 함
}
}
|
2. 동일성 보장
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
32
33
34
35
|
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// EntityManagerFactory: Application Loading 시점에 1개만 생성(DB당 1개)
EntityManager em = emf.createEntityManager();
// EntityManager: DB에 저장되는 transaction 단위마다 생성
// JPA의 모든 데이터 변경은 transaction 안에서 실행
EntityTransaction tx = em.getTransaction();
tx.begin(); // transaction 시작 선언
try {
Member findMember1 = em.find(Member.class, 101L);
Member findMember2 = em.find(Member.class, 101L);
// 1차 cache에 저장된 동일한 PK로 값을 조회하므로 DB에 Select를 사용하지 않고도 findMember가 가능
System.out.println("Result: " + (findMember1==findMember2));
// 같은 Transaction 안에서 같은 객체를 조회할 경우, == 비교 성립
tx.commit();
// Commit 후, 영속성 context에 있는 데이터에 대해 DB에 Query 송부
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
// 트랜잭션 단위로 관리되는 Entity Manager는 Tx가 종료되면 close가 되어야하지만, emf는 Application 종료 시, close되어야 함
}
}
|
3. 쓰기 지연
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
32
33
34
|
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// EntityManagerFactory: Application Loading 시점에 1개만 생성(DB당 1개)
EntityManager em = emf.createEntityManager();
// EntityManager: DB에 저장되는 transaction 단위마다 생성
// JPA의 모든 데이터 변경은 transaction 안에서 실행
EntityTransaction tx = em.getTransaction();
tx.begin(); // transaction 시작 선언
try {
Member member1 = new Member(150L, "A");
Member member2 = new Member(160L, "B");
em.persist(member1);
em.persist(member2);
tx.commit();
// 쓰기 지연을 통해서 commit 시, batch_size만큼 SQL 구문 모아서 처리
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
// 트랜잭션 단위로 관리되는 Entity Manager는 Tx가 종료되면 close가 되어야하지만, emf는 Application 종료 시, close되어야 함
}
}
|
4. 변경 감지(Dirty Checking)
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
32
|
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// EntityManagerFactory: Application Loading 시점에 1개만 생성(DB당 1개)
EntityManager em = emf.createEntityManager();
// EntityManager: DB에 저장되는 transaction 단위마다 생성
// JPA의 모든 데이터 변경은 transaction 안에서 실행
EntityTransaction tx = em.getTransaction();
tx.begin(); // transaction 시작 선언
try {
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit();
// Update를 작성하지 않아도 JPA를 통해서 Entity를 가져올 경우, JPA가 관리
// 내용의 변경이 있을 경우, JPA가 자동 update query 생성
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
// 트랜잭션 단위로 관리되는 Entity Manager는 Tx가 종료되면 close가 되어야하지만, emf는 Application 종료 시, close되어야 함
}
}
|
5. 지연 로딩
'Java > JPA' 카테고리의 다른 글
[JPA_Basic] 기본키 매핑 (0) | 2023.08.05 |
---|---|
[JPA_Basic] 데이터베이스 스키마 자동 생성 (0) | 2023.07.31 |
[JPA] @PrePersist (0) | 2023.06.25 |
[JPA] JOIN Null값 처리 (0) | 2023.06.20 |
[SpringBoot_JPA_Basic] JPA 1차 cache (0) | 2023.06.16 |