[Spring] JPA μμμ± μ»¨ν μ€νΈ μ΄ν΄νκΈ°
π€ μμμ± μ»¨ν μ€νΈλ?
JPA μμμ± μ»¨ν
μ€νΈ (Persistence Context) λ μν°ν°λ₯Ό μꡬ μ μ₯νλ νκ²½μ΄λΌλ λ»μΌλ‘, μ ν리μΌμ΄μ
κ³Ό λ°μ΄ν°λ² μ΄μ€ μ¬μ΄μμ μν°ν°λ₯Ό κ΄λ¦¬νλ λ
Όλ¦¬μ μΈ μμμ
λλ€. EntityManager
λ‘ μν°ν°λ₯Ό μ μ₯νκ±°λ μ‘°ννλ©΄ EntityManager
λ μμμ± μ»¨ν
μ€νΈμ μν°ν°λ₯Ό 보κ΄νκ³ κ΄λ¦¬ν©λλ€.
π« μν°ν°μ μλͺ μ£ΌκΈ°
μν°ν°μλ 4κ°μ§ μνκ° μ‘΄μ¬ν©λλ€.
- λΉμμ(new/transient) : μμμ± μ»¨ν μ€νΈμ μ ν κ΄κ³κ° μλ μν
- μμ(managed) : μμμ± μ»¨ν μ€νΈμ μ μ₯λ μν (μμμ± μ»¨ν μ€νΈμ μν΄ κ΄λ¦¬λλ€λ λ»)
- μ€μμ(detached) : μμμ± μ»¨ν μ€νΈμ μ μ₯λμλ€κ° λΆλ¦¬λ μν
- μμ (removed) : μμ λ μν
π«§ λΉμμ
μν°ν° κ°μ²΄λ₯Ό μμ±νκ³ μμ§ μ μ₯νμ§ μμλ€λ©΄ μμμ± μ»¨ν μ€νΈλ λ°μ΄ν°λ² μ΄μ€μλ μ ν κ΄λ ¨μ΄ μλ μνμ λλ€. μ΄κ²μ λΉμμ μνλΌ ν©λλ€.
// κ°μ²΄λ₯Ό μμ±ν μν (λΉμμ)
User user = new User();
user.setId("user1");
user.setName("νμ1");
π«§ μμ
μν°ν° λ§€λμ λ₯Ό ν΅ν΄μ μν°ν°λ₯Ό μμμ± μ»¨ν
μ€νΈμ μ μ₯νλ©΄, μμμ± μ»¨ν
μ€νΈκ° μν°ν°λ₯Ό κ΄λ¦¬νκ² λ©λλ€. μ΄κ²μ μμ μνλΌ ν©λλ€. em.find()
λ JPQL μ μ¬μ©ν΄μ μ‘°νν μν°ν°λ μμμ± μ»¨ν
μ€νΈκ° κ΄λ¦¬νλ μμ μνμ
λλ€.
// κ°μ²΄λ₯Ό μ μ₯ν μν (μμ)
em.persist(user);
π«§ μ€μμ
μμμ± μ»¨ν
μ€νΈκ° κ΄λ¦¬νλ μμ μνμ μν°ν°λ₯Ό μμμ± μ»¨ν
μ€νΈκ° κ΄λ¦¬νμ§ μμΌλ©΄ μ€μμ μνκ° λ©λλ€. em.detach()
, em.close()
, em.clear()
λ₯Ό νΈμΆνλ κ²½μ° μμμ± μ»¨ν
μ€νΈκ° κ΄λ¦¬νλ μμ μνμ μν°ν°λ μ€μμ μνκ° λ©λλ€.
// νμ μν°ν°λ₯Ό μμμ± μ»¨ν
μ€νΈμμ λΆλ¦¬ (μ€μμ)
em.detach(user);
π«§ μμ
μν°ν°λ₯Ό μμμ± μ»¨ν μ€νΈμ λ°μ΄ν°λ² μ΄μ€μμ μμ ν μνμ λλ€.
// κ°μ²΄λ₯Ό μμ ν μν (μμ )
em.remove(user);
βοΈ μμμ± μ»¨ν μ€νΈλ₯Ό μ¬μ©νλ μ΄μ
μμμ± μ»¨ν μ€νΈκ° μν°ν°λ₯Ό κ΄λ¦¬νλ©΄ λ€μκ³Ό κ°μ μ₯μ μ΄ μμ΅λλ€.
- 1μ°¨ μΊμ
- λμΌμ± 보μ₯
- νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°
- λ³κ²½ κ°μ§
- μ§μ° λ‘λ©
π₯ μν°ν° μ‘°ν
μμμ± μ»¨ν μ€νΈλ λ΄λΆμ μΊμλ₯Ό κ°μ§κ³ μλλ°, μ΄λ₯Ό 1μ°¨ μΊμλΌ ν©λλ€.
μ½κ² μκΈ°ν΄μ μμμ± λ΄λΆμ Map
μ΄ νλ μλλ°, ν€λ @Id
λ‘ λ§€νν μλ³μκ³ κ°μ μν°ν° μΈμ€ν΄μ€μ
λλ€.
μν°ν°λ₯Ό μ‘°νν λ 1μ°¨ μΊμμμ μν°ν°λ₯Ό μ°Ύκ³ λ§μ½ 1μ°¨ μΊμμ μμΌλ©΄ λ°μ΄ν°λ² μ΄μ€μμ μ‘°νν©λλ€.
1μ°¨ μΊμμμ λ°λ‘ μν°ν°λ₯Ό μ‘°νν μ μλ κ²½μ° μ±λ₯μ μ΄μ μ λ릴 μ μμ΅λλ€.
π₯ μν°ν° λ±λ‘
EntityManager
λ νΈλμμ
μ 컀λ°νκΈ° μ§μ κΉμ§ λ°μ΄ν°λ² μ΄μ€μ μν°ν°λ₯Ό μ μ₯νμ§ μκ³ λ΄λΆ 쿼리 μ μ₯μμ INSERT SQL μ 차곑차곑 λͺ¨μλ‘λλ€. κ·Έλ¦¬κ³ νΈλμμ
μ 컀λ°ν λ λͺ¨μλ 쿼리λ₯Ό λ°μ΄ν°λ² μ΄μ€μ 보λ΄λλ° μ΄κ²μ νΈλμμ
μ μ§μνλ μ°κΈ° μ§μ° (transactional write-behind) μ΄λΌ ν©λλ€.
νΈλμμ
μ commit()
νλ©΄ μν°ν° λ§€λμ λ μ°μ μμμ± μ»¨ν
μ€νΈλ₯Ό flush()
ν©λλ€. flush()
λ μμμ± μ»¨ν
μ€νΈμ λ³κ²½ λ΄μ©μ λ°μ΄ν°λ² μ΄μ€μ λκΈ°ννλ μμ
μΈλ° μ΄ λ λ±λ‘, μμ , μμ ν μν°ν°λ₯Ό λ°μ΄ν°λ² μ΄μ€μ λ°μν©λλ€. ꡬ체μ μΌλ‘ μ΄μΌκΈ°νλ©΄ μ°κΈ° μ§μ° SQL μ μ₯μμ λͺ¨μΈ 쿼리λ₯Ό λ°μ΄ν°λ² μ΄μ€μ 보λΈλ€λ λ»μ
λλ€.
π₯ λ³κ²½ κ°μ§
μν°ν°μ λ³κ²½μ¬νμ λ°μ΄ν°λ² μ΄μ€μ μλμΌλ‘ λ°μνλ κΈ°λ₯μ λ³κ²½ κ°μ§ (dirty checking) λΌκ³ ν©λλ€.
JPA λ μν°ν°λ₯Ό μμμ± μ»¨ν μ€νΈμ 보κ΄ν λ, μ΅μ΄ μνλ₯Ό 볡μ¬ν΄μ μ μ₯ν΄λλλ° μ΄κ²μ μ€λ μ·μ΄λΌ ν©λλ€.
κ·Έλ¦¬κ³ flush()
μμ μ μ€λ
μ·κ³Ό μν°ν°λ₯Ό λΉκ΅ν΄μ λ³κ²½λ μν°ν°λ₯Ό μ°Ύμ΅λλ€.
- νΈλμμ
μ
commit()
νλ©΄EntityManager
λ΄λΆμμ λ¨Όμ flush()
κ° νΈμΆλ©λλ€.
- μν°ν°μ μ€λ μ·μ λΉκ΅ν΄μ λ³κ²½λ μν°ν°λ₯Ό μ°Ύμ΅λλ€.
- λ³κ²½λ μν°ν°κ° μμΌλ©΄ μμ 쿼리λ₯Ό μμ±ν΄μ μ°κΈ° μ§μ° SQL μ μ₯μμ 보λ λλ€.
- μ°κΈ° μ§μ° μ μ₯μμ SQL μ λ°μ΄ν°λ² μ΄μ€μ 보λ λλ€.
- λ°μ΄ν°λ² μ΄μ€ νΈλμμ
μ
commit()
ν©λλ€.
λ³κ²½ κ°μ§λ μμμ± μ»¨ν μ€νΈκ° κ΄λ¦¬νλ μμ μνμ μν°ν°μλ§ μ μ©λ©λλ€.
π₯ μν°ν° μμ
μν°ν°λ₯Ό μμ νλ©΄ μν°ν° λ±λ‘κ³Ό λΉμ·νκ² μμ 쿼리λ₯Ό μ°κΈ° μ§μ° SQL μ μ₯μμ 보κ΄ν©λλ€.
μ΄ν νΈλμμ
μ commit()
ν΄μ flush()
λ₯Ό νΈμΆνλ©΄ μ€μ λ°μ΄ν°λ² μ΄μ€μ μμ 쿼리λ₯Ό μ λ¬ν©λλ€.
λ¨, em.remove()
λ₯Ό νΈμΆν μκ° μμμ± μ»¨ν
μ€νΈμμ μμ λ©λλ€.
π μ°Έκ³
μλ° ORM νμ€ JPA νλ‘κ·Έλλ° - κΉμν