JPAμ νΈλμμ
νΈλμμ μ΄λ?
- νΈλμμ μ DB λ°μ΄ν°λ€μ 무결μ±κ³Ό μ ν©μ±μ μ μ§νκΈ° μν νλμ λ Όλ¦¬μ κ°λ
- κ°μ₯ ν° νΉμ§μ μ¬λ¬ κ°μ SQLμ΄ νλμ νΈλμμ μ ν¬ν¨λ μ μμ
- μ΄λ, λͺ¨λ SQLμ΄ μ±κ³΅μ μΌλ‘ μνμ΄ λλ©΄ DBμ μꡬμ μΌλ‘ λ³κ²½μ λ°μνμ§λ§ SQL μ€ λ¨ νλλΌλ μ€ν¨νλ€λ©΄ λͺ¨λ λ³κ²½μ λλλ¦Ό
- μμμ± μ»¨ν μ€νΈμ Entity κ°μ²΄λ€μ μ μ₯νλ€κ³ ν΄μ DBμ λ°λ‘ λ°μλμ§ μμ
DBμμ νλμ νΈλμμ μ μ¬λ¬ κ°μ SQLμ ν¬ν¨νκ³ μλ€κ° λ§μ§λ§μ μꡬμ μΌλ‘ λ³κ²½μ λ°μνλ κ² μ²λΌ JPAμμλ μμμ± μ»¨ν μ€νΈλ‘ κ΄λ¦¬νκ³ μλ λ³κ²½μ΄ λ°μν κ°μ²΄λ€μ μ 보λ₯Ό μ°κΈ° μ§μ° μ μ₯μμ μ λΆ κ°μ§κ³ μλ€κ° λ§μ§λ§μ SQLμ νλ²μ DBμ μμ²μ λ³κ²½μ λ°μν¨
JPAμμ μ΄λ¬ν νΈλμμ μ κ°λ μ μ μ©νκΈ° μν΄μλ EntityManagerμμ
EntityTransaction
μ κ°μ Έμ νΈλμμ μ μ© κ°λ₯EntityTransaction et = em.getTransaction();
et.begin();
: νΈλμμ μμet.commit();
: νΈλμμ μ μμ λ€μ μꡬμ μΌλ‘ DBμ λ°μet.rollback();
: μ€λ₯κ° λ°μνμ λ νΈλμμ μ μμ μ λͺ¨λ μ·¨μνκ³ , μ΄μ μνλ‘ λλλ¦Ό
μμμ± μ»¨ν μ€νΈμ κΈ°λ₯
π μμμ± μ»¨ν μ€νΈλ Entity κ°μ²΄λ₯Ό ν¨μ¨μ μΌλ‘ μ½κ² κ΄λ¦¬νκΈ° μν΄ λ§λ€μ΄μ§ 곡κ°
1μ°¨ μΊμ
- μμμ± μ»¨ν
μ€νΈλ λ΄λΆμ μΌλ‘ μΊμ μ μ₯μλ₯Ό κ°μ§κ³ μμ
- Entity κ°μ²΄λ€μ΄ 1μ°¨ μΊμ μ¦, μΊμ μ μ₯μμ μ μ₯λ¨
- μΊμ μ μ₯μλ Map μλ£κ΅¬μ‘° νν
- keyμλ @Idλ‘ λ§€νν κΈ°λ³Έ ν€ μ¦, μλ³μ κ°μ μ μ₯
- valueμλ ν΄λΉ Entity ν΄λμ€μ κ°μ²΄λ₯Ό μ μ₯
- μμμ± μ»¨ν μ€νΈλ μΊμ μ μ₯μμ keyμ μ μ₯ν μλ³μ κ°μ μ¬μ©νμ¬ Entity κ°μ²΄λ₯Ό ꡬλΆνκ³ κ΄λ¦¬
Entity μ μ₯
em.persist(memo);
-> memo Entity κ°μ²΄λ₯Ό μΊμ μ μ₯μμ μ μ₯
Entity μ‘°ν
- μΊμ μ μ₯μμ μ‘°ννλ Idκ° μ‘΄μ¬νμ§ μλ κ²½μ°
- μΊμ μ μ₯μ μ‘°ν
- DB SELECT μ‘°ν ν μΊμ μ μ₯μμ μ μ₯
em.find(Memo.class, 1);
νΈμΆ μ μΊμ μ μ₯μμ ν΄λΉ κ°μ΄ μλ€λ©΄?
-> DBμ SELECT μ‘°ν ν ν΄λΉ κ°μ μΊμ μ μ₯μμ μ μ₯νκ³ λ°ν
- μΊμ μ μ₯μ μ‘°ν
- μΊμ μ μ₯μμ μ‘°ννλ Idκ° μ‘΄μ¬νλ κ²½μ°
em.find(Memo.class, 1);
νΈμΆ μ μΊμ μ μ₯μμ μλ³μ κ°μ΄ 1μ΄λ©΄μ Memo Entity νμ μΈ κ°μ΄ μλμ§ μ‘°ν -> μλ€λ©΄ λ°ν1μ°¨ μΊμ μ¬μ© μ₯μ
- DB μ‘°ν νμλ₯Ό μ€μ
- 1μ°¨ μΊμλ₯Ό μ¬μ©ν΄ DB row 1κ° λΉ κ°μ²΄ 1κ°κ° μ¬μ©λλ κ²μ 보μ₯(
κ°μ²΄ λμΌμ± 보μ₯
)
Entity μμ
- μμ ν Entityλ₯Ό μ‘°νν ν μΊμ μ μ₯μμ μλ€λ©΄ DBμ μ‘°νν΄μ μ
em.remove(entity);
em.remove(memo);
νΈμΆ μ μμ ν Entityλ₯Ό DELETED μνλ‘ λ§λ ν νΈλμμ commit ν DELETE SQLμ΄ DBμ μμ²λ¨
μ°κΈ° μ§μ° μ μ₯μ(ActionQueue)
- JPAκ° νΈλμμ
μ²λΌ SQLμ λͺ¨μμ ν λ²μ DBμ λ°μν¨
- JPAλ μ΄λ₯Ό ꡬννκΈ° μν΄ μ°κΈ° μ§μ° μ μ₯μλ₯Ό λ§λ€μ΄ SQLμ λͺ¨μλκ³ μλ€κ° νΈλμμ commit ν ν λ²μ DBμ λ°μν¨
flush()
- νΈλμμ commit ν μ°κΈ° μ§μ° μ μ₯μμ SQLλ€μ ν λ²μ μμ²λ¨
- μ¬μ€ commit ν μΆκ°μ μΈ λμμ΄ μλλ° μ΄κ²μ΄
em.flush();
λ©μλ νΈμΆ - flush λ©μλλ μμμ± μ»¨ν
μ€νΈμ λ³κ²½ λ΄μ©λ€μ DBμ λ°μνλ μν μ μν
- μ¦, μ°κΈ° μ§μ° μ μ₯μμ SQLλ€μ DBμ μμ²νλ μν μ μν
em.flush();
νΈμΆλμ λ°λ‘ DBμ μ°κΈ° μ§μ° μ μ₯μμ SQLμ΄ μμ²- μ΄λ―Έ μ°κΈ° μ§μ° μ μ₯μμ SQLμ΄ μμ²λμκΈ° λλ¬Έμ λ μ΄μ μμ²ν SQLμ΄ μμ΄ νΈλμμ μ΄ commit λ νμ SQL κΈ°λ‘μ΄ μμ
- μΆκ°) νΈλμμ
μ μ€μ νμ§ μκ³ flush λ©μλλ₯Ό νΈμΆνλ©΄
no transaction is in progress
λ©μΈμ§μ ν¨κ»TransactionRequiredException
μ€λ₯κ° λ°μ- insert, update, delete μ¦, λ°μ΄ν° λ³κ²½ SQLμ DBμ μμ² λ° λ°μνκΈ° μν΄μλ νΈλμμ
μ΄ νμ
λ³κ²½ κ°μ§(Dirty Checking)
- insert, update, delete μ¦, λ°μ΄ν° λ³κ²½ SQLμ DBμ μμ² λ° λ°μνκΈ° μν΄μλ νΈλμμ
μ΄ νμ
- μμμ± μ»¨ν
μ€νΈμ μ μ₯λ Entityκ° λ³κ²½λ λλ§λ€ Update SQLμ΄ μ°κΈ° μ§μ° μ μ₯μμ μ μ₯λλ€λ©΄??????
- νλμ Update SQLλ‘ μ²λ¦¬ν μ μλ μν©μ μ¬λ¬ λ² Update SQLμ μμ²νκ² λκΈ° λλ¬Έμ λΉν¨μ¨μ
- κ·Έλ λ€λ©΄ JPAλ μ΄λ»κ² Updateλ₯Ό μ²λ¦¬?
em.update(entity);
κ°μ λ©μλλ μμ π
- JPAλ μμμ± μ»¨ν
μ€νΈμ Entityλ₯Ό μ μ₯ν λ μ΅μ΄ μν(LoadedState)λ₯Ό μ μ₯
- νΈλμμ
μ΄ commitλκ³
em.flush();
κ° νΈμΆλλ©΄ Entityμ νμ¬ μνμ μ μ₯ν μ΅μ΄ μνλ₯Ό λΉκ΅ - λ³κ²½ λ΄μ©μ΄ μλ€λ©΄ Update SQLμ μμ±νμ¬ μ°κΈ° μ§μ° μ μ₯μμ μ μ₯νκ³ λͺ¨λ μ°κΈ° μ§μ° μ μ₯μμ SQLμ DBμ μμ²
- λ§μ§λ§μΌλ‘ DBμ νΈλμμ μ΄ commit λλ©΄μ λ°μλ¨
- νΈλμμ
μ΄ commitλκ³
- λ°λΌμ λ³κ²½νκ³ μΆμ λ°μ΄ν°κ° μλ€λ©΄ λ¨Όμ λ°μ΄ν°λ₯Ό μ‘°ννκ³ ν΄λΉ Entity κ°μ²΄μ λ°μ΄ν°λ₯Ό λ³κ²½νλ©΄ μλμΌλ‘ Update SQLμ΄ μμ±λκ³ DBμ λ°μλ¨
- μ΄λ¬ν κ³Όμ μ λ³κ²½ κ°μ§,
Dirty Checking
μ΄λΌκ³ ν¨
- μ΄λ¬ν κ³Όμ μ λ³κ²½ κ°μ§,
'λ΄μΌλ°°μμΊ ν' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Spring μ λ¬Έ 2μ£Όμ°¨ : JPA - 4 (0) | 2023.11.07 |
---|---|
Spring μ λ¬Έ 2μ£Όμ°¨ : JPA - 3 (0) | 2023.11.07 |
Spring μ λ¬Έ 2μ£Όμ°¨ : JPA - 1 (0) | 2023.11.07 |
Spring μ λ¬Έ 2μ£Όμ°¨ : IoCμ DI (1) | 2023.11.03 |
Spring μ λ¬Έ 2μ£Όμ°¨: Layer Architecture (0) | 2023.11.03 |