π JPAμμ μμμ± μ»¨ν μ€νΈλ λ°μ΄ν°λ² μ΄μ€μ κ°μ²΄ μ¬μ΄μ μνΈμμ©μ ν¨μ¨μ μΌλ‘ κ΄λ¦¬νκΈ° μν΄ λ§λ€μ΄μ§ ν΅μ¬μ μΈ κ³΅κ°μ λλ€.
μμμ± μ»¨ν μ€νΈλ Entity κ°μ²΄μ μνλ₯Ό κ΄λ¦¬νκ³ , λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ©μ μ΅μ ννμ¬ μ±λ₯μ ν₯μμν΅λλ€.
JPAλ₯Ό μ¬μ©νλ©΄μ μ¬λ¬λΆμ΄ μμ£Ό μ νκ² λ 1μ°¨ μΊμ, λ³κ²½ κ°μ§, μ°κΈ° μ§μ° κ°μλ μ΄ μμμ± μ»¨ν μ€νΈμ μ€μν κΈ°λ₯λ€μ λλ€.
μ΄λ² ν¬μ€ν μμλ μμμ± μ»¨ν μ€νΈκ° μ΄λ¬ν κΈ°λ₯λ€μ ν΅ν΄ μ΄λ»κ² Entity κ°μ²΄λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬νκ³ , μ±λ₯μ κ·Ήλννλμ§μ λν΄ μμΈν μ΄ν΄λ³΄κ² μ΅λλ€.
JPAμμ μμμ± μ»¨ν μ€νΈμ ν΅μ¬ κΈ°λ₯_1μ°¨ μΊμ
μμμ± μ»¨ν μ€νΈλ λ΄λΆμ μΌλ‘ μΊμ μ μ₯μλ₯Ό κ°μ§κ³ μμ΅λλ€. μ°λ¦¬κ° μ μ₯νλ Entity κ°μ²΄λ€μ΄ 1μ°¨ μΊμ μ¦, μΊμ μ μ₯μμ μ μ₯λκ² λ©λλ€.
μΊμ μ μ₯μλ Map μλ£κ΅¬μ‘° ννλ‘ λμ΄μμ΅λλ€.
- key
- @Idλ‘ λ§€νν κΈ°λ³Έ ν€ μ¦, μλ³μ κ°μ μ μ₯ν©λλ€.
- value
- ν΄λΉ Entity ν΄λμ€μ κ°μ²΄λ₯Ό μ μ₯ν©λλ€.
- μμμ± μ»¨ν μ€νΈλ μΊμ μ μ₯μ Keyμ μ μ₯ν μλ³μκ°μ μ¬μ©νμ¬ Entity κ°μ²΄λ₯Ό ꡬλΆνκ³ κ΄λ¦¬ν©λλ€.
μμμ± μ»¨ν μ€νΈλ 1μ°¨ μΊμλ₯Ό μ¬μ©νμ¬ μν°ν° κ°μ²΄λ₯Ό κ΄λ¦¬ν©λλ€. μ΄ μΊμλ λ€μκ³Ό κ°μ κΈ°λ₯μ μ 곡ν©λλ€.
Entity κ°μ²΄μ μ μ₯
- μμμ± μ»¨ν μ€νΈλ λ°μ΄ν°λ² μ΄μ€μμ μ‘°νν μν°ν° κ°μ²΄λ₯Ό 1μ°¨ μΊμμ μ μ₯ν©λλ€.
- μ΄ μΊμλ μμμ± μ»¨ν μ€νΈμ lifecycleλμ μ μ§λ©λλ€.
μ€λ³΅ μ‘°ν λ°©μ§
- λμΌν μν°ν°μ λν μ¬λ¬ λ²μ μ‘°νλ₯Ό λ°©μ§ν©λλ€.
- 1μ°¨ μΊμμ μ μ₯λ μν°ν° κ°μ²΄λ
μ€λ³΅μΌλ‘ μ‘°νλμ§ μμΌλ©°, λ°μ΄ν°λ² μ΄μ€ μ‘°νλ₯Ό μ΅μνν©λλ€.
μ±λ₯ ν₯μ
- 1μ°¨ μΊμλ₯Ό μ¬μ©νλ©΄ λμΌν νΈλμμ λ΄μμ λ°μ΄ν°λ² μ΄μ€μ λν μ€λ³΅ μμ²μ μ€μΌ μ μμΌλ©°, μ±λ₯μ ν₯μμν΅λλ€.
μλ λκΈ°ν
- μν°ν°μ μνκ° λ³κ²½λλ©΄, μμμ± μ»¨ν μ€νΈλ μλμΌλ‘ μ΄λ₯Ό λ°μνλ©°, νΈλμμ μ»€λ° μ λ³κ²½ μ¬νμ λ°μ΄ν°λ² μ΄μ€μ μ μ₯ν©λλ€.
λμΌμ± 보μ₯
@Test
@DisplayName("κ°μ²΄ λμΌμ± 보μ₯")
void test4() {
EntityTransaction et = em.getTransaction();
et.begin();
try {
Memo memo3 = new Memo();
memo3.setId(2L);
memo3.setUsername("Robbert");
memo3.setContents("κ°μ²΄ λμΌμ± 보μ₯");
em.persist(memo3);
Memo memo1 = em.find(Memo.class, 1);
Memo memo2 = em.find(Memo.class, 1);
Memo memo = em.find(Memo.class, 2);
System.out.println(memo1 == memo2);
System.out.println(memo1 == memo);
et.commit();
} catch (Exception ex) {
ex.printStackTrace();
et.rollback();
} finally {
em.close();
}
emf.close();
}
μ μ€νκ²°κ³Όλ₯Ό 보면
- κ°μ κ°μ μ‘°ννλ memo1κ³Ό memo2λ == κ²°κ³Ό trueλ₯Ό λ°νν©λλ€.
- memo1κ³Ό λ€λ₯Έ κ°μ μ‘°ννλ memoλ == κ²°κ³Ό falseλ₯Ό λ°νν©λλ€.
κ·Όλ° μ΄μνμ μ΄ μμ΅λλ€. μλ°λ₯Ό λ°°μΈ λ κ°μ²΄λ₯Ό λκ° μμ±νμ λ λ κ°μ μ£Όμλ κ°μ μ μλ€κ³ μκ³ μμ΅λλ€.
κ·Έλ¬λ JPAμ μμμ± μ»¨ν μ€νΈμ κ΄λ ¨νμ¬ find() λ©μλλ₯Ό νΈμΆν λ, κ°μ μλ³μ(PK)λ₯Ό κ°μ§ μν°ν°λ₯Ό μ‘°ννλ©΄ λ κ°μ²΄κ° κ°μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νλ κ²½μ°κ° μμ΅λλ€.
μ΄ νμμ JPAμ 1μ°¨ μΊμ κΈ°λ₯μΌλ‘ μ€λͺ ν μ μμ΅λλ€.
ꡬ체μ μΌλ‘, 1μ°¨ μΊμλ μμμ± μ»¨ν μ€νΈ λ΄μμ λμΌν μλ³μλ₯Ό κ°μ§ Entityκ° νλλ§ μ‘΄μ¬νλλ‘ λ³΄μ₯ν©λλ€. μ΄λ₯Ό ν΅ν΄ μν°ν°μ λμΌμ± 보μ₯κ³Ό μ€λ³΅ μ‘°ν λ°©μ§ κΈ°λ₯μ΄ κ΅¬νλ©λλ€.
μ¦ μ 리νμλ©΄ λ€μκ³Ό κ°μ΅λλ€.
- μμμ± μ»¨ν μ€νΈ λ΄μμ λμΌν μλ³μλ₯Ό κ°μ§ μν°ν°λ νλμ μΈμ€ν΄μ€λ§μ κ°μ§λ©°, λͺ¨λ μ‘°νλ μ΄ λ¨μΌ μΈμ€ν΄μ€λ₯Ό λ°νν©λλ€. λ°λΌμ 1μ°¨ μΊμλ μμμ± μ»¨ν μ€νΈ λ΄μμ μν°ν°μ λμΌμ±μ 보μ₯ν©λλ€.
μμμ± μ»¨ν μ€νΈμ μΊμ μ μ₯μ νμ©
μμμ± μ»¨ν μ€νΈκ° μ΄ μΊμ μ μ₯μλ₯Ό μ΄λ»κ² νμ©νκ³ μλμ§ μ€μ μ½λλ₯Ό 보면μ νμΈν΄ λ³΄κ² μ΅λλ€.
Entityμ μ₯
@Test
@DisplayName("1μ°¨ μΊμ : Entity μ μ₯")
void test1() {
EntityTransaction et = em.getTransaction();
et.begin();
try {
Memo memo = new Memo();
memo.setId(1L);
memo.setUsername("Robbie");
memo.setContents("1μ°¨ μΊμ Entity μ μ₯");
em.persist(memo);
et.commit();
} catch (Exception ex) {
ex.printStackTrace();
et.rollback();
} finally {
em.close();
}
emf.close();
}
em.persist(memo); λ©μλκ° νΈμΆλλ©΄ memo Entity κ°μ²΄λ₯Ό μΊμ μ μ₯μμ μ μ₯ν©λλ€.
μ "μΊμ μ μ₯μ μ μ₯ κ²°κ³Ό"λ₯Ό 보면 em β‘οΈ persistenceContext β‘οΈ entitiesBykeyλ₯Ό νμΈν΄ 보면 key-value ννλ‘ μ λ³΄κ° μ μ₯λμ΄ μμμ νμΈν μ μμ΅λλ€.
Entityμ‘°ν
Entityμ‘°ν κ°μ κ²½μ°μλ ν¬κ² λκ° μ§ κ²½μ°λ‘ λλκ² λ©λλ€.
1. μΊμ μ μ₯μμ μ‘°ννλ Idκ° μ‘΄μ¬νμ§ μμ κ²½μ°
@Test
@DisplayName("Entity μ‘°ν : μΊμ μ μ₯μμ ν΄λΉνλ Idκ° μ‘΄μ¬νμ§ μμ κ²½μ°")
void test2() {
try {
Memo memo = em.find(Memo.class, 1);
System.out.println("memo.getId() = " + memo.getId());
System.out.println("memo.getUsername() = " + memo.getUsername());
System.out.println("memo.getContents() = " + memo.getContents());
} catch (Exception ex) {
ex.printStackTrace();
} finally {
em.close();
}
emf.close();
}
1. μΊμ μ μ₯μ μ‘°ν
2. DB SELECT μ‘°ν ν μΊμ μ μ₯μμ μ μ₯
find() λ©μλλ₯Ό μ¬μ©νμ¬ μ‘°νλ₯Ό ν μ μμ΅λλ€.
λ§μ½ μ κ·Έλ¦Όμ²λΌ id : 1μΈ PKλ₯Ό κ°μ§κ³ μ‘°νλ₯Ό νλλ° 1μ°¨ μΊμμ μμΌλ©΄ DBμ SELECT쿼리λ₯Ό 보λ΄κ² λ©λλ€. DBμμ μ‘°νλ₯Ό νκ³ κ·Έ κ°μ 1μ°¨ μΊμμ μ μ₯μ ν©λλ€.
κ·Έλ¦¬κ³ 1μ°¨ μΊμμ μ μ₯λμ΄ μλ Entityκ°μ λ°ννμ¬ EntityManagerνν λ°ννμ¬ μ΄ κ°μ μ¬μ©νλλ‘ ν©λλ€.
μ κ²°κ³Όλ₯Ό 보면 find() λ©μλλ₯Ό 보λ΄κ³ 1μ°¨ μΊμμ μκΈ° λλ¬Έμ DBμ Selectλ¬Έμ 보λ΄κ³ λ€μ 1μ°¨ μΊμμ μ μ₯νκ³ μ΄ 1μ°¨ μΊμμ μ μ₯λμ΄ μλ Entityκ°μ λ°ννμ¬ EntityMangerκ° μ¬μ©ν κ²μ λ³Ό μ μμ΅λλ€.
2. μΊμ μ μ₯μμ μ‘°ννλ Idκ° μ‘΄μ¬νλ κ²½μ°
μΊμ μ μ₯μμ μ‘°ννλ μλ³μ κ°μ΄ 1μ΄κ³ , Memo Entityνμ μΈ κ°μ΄ μλ€λ©΄ ν΄λΉ Entity κ°μ²΄λ₯Ό λ°λ‘ λ°νν©λλ€.
@Test
@DisplayName("Entity μ‘°ν : μΊμ μ μ₯μμ ν΄λΉνλ Idκ° μ‘΄μ¬νλ κ²½μ°")
void test3() {
try {
Memo memo1 = em.find(Memo.class, 1);
System.out.println("memo1 μ‘°ν ν μΊμ μ μ₯μμ μ μ₯\n");
Memo memo2 = em.find(Memo.class, 1);
System.out.println("memo2.getId() = " + memo2.getId());
System.out.println("memo2.getUsername() = " + memo2.getUsername());
System.out.println("memo2.getContents() = " + memo2.getContents());
} catch (Exception ex) {
ex.printStackTrace();
} finally {
em.close();
}
emf.close();
}
μ μ€νκ²°κ³Όλ₯Ό 보면 ν λ²μ Selectκ° λ³΄λ΄μ§ κ²μ μ μ μμ΅λλ€. μ΄λ μ μ½λμμ find() λ©μλλ‘ DBμμ selectλ‘ μ‘°νλ₯Ό νκ³ 1μ°¨ μΊμλ‘ κ°μ Έμ¨ λ°μ΄ν°λ₯Ό memo2κ° λ€μ νλ² find() νκΈ° λλ¬Έμ λλ€.
Entityμμ
1.Entity μ‘°ν λ° μΊμ μ μ₯μ νμΈ
Entityλ₯Ό μμ νκΈ° μν΄μλ λ¨Όμ ν΄λΉ Entityκ° μμμ± μ»¨ν μ€νΈμ 1μ°¨ μΊμμ μλμ§ νμΈν©λλ€.
λ§μ½ μΊμ μ μ₯μμ μ‘΄μ¬νμ§ μλλ€λ©΄, JPAλ λ°μ΄ν°λ² μ΄μ€μμ ν΄λΉ Entityλ₯Ό μ‘°ννμ¬ μΊμ μ μ₯μμ μ μ₯ν©λλ€.
em.remove(entity) λ©μλλ₯Ό νΈμΆνλ©΄, JPAλ ν΄λΉ Entityλ₯Ό μμ ν μ€λΉλ₯Ό ν©λλ€.
remove() λ©μλλ μμ ν Entityλ₯Ό μμμ± μ»¨ν μ€νΈ λ΄μμ DELETED μνλ‘ λ³κ²½νλ©°, μ€μ λ°μ΄ν°λ² μ΄μ€μ λ³κ²½ μ¬νμ νΈλμμ μ΄ μ»€λ°λ λ μ μ©λ©λλ€.
νΈλμμ μ΄ μ»€λ°λλ©΄, JPAλ λ°μ΄ν°λ² μ΄μ€μ DELETE SQL λͺ λ Ήμ λ°μ‘νμ¬ ν΄λΉ Entityλ₯Ό μμ ν©λλ€.
@Test
@DisplayName("Entity μμ ")
void test5() {
EntityTransaction et = em.getTransaction();
et.begin();
try {
Memo memo = em.find(Memo.class, 2);
em.remove(memo);
et.commit();
} catch (Exception ex) {
ex.printStackTrace();
et.rollback();
} finally {
em.close();
}
emf.close();
}
JPAμμ Entityλ₯Ό μμ νκΈ° μν κ³Όμ μ λ€μκ³Ό κ°μ΅λλ€.
- Entity μ‘°ν
- λ¨Όμ , em.find(EntityClass.class, PK) λ©μλλ₯Ό μ¬μ©νμ¬ νΉμ Entityλ₯Ό μ‘°νν©λλ€. μλ₯Ό λ€μ΄, PKκ° 2μΈ Memo κ°μ²΄λ₯Ό μ‘°ννλ€κ³ κ°μ ν λ, κ²°κ³Όλ Memo#2κ° λ©λλ€. μ΄ μμ μμ μ΄ Entityλ κ΄λ¦¬(MANAGED) μνλ‘, μμμ± μ»¨ν μ€νΈμ μν΄ κ΄λ¦¬λκ³ μμμ λνλ λλ€.
μ λλ²κΉ κ²°κ³Όλ₯Ό 보면 λ¨Όμ , em.find(EntityClass.class, PK) λ©μλλ₯Ό μ¬μ©νμ¬ νΉμ Entityλ₯Ό μ‘°νν©λλ€.
μ μ½λλ₯Ό κΈ°μ€μΌλ‘, PKκ° 2μΈ Memo κ°μ²΄λ₯Ό μ‘°ννκ³ μμ΅λλ€. κ²°κ³Όλ Memo#2κ° λ©λλ€. μ΄ μμ μμ μ΄ Entityλ κ΄λ¦¬(MANAGED) μνλ‘, μμμ± μ»¨ν μ€νΈμ μν΄ κ΄λ¦¬λκ³ μμμ λνλ λλ€.
Entityλ₯Ό μμ νκΈ° μν΄ em.remove(entity) λ©μλλ₯Ό νΈμΆν©λλ€. μ΄ λ©μλ νΈμΆ ν, Entityμ μνλ DELETEDλ‘ λ³κ²½λ©λλ€.
DELETED μνλ ν΄λΉ Entityκ° μμ λκΈ° μ€μμ μλ―Έν©λλ€. μ€μ μμ μμ μ νΈλμμ μ΄ μ»€λ°(COMMIT)λ λ λ°μ΄ν°λ² μ΄μ€μ DELETE SQL μΏΌλ¦¬κ° λ°μ‘λλ©΄μ μ΄λ£¨μ΄μ§λλ€.
μ μ΅μ’ κ²°κ³Όλ₯Ό 보면 selectλ‘ λ°μ΄ν°κ° μ‘΄μ¬νλμ§ νμΈνκ³ delete μΏΌλ¦¬κ° λμν κ²μ λ³Ό μ μμ΅λλ€.
μ°κΈ° μ§μ° μ μ₯μ (Write-Behind Storage)λβ
JPAμ νΈλμμ μ²λ¦¬ λ°©μμμλ SQL λͺ λ Ήμ λͺ¨μμ μΌκ΄μ μΌλ‘ λ°μ΄ν°λ² μ΄μ€μ μ μ©νλ λ°©μμ΄ ν΅μ¬μ μΈ μν μ ν©λλ€.
μ΄λ¬ν μ κ·Ό λ°©μμ μ±λ₯μ μ΅μ ννκ³ λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ©μ ν¨μ¨μ μΌλ‘ κ΄λ¦¬νλ λ° μ€μνλ°, κ·Έ κ³Όμ μμ μ€μν μν μ νλ κ°λ μ΄ λ°λ‘ μ°κΈ° μ§μ° μ μ₯μ(Write-Behind Cache)μ λλ€.
μ°κΈ° μ§μ° μ μ₯μβλ JPAμ μμμ± μ»¨ν μ€νΈμμ λ³κ²½λ Entity μνλ₯Ό λ©λͺ¨λ¦¬μ μμλ‘ μ μ₯νλ ꡬ쑰λ₯Ό μλ―Έν©λλ€.
λ°μ΄ν°λ² μ΄μ€μ μ§μ μ μΈ λ°μμ μ§μ°μν€κ³ , νΈλμμ μ΄ μ»€λ°λ λ λ³κ²½ μ¬νμ μΌκ΄μ μΌλ‘ μ²λ¦¬νμ¬ ν¨μ¨μ μΈ λ°μ΄ν°λ² μ΄μ€ κ΄λ¦¬μ μ±λ₯ ν₯μμ κ°μ Έμ΅λλ€.
μ°κΈ° μ§μ° μ μ₯μ (Write-Behind Storage)μ μ£Όμ κ°λ
λ³κ²½ μ¬νμ μμ μ μ₯
Entityμ μνλ₯Ό λ³κ²½ν λ, JPAλ κ·Έ λ³κ²½ μ¬νμ μ¦μ λ°μ΄ν°λ² μ΄μ€μ λ°μνλ λμ , μ°κΈ° μ§μ° μ μ₯μμ μμλ‘ μ μ₯ν©λλ€. μ΄λ₯Ό ν΅ν΄ λΉλ²ν λ°μ΄ν°λ² μ΄μ€ μ κ·Όμ μ€μ΄κ³ , λ©λͺ¨λ¦¬μμ λ³κ²½ μ¬νμ κ΄λ¦¬ν©λλ€.
νΈλμμ μ»€λ° μμ μ λ°μ
μ°κΈ° μ§μ° μ μ₯μμ μ μ₯λ λ³κ²½ μ¬νμ νΈλμμ μ΄ μ»€λ°λ λ λ°μ΄ν°λ² μ΄μ€μ μ€μ λ‘ λ°μλ©λλ€.
JPAλ μ΄ μμ μ λͺ¨λ λ³κ²½ μ¬νμ μΌκ΄μ μΌλ‘ μ²λ¦¬νμ¬, λ°μ΄ν°λ² μ΄μ€μ μ μ ν SQL λͺ λ Ή(INSERT, UPDATE, DELETE)μ λ°μ‘ν©λλ€.
μ±λ₯ ν₯μ
μ°κΈ° μ§μ° μ μ₯μλ₯Ό μ¬μ©νλ©΄ λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ©μ μ΅μ ννκ³ μ±λ₯μ κ°μ ν μ μμ΅λλ€. λ©λͺ¨λ¦¬μ μμλ‘ μ μ₯λ λ³κ²½ μ¬νμ ν λ²μ μ²λ¦¬ν¨μΌλ‘μ¨, λ°μ΄ν°λ² μ΄μ€μ λΆνλ₯Ό μ€μ΄κ³ μ 체μ μΈ μ±λ₯μ ν₯μν©λλ€.
μ°κΈ° μ§μ° μ μ₯μ (Write-Behind Storage)μ λμ λ°©μ
@Test
@DisplayName("μ°κΈ° μ§μ° μ μ₯μ νμΈ")
void test6() {
EntityTransaction et = em.getTransaction();
et.begin();
try {
Memo memo = new Memo();
memo.setId(2L);
memo.setUsername("Robbert");
memo.setContents("μ°κΈ° μ§μ° μ μ₯μ");
em.persist(memo);
Memo memo2 = new Memo();
memo2.setId(3L);
memo2.setUsername("Bob");
memo2.setContents("κ³Όμ° μ μ₯μ μ νκ³ μμκΉ?");
em.persist(memo2);
System.out.println("νΈλμμ
commit μ ");
et.commit();
System.out.println("νΈλμμ
commit ν");
} catch (Exception ex) {
ex.printStackTrace();
et.rollback();
} finally {
em.close();
}
emf.close();
}
μ λλ²κΉ
μ€νκ²°κ³Όλ₯Ό 보면 μ°κΈ° μ§μ° μ μ₯μ(actionQueue)λ₯Ό 보면 λ°λ‘ λ°μ΄ν° λ² μ΄μ€μ λ°μλμ§ μκ³ insertionsμ λ³κ²½ μ¬νμ΄ μ μ₯μ΄ μ μ₯λ κ²μ λ³Ό μ μμ΅λλ€.
commit() λ©μλ μ€ν ν(commit ν)
μ§μ° μ μ₯μ(actionQueue)μ μμλ‘ μ μ₯λμ΄ μλ insertions λ°μ΄ν°κ° μ¬λΌμ§ κ²μ λ³Ό μ μμ΅λλ€.
μ€μ κΈ°λ‘μ νμΈν΄ 보면, νΈλμμ μ»€λ° μ κΉμ§ SQL μμ²μ΄ μλ κ²μ΄, μ»€λ° ν ν λ²μ INSERT SQL λ κ°κ° μμλλ‘ λ°μ΄ν°λ² μ΄μ€μ μμ²λ κ²μ λ³Ό μ μμ΅λλ€.
flush() λ©μλ
flush() λ©μλλ JPAμ EntityManagerμμ μ€μν μν μ νλ λ©μλλ‘, μμμ± μ»¨ν μ€νΈμ λ³κ²½ μ¬νμ λ°μ΄ν°λ² μ΄μ€μ λ°μνλ κ³Όμ μ μ μ΄ν©λλ€. μ΄λ₯Ό ν΅ν΄ λ°μ΄ν°λ² μ΄μ€μμ λκΈ°νλ₯Ό λͺ μμ μΌλ‘ μνν μ μμ΅λλ€.
μ¦, μ°κΈ° μ§μ° μ μ₯μμ SQLλ€μ DBμ μμ²νλ μν μ μνν©λλ€.
flsuh() λ©μλκ° μ€μ λ‘ μ΄λ»κ² λμνλμ§ μ§μ νΈμΆν΄ 보면
@Test
@DisplayName("flush() λ©μλ νμΈ")
void test7() {
EntityTransaction et = em.getTransaction();
et.begin();
try {
Memo memo = new Memo();
memo.setId(4L);
memo.setUsername("Flush");
memo.setContents("Flush() λ©μλ νΈμΆ");
em.persist(memo);
System.out.println("flush() μ ");
em.flush(); // flush() μ§μ νΈμΆ
System.out.println("flush() ν\n");
System.out.println("νΈλμμ
commit μ ");
et.commit();
System.out.println("νΈλμμ
commit ν");
} catch (Exception ex) {
ex.printStackTrace();
et.rollback();
} finally {
em.close();
}
emf.close();
}
- μν°ν° μνμ λ³κ²½
- μ½λμμ memo μν°ν°λ₯Ό μμ±νκ³ , μ΄λ₯Ό μμμ± μ»¨ν μ€νΈμ μ μ₯νκΈ° μν΄ em.persist(memo)λ₯Ό νΈμΆν©λλ€. μ΄ μν°ν°λ μμμ± μ»¨ν μ€νΈμ μ°κΈ° μ§μ° μ μ₯μμ μ μ₯λ©λλ€.
flush() λ©μλ νΈμΆμ νΈμΆνλ©΄, μμμ± μ»¨ν μ€νΈμ μ μ₯λ λ³κ²½ μ¬νμ΄ λ°μ΄ν°λ² μ΄μ€μ μ¦μ λ°μλ κ²μ λ³Ό μ μμ΅λλ€.
μ΄ μμ μμ, JPAλ μ°κΈ° μ§μ° μ μ₯μμ μλ INSERT SQL λͺ λ Ήμ λ°μ΄ν°λ² μ΄μ€μ μμ²ν©λλ€. μ΄λ‘ μΈν΄ λ°μ΄ν°λ² μ΄μ€μ μνλ memo μν°ν°μ λ³κ²½ μ¬νμ ν¬ν¨νκ² λ©λλ€.
λ³κ²½ κ°μ§(dirty checking)λβ
JPAμμ μν°ν°μ μνκ° λ³κ²½λ λλ§λ€ UPDATE SQLμ΄ μ°κΈ° μ§μ° μ μ₯μμ μ μ₯λλ€λ©΄, λΉν¨μ¨μ μΈ μν©μ΄ λ°μν μ μμ΅λλ€.
μ¬λ¬ λ²μ UPDATE SQLμ΄ κ°κ° λ°μ΄ν°λ² μ΄μ€μ μμ²λλ©΄, λ°μ΄ν°λ² μ΄μ€μμ ν΅μ λΉμ©μ΄ μ¦κ°νκ³ μ±λ₯μ μ μν₯μ λ―ΈμΉ μ μμ΅λλ€. μ΄λ¬ν λ¬Έμ λ₯Ό λ°©μ§νκΈ° μν΄JPAλ λ³κ²½ κ°μ§ κΈ°λ₯(dirty checking)μ μ 곡ν©λλ€.
λ³κ²½ κ°μ§(Dirty Checking)λ JPAμ ν΅μ¬ κΈ°λ₯ μ€ νλλ‘, μν°ν°μ μν λ³κ²½μ μλμΌλ‘ μΆμ νκ³ ν¨μ¨μ μΌλ‘ λ°μ΄ν°λ² μ΄μ€μ λ°μνλ μν μ ν©λλ€.
λ³κ²½ κ°μ§(dirty checking)μ λμ λ°©μ
λ³κ²½ κ°μ§(Dirty Checking)μ μν°ν°μ μνλ₯Ό κ΄λ¦¬νκΈ° μν΄ JPAλ LoadedStateμ κ°μ κ°λ μ νμ©ν©λλ€.
JPAλ μμμ± μ»¨ν μ€νΈμ μν°ν°λ₯Ό μ μ₯ν λ, μ΅μ΄ μν(LoadedState)λ₯Ό κΈ°λ‘ν©λλ€.
μ΄ν νΈλμμ μ΄ μ»€λ°λκ±°λ em.flush()κ° νΈμΆλλ©΄ JPAλ μν°ν°μ νμ¬ μνμ μ΅μ΄ μνλ₯Ό λΉκ΅νμ¬, λ³κ²½λ λΆλΆμ ν¨μ¨μ μΌλ‘ μ²λ¦¬ν©λλ€. μ΄ κ³Όμ μ λ³κ²½ κ°μ§(Dirty Checking)λΌκ³ λΆλ¦ λλ€.
κ·Έλ¬λ©΄ μ€μ λ‘ λμνλ κ³Όμ μ λ€μκ³Ό κ°μ΅λλ€.
@Test
@DisplayName("λ³κ²½ κ°μ§ νμΈ")
void test8() {
EntityTransaction et = em.getTransaction();
et.begin();
try {
System.out.println("λ³κ²½ν λ°μ΄ν°λ₯Ό μ‘°νν©λλ€.");
Memo memo = em.find(Memo.class, 4);
System.out.println("memo.getId() = " + memo.getId());
System.out.println("memo.getUsername() = " + memo.getUsername());
System.out.println("memo.getContents() = " + memo.getContents());
System.out.println("\nμμ μ μ§νν©λλ€.");
memo.setUsername("Update");
memo.setContents("λ³κ²½ κ°μ§ νμΈ");
System.out.println("νΈλμμ
commit μ ");
et.commit();
System.out.println("νΈλμμ
commit ν");
} catch (Exception ex) {
ex.printStackTrace();
et.rollback();
} finally {
em.close();
}
emf.close();
}
- μν°ν° μ‘°ν λ° μ΄κΈ° μν μΆλ ₯
- em.find(Memo.class, 4)λ₯Ό ν΅ν΄ μν°ν°λ₯Ό μ‘°νν©λλ€. μ΄λ μν°ν°λ μμμ± μ»¨ν μ€νΈμ μν΄ κ΄λ¦¬λ©λλ€.
- μ‘°νλ μν°ν°μ νμ¬ μν(memo.getUsername(), memo.getContents())λ₯Ό μΆλ ₯ν©λλ€. μ΄ μνλ LoadedStateλ‘, μν°ν°μ μ΄κΈ° μνλ₯Ό λνλ λλ€.
- μν°ν° μν λ³κ²½
- memo.setUsername("Update")μ memo.setContents("λ³κ²½ κ°μ§ νμΈ") λ©μλλ₯Ό νΈμΆνμ¬ μν°ν°μ μνλ₯Ό λ³κ²½ν©λλ€. μ΄ μμ μμ μν°ν°μ μνλ Managed μνμμ λ³κ²½λμμΌλ©°, JPAλ μ΄ λ³κ²½ μ¬νμ κ°μ§ν©λλ€.
- νΈλμμ
컀λ°
- et.commit()μ νΈμΆνλ©΄, JPAλ νμ¬ μνμ μ΅μ΄ μνλ₯Ό λΉκ΅νμ¬ λ³κ²½λ λΆλΆλ§μ ν¬ν¨νλ UPDATE SQLμ μμ±ν©λλ€.
- μ΄ UPDATE SQLμ μ°κΈ° μ§μ° μ μ₯μμ μ μ₯λ ν, λ°μ΄ν°λ² μ΄μ€μ μ μ‘λλ©΄μ μ€μ λ‘ μνκ° μ λ°μ΄νΈλ©λλ€.
- κ²°κ³Ό νμΈ
- νΈλμμ μ»€λ° ν UPDATE SQLμ΄ λ°μ΄ν°λ² μ΄μ€μ μμ²λ κ²μ νμΈν μ μμ΅λλ€. μ΄λ JPAκ° μλμΌλ‘ λ³κ²½ μ¬νμ κ°μ§νκ³ μ²λ¦¬νμμ μλ―Έν©λλ€.