JPA
Java Persistence API λ ?
ORM μ νμ€ κΈ°μ λ‘ Hibernate
, OpenJPA
, EclipseLink
, TopLink
Essentials
κ³Ό κ°μ ꡬνμ²΄κ° μκ³ , μ΄λ€μ λν νμ€ μΈν°νμ΄μ€ μ΄λ€.
μ₯μ
- κ°μ²΄μ§ν₯μ μΌλ‘ κ°λ° λ° λ°μ΄ν°λ₯Ό κ΄λ¦¬ ν μ μκΈ° λλ¬Έμ λΉμ§λμ€ λ‘μ§μ μ§μ€ν μ μλ€.
- ν μ΄λΈμ μμ±, λ³κ²½, κ΄λ¦¬κ° μ½λ€.
- λΉ λ₯Έ κ°λ°μ΄ κ°λ₯νλ€.
- DB μ μμ‘΄μ μ΄μ§ μλ€.
- MySQL, Oracle, Sysbase, Derby, PostgreSQL λ±λ±μ λ°μ΄ν° λ² μ΄μ€ μ§μ
- POJO κΈ°λ°μ λͺ¨λΈμ μ§μ
λ¨μ
- κ°μ²΄μ§ν₯μ μ΄ν΄νκ³ κ°λ° ν΄μΌ νλ λ§νΌ λ¬λ컀λΈκ° λλ€.
- μ±λ₯μμ λ¬Έμ κ° μμμ μλ€.
μ°Έκ³ μλ£
μμμ±
Entity λ₯Ό μꡬμ μΌλ‘ μ μ₯ν΄μ£Όλ νκ²½μ μλ―Ένλ€.
EntityManagerFactory
μ EntityManager
- EntityManagerFactory
- μμ±νλλ° λΉμ©μ΄ ν¬λ€.
- μ΄ν리μΌμ΄μ μ 체μ μΌλ‘ ν λ²λ§ μμ±νμ¬ κ³΅μ νλλ‘ μ€κ³λμ΄ μλ€.
- μ¬λ¬ μ€λ λμμ λμμ μ κ·Όν΄λ μμ νλ€.
- μλ‘ λ€λ₯Έ μ€λ λμ 곡μ κ°λ₯
- EntityManager
- μμ±νλλ° λΉμ©μ΄ μλ€.
- μ¬λ¬ μ€λ λκ° λμμ μ κ·Όνλ©΄ λμμ± λ¬Έμ κ° λ°μνλ€.
- μ€λ λκ°μ 곡μ νμ§ μλλ€.
EntityManager
λ λ°μ΄ν°λ² μ΄μ€μ μ°κ²°μ΄ κΌ νμν μμ κΉμ§λ 컀λ₯μ
μ μ»μ§ μμ΅λλ€.
EntityManagerFactory
μ EntityManager
λ₯Ό μμ±νλ μ½λλ μλμ κ°μ΅λλ€.
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("person"); // νλΌλ―Έν° : μμμ± λ¨μ μ΄λ¦
EntityManager entityManager = entityManagerFactory.createEntityManager();
Persistance Context
μμμ± μ»¨ν μ€νΈ (Persistance Context) λ μν°ν°λ₯Ό μꡬμ μΌλ‘ μ μ₯νλ νκ²½ μ΄λΌλ λ»μ΄λ€.
EntityManager
λ₯Ό μ΄μ©νμ¬ Entityλ₯Ό μ μ₯νκ±°λ μ‘°νν λ EntityManager λ μμμ± μ»¨ν
μ€νΈμ Entity λ₯Ό 보κ΄νκ³ κ΄λ¦¬νλ€.
[EntityManager κ°μ²΄].persist([Entity κ°μ²΄])
λ₯Ό μ€ννλ©΄ μμμ± μ»¨ν
μ€νΈκ° Entity λ₯Ό κ΄λ¦¬νκ² λλ€.
Persistance Context λ λμ 보μ΄μ§ μλ λ
Όλ¦¬μ μΈ κ°λ
μ΄λ€.
λν EntityManager
λ₯Ό νλ μμ±ν λ νλκ° λ§λ€μ΄μ§λ©°, EntityManager λ₯Ό ν΅νμ¬ μ κ·Όν μ μκ³ κ΄λ¦¬ν μ μλ€.
Persistance Context μ νΉμ§μ μλμ κ°λ€.
μμμ± μ»¨ν μ€νΈλ Entity λ₯Ό μλ³μ κ°μΌλ‘ ꡬλΆν©λλ€.
Entity
μμ@Id
μ΄λ Έν μ΄μ μ ν΅νμ¬ μ§μ ν λ©€λ² λ³μκ° μμμ± μ»¨ν μ€νΈμ μλ³μ κ°μΌλ‘ μ μ₯λλ€.
JPA λ λ³΄ν΅ νΈλμμ μ μ»€λ° νλ μκ° μμμ± μ»¨ν μ€νΈμ μλ‘ μ μ₯λ Entity λ₯Ό λ°μ΄ν°λ² μ΄μ€μ λ°μνλ€.
- μ΄λ¬ν κ³Όμ μ
flush
λΌκ³ νλ€.
- μ΄λ¬ν κ³Όμ μ
1μ°¨ μΊμλ₯Ό μ¬μ©νλ€.
- μμμ± μ»¨ν μ€νΈ λ΄λΆμ μ‘΄μ¬νλ μΊμ (Map) μ 1μ°¨ μΊμλΌκ³ νλ€.
- μμ μνμ
Entity
λ λͺ¨λ μ΄κ³³μ μ μ₯λλ©° ν€λ@Id
λ‘ λ§€νν μλ³μμ΄λ©° κ°μ Entity μΈμ€ν΄μ€μ΄λ€. entityManager.find()
λ©μλλ₯Ό νΈμΆνλ©΄ λ¨Όμ 1μ°¨ μΊμμμ Entity λ₯Ό μ°Ύκ³ , λ§μ½ μ°Ύλ Entity κ° 1μ°¨ μΊμμ μμΌλ©΄ λ°μ΄ν°λ² μ΄μ€μμ μ‘°νν ν 1μ°¨ μΊμμ μ μ₯νκ³ μμ μνμΈ ν΄λΉ κ°μ²΄λ₯Ό λ°ννλ€.
κ°μ²΄μ λμΌμ±μ 보μ₯νλ€.
- 1μ°¨ μΊμμ μλ κ°μ Entity λ₯Ό λ°ννκΈ° λλ¬Έμ Entity μ λμΌμ±μ 보μ₯νλ€.
νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°μ μννλ€.
- EntityManager λ νΈλμμ μ μ»€λ° νκΈ° μ§μ κΉμ§ λ°μ΄ν°λ² μ΄μ€μ Entityλ₯Ό μ μ₯νμ§ μκ³ μμμ± μ»¨ν μ€νΈμ λ΄λΆ SQL μ μ₯μμ μμ± μΏΌλ¦¬λ₯Ό μ μ₯ν΄ λλ€.
- μ΄ν 컀λ°μ νκ² λλ©΄ μ μ₯ν΄λμλ 쿼리λ₯Ό λ°μ΄ν°λ² μ΄μ€μ 보λ λλ€.
λ³κ²½μ κ°μ§νλ€.
- μμμ± μ»¨ν μ€νΈμλ μ΄μ flush() λμ Entity μνλ₯Ό 볡μ¬ν΄μ μ μ₯ν΄λ μ€λ μ·μ΄ μ‘΄μ¬νλ€.
- JPA λ
flush()
μμ μ μ€λ μ·κ³Ό Entity λ₯Ό λΉκ΅ν΄ λ³κ²½λ Entity λ₯Ό μ°Ύλλ€. - λ§μ½ λ³κ²½λ Entity κ° μλ€λ©΄ κ°κ°μ κ°μ²΄μ λν μμ 쿼리λ₯Ό λ§λ€μ΄ μ°κΈ° μ§μ° SQL μ μ₯μμ μ μ₯ν ν νκΊΌλ²μ λ°μ΄ν°λ² μ΄μ€λ‘ λ³΄λ΄ νΈλμμ μ 컀λ°νλ€.
- λ³κ²½ κ°μ§λ μμμ± μ»¨ν μ€νΈκ° κ΄λ¦¬νλ μμ μνμ μν°ν°μλ§ μ μ©λλ©°, μ€μμ μνμ κ°μ²΄λ κ°μ§νμ§ λͺ»νλ€.
μ§μ° λ‘λ©μ μννλ€.
- μ€μ κ°μ²΄ λμ νλ‘μ κ°μ²΄λ₯Ό λ‘λ©ν΄λκ³ ν΄λΉ κ°μ²΄λ₯Ό μ€μ μ¬μ©ν λ μμμ± μ»¨ν μ€νΈλ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό λΆλ¬μ€λ λ°©λ²μ΄λ€.
Life Cycle
Entity λ μμ κ°μ΄ 4κ°μ§ μνκ° μ‘΄μ¬νλ€.
- λΉμμ (new)
μμμ± μ»¨ν μ€νΈμ μ ν κ΄κ³κ° μλ μν
κ°μ²΄ μμ±
Person kim = new Person("Kim");
- μμ (managed)
μμμ± μ»¨ν μ€νΈμ μ μ₯λ μν
κ°μ²΄ μμ± ν EntityManager λ₯Ό ν΅νμ¬ μμμ± μ»¨ν μ€νΈμ μ μ₯
entityManager.persist(kim);
- μ€μμ (detached)
μμμ± μ»¨ν μ€νΈμ μ μ₯λμλ€κ° λΆλ¦¬λ μν
μμμ± μ»¨ν μ€νΈκ° μμ μνμλ Entity λ₯Ό κ΄λ¦¬νμ§ μμ (3κ°μ§ λ°©λ²)
entityManager.detach(kim);
entityManager.closed(); // μμμ± μ»¨ν
μ€νΈ μ’
λ£
entityManager.clear(); // μμμ± μ»¨ν
μ€νΈ μ΄κΈ°ν
μ€μμ μνκ° λλ©΄ 1μ°¨ μΊμλΆν° μ°κΈ°μ§μ° SQL μ μ₯μκΉμ§ ν΄λΉ μν°ν°λ₯Ό κ΄λ¦¬νκΈ° μν λͺ¨λ μ λ³΄κ° μ κ±°λ¨
μμμ± μ»¨ν μ€νΈκ° μ 곡νμλ μ΄λ ν κΈ°λ₯λ€ (1μ°¨ μΊμ) λ±μ μ 곡νμ§ μλλ€.
μ΄λ―Έ νλ² μμ μνμκΈ° λλ¬Έμ λ°λμ μλ³μ κ°μ κ°μ§κ³ μλ€. μ§μ° λ‘λ© μ λ¬Έμ κ° λ°μνλ€.
- μμ (removed)
μμ λ μν
μμμ± μ»¨ν μ€νΈμ λ°μ΄ν°λ² μ΄μμ Entity μμ
entityManager.remove(kim);
μ€μμ -> μμ (merge)
μ€μμ μνλ₯Ό μμ μνλ‘ λ³κ²½νλ €λ©΄ λ³ν© (merge) κ³Όμ μ κ±°μ³μΌ νλ€.
Person kim = new Person(1, "kim");
entityManager.persist(kim);
entityManager.detech(kim);
kim.setUserName("myungseok");
Person mergedKim = entityManager.merge(kim);
kim.getUserName(); // kim
mergedKim.getUserName(); // myungseok
entityManager.contains(kim); // false
entityManager.contains(mergedKim); // true
μμ κ°μ΄ merge()
λ©μλλ₯Ό μννλ©΄ μ΄μ Entity μΈ kim
μ΄ μμ μνλ‘ λ³νλκ² μλλΌ μλ‘μ΄ μμ μνμ Entity λ₯Ό λ°ννλ€.
λ°λΌμ kim
κ³Ό mergedKim
μ μλ‘ κ°μ κ°μ²΄κ° μλλ€.
kim
κ°μ²΄λ merge()
νμλ μ€μμ μνλ‘ λ¨μμκ² λλ€.
flush()
flush()
λ μλμ κ³Όμ μ λ°λΌ μμμ± μ»¨ν
μ€νΈμ λ³κ²½μ¬νμ λ°μ΄ν° λ² μ΄μ€μ λ°μνλ€.
- λ³κ²½κ°μ§κ° λμνμ¬ μμμ± μ»¨ν μ€νΈμ μλ λͺ¨λ Entity λ₯Ό μ€λ μ·κ³Ό λΉκ΅ν ν μμ λ Entity λ₯Ό μ°Ύλλ€.
- μμ λ Entity λ μμ 쿼리λ₯Ό λ§λ€μ΄ μ°κΈ° μ§μ° SQL μ μ₯μμ μ μ₯νλ€. (λ±λ‘, μμ , μμ )
- μ°κΈ° μ§μ° SQL μ μ₯μμ 쿼리λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ‘
flush()
μ νΈμΆνλ λ°©λ²μ μλ 3κ°μ§ μ΄λ€.
- μ§μ νΈμΆ
- EntityManager μ
flush()
λ₯Ό μ§μ νΈμΆν΄ κ°μ λ‘flush()
νλ λ°©λ²μ΄λ€. - κ±°μ μ¬μ©νμ§ μλλ€.
- EntityManager μ
- νΈλμμ
컀λ°μ νλ¬μ μλ νΈμΆ
- JPA λ νΈλμμ
μ 컀λ°ν λ μλμΌλ‘
flush()
μ νΈμΆνλ€.
- JPA λ νΈλμμ
μ 컀λ°ν λ μλμΌλ‘
- JPQL 쿼리 μ€ν μ
flush()
μλ νΈμΆ- JPQL κ°μ κ°μ²΄μ§ν₯ 쿼리λ₯Ό νΈμΆν λλ 쿼리 μ€ν μ§μ μ
flush()
κ° μλμΌλ‘ νΈμΆλλ€.
- JPQL κ°μ κ°μ²΄μ§ν₯ 쿼리λ₯Ό νΈμΆν λλ 쿼리 μ€ν μ§μ μ
Hibernate β