π 3/13(μ) λ΄μΌλ°°μμΊ ν Java-Spring 54μΌμ°¨ TIL - SpringData JPA μμμ± μ»¨ν μ€νΈ
π μ€λμ νμ΅ ν€μλ
- SpringData JPA - μμμ± μ»¨ν μ€νΈ
π μμμ± μ»¨ν μ€νΈλ?
μμμ± μ»¨ν μ€νΈ(Persistence Context)λ JPA(Java Persistence API)μμ ν΅μ¬μ μΈ κ°λ μ€ νλλ‘, μν°ν°(Entity) κ°μ²΄λ₯Ό κ΄λ¦¬νλ νκ²½μ μλ―Ένλ€. μμμ± μ»¨ν μ€νΈλ μν°ν°μ μνλ₯Ό μΆμ νκ³ κ΄λ¦¬νμ¬ λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ©μ λ΄λΉνλ€. μν°ν°λ₯Ό μꡬ μ μ₯νλ νκ²½μΌλ‘ μν°ν° λ§€λμ λ₯Ό ν΅ν΄ μμμ± μ»¨ν μ€νΈμ μ κ·Όνλ€.
π μν°ν°(Entity)λ?
μν°ν°λ λ°μ΄ν°λ² μ΄μ€μ ν μ΄λΈμ λμνλ ν΄λμ€λΌκ³ μκ°νλ©΄ λλ€. @Entityκ° λΆμ ν΄λμ€λ JPAμμ κ΄λ¦¬νλ©° μ΄λ₯Ό μν°ν°λΌκ³ νλ€. ν΄λμ€ μ체λ μμ±ν μΈμ€ν΄μ€λ μν°ν°λΌκ³ λΆλ₯Έλ€.
π μν°ν° λ§€λμ (Entity Manager)λ?
μν°ν° λ§€λμ λ μμμ± μ»¨ν μ€νΈμ μ κ·Όνμ¬ μν°ν°μ λν λ°μ΄ν°λ² μ΄μ€ μμ μ μ 곡νλ€. λ΄λΆμ μΌλ‘ λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ μ μ¬μ©ν΄μ λ°μ΄ν°λ² μ΄μ€μ μ κ·Όνλ€.
π μμμ±μ΄λ?
λ°μ΄ν°λ₯Ό μμ±ν νλ‘κ·Έλ¨μ΄ μ’ λ£λμ΄λ μ¬λΌμ§μ§ μλ λ°μ΄ν°μ νΉμ±μ λ§νλ€. μμμ±μ κ°μ§ μμΌλ©΄ λ°μ΄ν°λ λ©λͺ¨λ¦¬μμλ§ μ‘΄μ¬νκ² λκ³ νλ‘κ·Έλ¨μ΄ μ’ λ£λλ©΄ ν΄λΉ λ°μ΄ν°λ λͺ¨λ μ¬λΌμ§κ² λλ€. κ·Έλμ μ°λ¦¬λ λ°μ΄ν°λ₯Ό νμΌμ΄λ DBμ μꡬ μ μ₯ν¨μΌλ‘μ¨ λ°μ΄ν°μ μμμ±μ λΆμ¬νλ€.
π μμμ± μ»¨ν μ€νΈμ νΉμ§
- μν°ν° κ΄λ¦¬ : μμμ± μ»¨ν μ€νΈλ μν°ν° κ°μ²΄λ₯Ό κ΄λ¦¬νλ€. μν°ν° κ°μ²΄λ₯Ό μμ±νκ³ , μ‘°ννκ³ , μμ νκ³ , μμ νλ μμ μ ν΅ν΄ μν°ν°μ μλͺ μ£ΌκΈ°λ₯Ό μΆμ νκ³ , μν°ν°μ μνλ₯Ό κ΄λ¦¬νλ€.
- μν°ν°μ λ°μ΄ν°λ² μ΄μ€ κ°μ λ§€ν : μμμ± μ»¨ν μ€νΈλ μν°ν°μ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈ κ°μ λ§€νμ λ΄λΉνλ€. μν°ν° κ°μ²΄μ μν λ³κ²½μ΄ λ°μ΄ν°λ² μ΄μ€μ λ°μλλλ‘ μ μ ν SQL 쿼리λ₯Ό μμ±νκ³ μ€ννλ€.
- λμΌμ± 보μ₯ : μμμ± μ»¨ν μ€νΈλ μν°ν° κ°μ²΄μ λμΌμ±μ 보μ₯νλ€. κ°μ μν°ν° μλ³μ(primary key)λ₯Ό κ°μ§ μν°ν° κ°μ²΄λ μμμ± μ»¨ν μ€νΈ λ΄μμ λμΌν μΈμ€ν΄μ€λ‘ κ΄λ¦¬λλ€. 1μ°¨ μΊμμ μ μ₯λ μν°ν°λ₯Ό μ‘°ννκΈ° λλ¬Έμ νλμ νΈλμμ μμ κ°μ ν€κ°μΌλ‘ μμμ± μ»¨ν μ€νΈμ μ μ₯λ μν°ν° μ‘°ν μ, κ°μ μν°ν° μ‘°νλ₯Ό 보μ₯νλ€.
- νΈλμμ λ²μ : μμμ± μ»¨ν μ€νΈλ νΈλμμ λ²μ λ΄μμ λμνλ€. μ¦, νΈλμμ μ μμνκ³ μ’ λ£ν λκΉμ§ μν°ν°μ λ³κ²½μ μΆμ νκ³ κ΄λ¦¬ν©λλ€. νΈλμμ μ΄ μ’ λ£λλ©΄ μμμ± μ»¨ν μ€νΈκ° μν°ν°μ λ³κ²½μ λ°μ΄ν°λ² μ΄μ€μ λ°μνλ€.
- μ§μ° λ‘λ© : μμμ± μ»¨ν μ€νΈλ μ§μ° λ‘λ©(Lazy Loading)μ μ§μνλ€. μ°κ΄λ μν°ν°λ₯Ό μ€μ λ‘ μ¬μ©ν λκΉμ§ λ°μ΄ν°λ² μ΄μ€μμ λ°μ΄ν°λ₯Ό λ‘λνμ§ μκ³ , νμν λ λ‘λ©μ μννλ€.
- μΊμ : μμμ± μ»¨ν μ€νΈλ μΌμ’ μ μΊμ μν μ νλ€. 1μ°¨ μΊμκ° μ‘΄μ¬νλ©° Map<KEY, VALUE>λ‘ μ μ₯λλ€. μ΄λ―Έ λ‘λλ μν°ν°λ μμμ± μ»¨ν μ€νΈ λ΄μ μΊμ±λμ΄ μ¬μ¬μ©λ μ μμΌλ©°, entityManager.find() λ©μλ νΈμΆ μ μμμ± μ»¨ν μ€νΈμ 1μ°¨ μΊμλ₯Ό μ‘°ννλ€. μ‘°νν μν°ν°κ° μ‘΄μ¬ν κ²½μ° ν΄λΉ μν°ν°λ₯Ό λ°ννκ³ , μν°ν°κ° μμΌλ©΄ λ°μ΄ν°λ² μ΄μ€μμ μ‘°ν ν 1μ°¨ μΊμμ μ μ₯ λ° λ°ννλ€.
π μμμ± μ»¨ν μ€νΈ μ¬μ©μ μ΄μ
μ ν리μΌμ΄μ
κ³Ό λ°μ΄ν°λ² μ΄μ€ μ¬μ΄μ μμμ± μ»¨ν
μ€νΈλΌλ μ€κ° κ³μΈ΅μ΄ μμΌλ©΄ λ²νΌλ§, μΊμ± λ±μ ν μ μλ€λ μ₯μ μ΄ μλ€. μμμ± μ»¨ν
μ€νΈμ νΉμ§μ λ°λ₯Έ μ΄μ μ μμ보μ.
- 1μ°¨μΊμ
μμμ± μ»¨ν μ€νΈμλ 1μ°¨ μΊμκ° μ‘΄μ¬νλ©° Map<key, value="">λ‘ μ μ₯λλ€. e</key,>ntityManager.find() λ©μλ νΈμΆ μ μμμ± μ»¨ν μ€νΈμ 1μ°¨ μΊμλ₯Ό μ‘°ννλ€. μ‘°νν μν°ν°κ° μ‘΄μ¬ν κ²½μ° ν΄λΉ μν°ν°λ₯Ό λ°ννκ³ , μν°ν°κ° μμΌλ©΄ λ°μ΄ν°λ² μ΄μ€μμ μ‘°ν ν 1μ°¨ μΊμμ μ μ₯ λ° λ°ννλ€.
- λμΌμ± 보μ₯
νλμ νΈλμμ μμ κ°μ ν€κ°μΌλ‘ μμμ± μ»¨ν μ€νΈμ μ μ₯λ μν°ν° μ‘°ν μ, κ°μ μν°ν° μ‘°νλ₯Ό 보μ₯νλ€. 1μ°¨ μΊμμ μ μ₯λ μν°ν°λ₯Ό μ‘°ννκΈ° λλ¬Έμ λμΌμ± 보μ₯μ΄ κ°λ₯νλ€.
- μ°κΈ° μ§μ°
μμμ± μ»¨ν μ€νΈμλ μ°κΈ° μ§μ° SQL μ μ₯μκ° μ‘΄μ¬νλ€. entityManager.persist()λ₯Ό νΈμΆνλ©΄ 1μ°¨ μΊμμ μ μ₯λλ κ²κ³Ό λμμ μ°κΈ° μ§μ° SQL μ μ₯μμ SQLλ¬Έμ΄ μ μ₯λλ€. μ΄λ κ² SQLμ μμλκ³ νΈλμμ μ 컀λ°νλ μμ μ μ μ₯λ SQLλ¬Έλ€μ΄ flushλλ©΄μ λ°μ΄ν°λ² μ΄μ€μ λ°μλλ€. μ΄λ κ² λͺ¨μμ 보λ΄κΈ° λλ¬Έμ μ±λ₯μμλ μ΄μ μ λ³Ό μ μλ€.
- λ³κ²½ κ°μ§
JPAλ 1μ°¨ μΊμμ λ°μ΄ν°λ² μ΄μ€μμ μ²μ λΆλ¬μ¨ μν°ν°μ μ€λ μ· κ°μ κ°κ³ μλ€. κ·Έλ¦¬κ³ 1μ°¨ μΊμμ μ μ₯λ μν°ν°μ μ€λ μ·μ λΉκ΅ ν λ³κ²½ λ΄μ©μ΄ μλ€λ©΄ UPDATE SQLλ¬Έμ μ°κΈ° μ§μ° SQL μ μ₯μμ λ΄μλλ€. κ·Έλ¦¬κ³ λ°μ΄ν°λ² μ΄μ€μ μ»€λ° μμ μ λ³κ²½ λ΄μ©μ μλμΌλ‘ λ°μνλ€. μ¦, λ°λ‘ updateλ¬Έμ νΈμΆν νμκ° μλ€.
π μν°ν°μ μλͺ μ£ΌκΈ°
μν°ν° μλͺ μ£ΌκΈ°μ μ’ λ₯λ‘λ λ€κ°μ§κ° μλ€.
- λΉμμ(new/transient) - μν°ν° κ°μ²΄κ° λ§λ€μ΄μ Έμ μμ§ μ μ₯λμ§ μμ μνλ‘, μμμ± μ»¨ν μ€νΈμ μ ν κ΄κ³κ° μλ μν
- μμ(managed) - μν°ν°κ° μμμ± μ»¨ν μ€νΈμ μ μ₯λμ΄, μμμ± μ»¨ν μ€νΈκ° κ΄λ¦¬ν μ μλ μν μμ μνμμ λ°μ΄ν°λ² μ΄μ€μ μ μ₯λμ§ μμΌλ©°, νΈλμμ μ»€λ° μμ μ λ°μ΄ν°λ² μ΄μ€μ λ°μ
- μ€μμ(detached) - μν°ν°κ° μμμ± μ»¨ν μ€νΈμ μ μ₯λμ΄ μλ€κ° λΆλ¦¬λ μνλ‘, μμμ± μ»¨ν μ€νΈκ° λ μ΄μ κ΄λ¦¬νμ§ μλ μν
- μμ (removed) - μν°ν°λ₯Ό μμμ± μ»¨ν μ€νΈμ λ°μ΄ν°λ² μ΄μ€μμ μμ νκ² λ€κ³ νμν μν
π λμνμΈν΄λ³΄κΈ°
μν μν°ν°λ₯Ό λ§λ€μ΄μ μμμ± μ»¨ν μ€νΈμ μ μ₯ ν, λ°μ΄ν°λ² μ΄μ€μ λ°μν΄λ³΄μ.
Item item = new Item(); // 1
item.setItemNm("ν
μ€νΈ μν");
EntityManager em = entityManagerFactory.createEntityManager(); // 2
EntityTransaction transaction = em.getTransaction(); // 3
transaction.begin();
em.persist(item); // 4-1
em.flush(item). // 4-2 (DBμ SQL 보λ΄κΈ°/commitμ μλμνλμ΄ μλ΅ κ°λ₯ν¨)
transaction.commit(); // 5
em.close(); // 6
1οΈβ£ μμμ± μ»¨ν
μ€νΈμ λ΄μ μν μν°ν° μμ±
2οΈβ£ μν°ν° λ§€λμ ν©ν 리λ‘λΆν° μν°ν° λ§€λμ λ₯Ό μμ±
3οΈβ£ λ°μ΄ν° λ³κ²½ μ 무결μ±μ μν΄ νΈλμμ
μμ
4οΈβ£ μμμ± μ»¨ν
μ€νΈμ μ μ₯λ μν, μμ§ DBμ INSERT SQL 보λ΄κΈ° μ
5οΈβ£ νΈλμμ
μ DBμ λ°μ, μ΄ λ μ€μ λ‘ INSERT SQL μ»€λ° μν
6οΈβ£ μν°ν° λ§€λμ μ μν°ν° λ§€λμ ν©ν 리 μμμ close() νΈμΆλ‘ λ°ν