[JPA] JPAμ μμμ± κ΄λ¦¬μ λν΄
* ν΄λΉ κΈμ κΉμν κ°μ¬λμ μλ° ORM νμ€ JPA νλ‘κ·Έλλ° - κΈ°λ³ΈνΈμ λ³΄κ³ κ°λ¨νκ² μ 리ν κΈμ λλ€.(μμΈν λ΄μ©μ κ°μκ° μ΅κ³±λλ€. κ°μ μ¬μΈμ)
μλ° ORM νμ€ JPA νλ‘κ·Έλλ° - κΈ°λ³ΈνΈ κ°μ - μΈνλ°
μ λ μΌμνμ΄ μλλΌ νμνμΈκ°λ΄μ^^ νμ©νΈ λμ΄κ°λ€ 30% μ λ λ£κ³ λμ ν λ΅λ΅ν΄μ κΈ°λ³ΈνΈμ λ€μ΄λ²λ Έλ€μ^^. νμ£Ό νμ£Ό κΉμνλ κ°μ λ€μΌλ λ μ λλ λͺ¨μ΅μ μ€μ€λ‘ λλλλ€. νΉν μ€
www.inflearn.com
JPAμ μν κ³Ό νμ λ°°κ²½
πΆ JPAμ μν
JPAλ κ°λ°μ λμ SQLλ¬Έμ μμ±ν΄μ€λ€.
πΆ JPAλ₯Ό μ€λ¬΄μμ μ¬μ©ν λ μ°λ¦¬κ° μ λλ‘ λͺ»μ¬μ©νλ μ΄μ
1οΈβ£ κ°μ²΄μ ν μ΄λΈμ μ¬λ°λ₯΄κ² λ§€ννκ³ μ€κ³νλ λ°©λ²μ λͺ°λΌμ
2οΈβ£ JPA λ΄λΆ λμ λ°©μμ μ΄ν΄νμ§ λͺ»ν΄μ
JPAμ νμ λ°°κ²½
μ§κΈ μλλ κ°μ²΄λ₯Ό κ΄κ³ν DBμ κ΄λ¦¬ νλ€. κ·Έλ°λ° μ΄ κ°μ²΄λ₯Ό κ΄κ³ν DBμ λ£μΌλ €λ©΄ μλ§μ SQLλ¬Έμ μμ±νκ³€ νλ€. μ΄λ¬ν λ¬Έμ λ κ°μ²΄μ κ΄κ³ν DBκ°μ ν¨λ¬λ€μμ λΆμΌμΉλ‘ μ λ°λλ€.
μμ μ μ‘°νν λλ JOIN SQLμ λ§€λ² μμ±ν΄μΌ ν λΏλλ¬, κ°μ²΄λ κ³μ μμ±ν΄μ£Όμ΄μΌ νλ€. μ°κ΄κ΄κ³μ λ°λΌ κ°μ²΄ κ·Έλνλ₯Ό νμν λλ μ΄κΈ°μ SQLλ‘ JOINν κ²μ λ°λΌ νμ λ²μκ° λ¬λΌμ§λ€. μ΄λ κ°μ²΄ κ·Έλνμ λν μ λ’°μ± λ¬Έμ λ‘λ μ΄μ΄μ§ μ μλ€. λν λΉκ΅ν λλ λ§€λ² λ€λ₯Έ κ°μ²΄λ₯Ό λ§λ€μ΄λ΄μ κ°μ κ°μ κ°μ§λλΌλ == μ°μ°μ΄ μ λλ‘ μ΄λ£¨μ΄μ§μ§ μλλ€.
μ¦, "SQL μ€μ¬ κ°λ°μ λ¬Έμ "κ° JPA νμ λ°°κ²½μ ν λͺ«μ ν κ²μ΄λ€.
JPAμ JPAλ₯Ό μ¬μ©νλ©΄ μ’μ μ
JPAλ?
JPAλ Java Persistence APIλ‘ μ ν리μΌμ΄μ κ³Ό JDBC μ¬μ΄μμ λμνλ ORMμ μΌμ’ μ΄λ€. ORMμ΄λΌ ν¨μ κ°μ²΄μ κ΄κ³ν DB μ¬μ΄λ₯Ό μ°κ²°ν΄μ£Όλ κ²μ΄λΌ μκ°ν μ μλλ°, JPAλ Entityλ₯Ό μμμ λΆμνκ³ JDBC APIλ₯Ό μ¬μ©νμ¬ SQLμ μμ±ν΄ DBμ μ°κ²°μμΌμ€λ€.
πΆ JPAμ λ±μ₯ μ΄μ μ¬μ©νλ κ²λ€
EJB β‘οΈ νμ΄λ²λ€μ΄νΈ(μ€ν μμ€) β‘οΈ JPA(νμ€λͺ μΈ)
EJBκ° λ무 μ΄λ €μ΄ λλ¨Έμ§ νλ κ°λ°μλΆμ΄ μ€ν μμ€λ‘ μ½κ² λ§λ κ²μ΄ νμ΄λ²λ€μ΄νΈμ΄λ€. κ·Όλ° νμ΄λ²λ€μ΄νΈκ° μκ°λ³΄λ€ ν¨μ¬ μ’μ, νμ€ λͺ μΈλ‘ κ΅³μ΄μ§ κ²μ΄ λ°λ‘ JPAμ΄λ€.
μ JPAμΈκ°?
1οΈβ£ SQL μ€μ¬μ μΈ κ°λ°μμ κ°μ²΄ μ€μ¬μΌλ‘ κ°λ°ν μ μλ€.
2οΈβ£ μμ°μ±μ΄ μ’λ€.
3οΈβ£ μ μ§λ³΄μκ° μ½λ€.
4οΈβ£ ν¨λ¬λ€μμ λΆμΌμΉλ₯Ό ν΄κ²°ν μ μλ€.
5οΈβ£ μ±λ₯ ν₯μν μ μλ€.(1μ°¨ μΊμμ λμΌμ± 보μ₯, νΈλμμ μ μ§μνλ μ°κΈ° μ§μ, μ§μ° λ‘λ©κ³Ό μ¦μ λ‘λ©)
π λ°μ΄ν° λ² μ΄μ€ λ°©μΈ
JPAλ νΉμ λ°μ΄ν°λ² μ΄μ€μ μ’ μλμ§ μλλ€.
κ°κ°μ λ°μ΄ν°λ² μ΄μ€κ° μ 곡νλ SQL λ¬Έλ²κ³Ό ν¨μλ μ‘°κΈμ© λ€λ₯΄λ€.
μ΄λ, λ°μ΄ν°λ² μ΄μ€μμ λ§νλ λ°©μΈμ SQL νμ€μ μ§ν€μ§ μλ νΉμ λ°μ΄ν° λ² μ΄μ€λ§μ κ³ μ ν κΈ°λ₯μ λ§νλ€.
μ¦, JPAμκ² μ΄λ ν λ°©μΈμ μ¬μ©ν μ§ μλ €μ£Όλ©΄ κ·Έμ λ§μΆμ΄μ μ΄λ€ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©ν μ§ μμμ κ²°μ νλ€.
νμ΄λ²λ€μ΄νΈλ 40κ°μ§ μ΄μμ λ°©μΈμ μ 곡νκ³ μλ€.
javaxλ νμ€μ μ§ν€λ κ²μ΄κ³ , hibernateκ° μλ κ²μ μ μ© μ΅μ μ΄λΌ λ€λ₯Έ ꡬν λΌμ΄λΈλ¬λ¦¬μμλ λμ§λ μλλ€.
JPAλ μ΄λ»κ² λμνλκ°?
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
1οΈβ£ λ¨Όμ JPAκ° κ΅¬λλ λ, META-INF/persistence.xmlμ μ λ ₯λ μ€μ μ 보μ λ°λΌ κΈ°λ³Έ μ ν μ΄ μ€μ λλ€.
2οΈβ£ EntityManagerFactoryλ₯Ό μμ±νλ€.
3οΈβ£ EntityManagerFactoryμμ EntityManagerλ₯Ό μμ±νλ€.
4οΈβ£ EntityManagerμμλ EntityTransactionμ λ§λ€ μ μκ³ , JPAμ λͺ¨λ λ°μ΄ν° λ³κ²½μ ν΄λΉ νΈλμμ μμμ μνλλ€.
μ£Όμν μ μ μν°ν° λ§€λμ λ μ°λ λ κ°μ 곡μ νμ§ μκΈ° λλ¬Έμ μ¬μ©ν νμλ λ²λ €μΌνλ€.
μμμ± μ»¨ν μ€νΈ
π² "μν°ν°λ₯Ό μꡬ μ μ₯νλ νκ²½" μ΄λΌλ λ»μ΄λ€.
π² EntityManager.persist(entity) λ₯Ό ν΅ν΄ μμμ± μ»¨ν μ€νΈμμ μ μ₯ν μ μλ€.
π² λ Όλ¦¬μ μΈ κ°λ μ΄λ©°, λμ 보μ΄μ§ μλλ€. μν°ν° λ§€λμ λ₯Ό ν΅ν΄ μμμ± μ»¨ν μ€νΈμ μ κ·Όν μ μλ€.
μν°ν°μ μλͺ μ£ΌκΈ°
π² λΉμμ(new/transient)
μμμ± μ»¨ν μ€νΈμ μ ν κ΄κ³κ° μλ μλ‘μ΄ μνμ΄λ€.
π² μμ(managed)
μμμ± μ»¨ν μ€νΈμ κ΄λ¦¬λλ μνμ΄λ€.
π² μ€μμ(detached)
μμμ± μ»¨ν μ€νΈμ μ μ₯λμλ€κ° λΆλ¦¬λ μνμ΄λ€.
π² μμ (removed)
μμ λ μνμ΄λ€.
λΉμμ μν
Member member = new Member();
member.setId(100L);
member.setName("HelloJPA");
μμ
em.persist(memeber);
μ€μμ μν
em.detach(member);
μμ
em.remove(member);
μμμ± μ»¨ν μ€νΈμ μ΄μ
πΆ μν°ν° μ‘°ν(1μ°¨ μΊμ)
em.persist()λ₯Ό ν΅ν΄ μμννκ² λλ©΄ κΈ°λ³Έμ μΌλ‘ 1μ°¨ μΊμμ ν΄λΉ Entityμ μνκ° μ μ₯λλ€. λ°λΌμ 1μ°¨ μΊμμ μ μ₯λ μνμμ em.find()λͺ λ Ήμ μννκ² λλ©΄ DBλ₯Ό μ‘°νν νμμμ΄ λ°λ‘ κ°μ μ°Ύμ μ μλ€.
λΉμ¦λμ€κ° 볡μ‘νλ©΄ μ΄λμ λ λμμ΄λλ, μ¬λ¬ λͺ μ κ³ κ°μ΄ μ¬μ©νλ λλ μ²λ¦¬νμ§ λͺ»ν΄ ν° μ΄μ μ μλ€κ³ λ³Έλ€.
πΆ μμ μν°ν°μ λμΌμ± 보μ₯
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); // λμΌμ± λΉκ΅ true
λλ€ 1μ°¨μΊμμμ κ°μ Έμ¨ κ°μ΄λ―λ‘ λμΌν κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
πΆ μν°ν° λ±λ‘, νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.persist(memberA);
em.persist(memberB);
transaction.commit();
em.persist()λ₯Ό μννλ©΄ μμνλμ΄ μμμ± μ»¨ν μ€νΈμ λ€μ΄κ°λ€κ³ νμλ€. μ΄λ, λμμ μ°κΈ° μ§μ° SQL μ μ₯μμ INSERT SQLλ¬Έμ΄ λμμ λ§λ€μ΄μ§λ€.
κ·Έλ¦¬κ³ transaction.commit()λ₯Ό νκ²λλ©΄ κ·ΈλμμΌ μμ¬μλ SQLλ¬Έμ΄ νλ²μ DBλ‘ μ μ‘λμ΄ μνλλ€.
hibernateμ batch sizeλΌλ μμ±μ΄ μλ€. λ§μΉ λ²νΌλ§ κ°μ κΈ°λ₯μΈλ°, μΌλ§λ νλ²μ λͺ¨μμ 보λΌμ§ μ νλ κΈ°λ₯λ μλ€.
πΆ μν°ν° μμ , λ³κ²½ κ°μ§
Member member = em.find(Member.class, 150L);
member.setName("ZZZZZ");
tx.commit();
μμ μ μμ΄μλ persist()λ₯Ό νμ§μλλ€. κ·Έμ μλ° μ»¬λ μ λ€λ£¨λ―μ΄ κ°λ§ λ°κΎΈμ΄μ£Όλ©΄ λμΈ κ²μ΄λ€. μ΄κ² κ°λ₯ν μ΄μ λ JPAμ λ³κ²½ κ°μ§(Dirty Checking)μ΄λΌλ κΈ°λ₯ λλ¬Έμ΄λ€.
1μ°¨ μΊμ μμλ Id κ°κ³Ό Entity, κ·Έλ¦¬κ³ μ΅μ΄ μνλ₯Ό μ§μ΄λ£μ μ€λ μ·μ κ°μ§κ³ μλ€.
μ΄λ, memberAλΌλ κ°μ λ³κ²½νκ² λλ©΄(flush νΈμΆ μ) μ€λ μ·κ³Ό μν°ν°λ₯Ό λΉκ΅νλ€. λ§μ½ Entityμ μ€λ μ·μ΄ λ€λ₯΄λ€λ©΄, UPDATE SQLμ μ°κΈ° μ§μ° SQL μ μ₯μμ λ£κ² λλ€. κ·Έλμ κ΅³μ΄ μ°λ¦¬κ° persistλ₯Ό νμ§ μλλΌλ μμμ λ³κ²½μ κ°μ§νκ³ SQLλ¬Έμ μμ±ν΄μ€ μ μλ€.
μν°ν°μ μμ λ λ§μ°¬κ°μ§λ‘ μλλλ€.
Member memberA = em.find(Member.class, "memberA");
em.remove(memberA);
νλ¬μ(flush)
π² μμμ± μ»¨ν μ€νΈμ λ΄μ©μ λ°μ΄ν°λ² μ΄μ€μ λ°μνλ κ²
νλ¬μ(flush)λ μΈμ λ°μνλκ°?
π² λ³κ²½ κ°μ§(Dirty Checking)
π² μμ λ μν°ν° μ°κΈ° μ§μ° SQL μ μ₯μμ λ±λ‘
π² μ°κΈ° μ§μ° SQL μ μ₯μμ 쿼리λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ‘
μμμ± μ»¨ν μ€νΈμ νλ¬μνλ λ°©λ²
π² μ§μ νΈμΆ : em.flush()
π² μλ νΈμΆ : νΈλμμ 컀λ°, JPQL 쿼리 μ€ν μ
π€ flushλ₯Ό νκ² λλ©΄ 1μ°¨ μΊμλ μμ λλκ°?
μλλ€. 1μ°¨ μΊμλ μμ λμ§ μλλ€.
π€ JPQL μ€ν μ μλμΌλ‘ νλ¬μκ° νΈμΆλλ μ΄μ
em.persist(memberA); em.persist(memberB); em.persist(memberC); query = em.createQuery("select m from Member m", Member.class); List<Member> members = query.getResultList();
em.persist()μμλ μ€μ λ‘ μΏΌλ¦¬κ° λ λΌκΈ°μ§λ μλλ€λ κ²μ κΈ°μ΅νμ.
κ·Έλ κΈ° λλ¬Έμ λ©€λ²λ₯Ό JPQLλ‘ κ°μ Έμλ Insert λμ§ μμμ κ°μ Έμμ§μ§ μλλ€.
μ΄λ₯Ό λ°©μ§νκ³ μ JPQL 쿼리 μ€ν μ νλ¬μκ° μλμΌλ‘ νΈμΆνμ¬ DBμ 미리 λ°μνλ κ²μ΄λ€.
μ€μμ μν(detached)
μμ μνμ μν°ν°κ° μμμ± μ»¨ν μ€νΈμμ λΆλ¦¬λλ μνμ΄λ€. κ·Έλμ μμμ± μ»¨ν μ€νΈκ° μ 곡νλ κΈ°λ₯μ μ΄μ©ν μ μλ€.
π² em.detach(entity)
νΉμ μν°ν°λ§ μ€μμ μνλ‘ μ ννλ€.
π² em.clear()
μμμ± μ»¨ν μ€νΈλ₯Ό μμ ν μ΄κΈ°ννλ€.
π² em.close()
μμμ± μ»€ν μ€νΈλ₯Ό μ’ λ£νλ€. μμ ν 1μ°¨μΊμλ₯Ό ν΅μΌλ‘ λΉμ΄λ€.
μλ° ORM νμ€ JPA νλ‘κ·Έλλ° - κΈ°λ³ΈνΈ κ°μ - μΈνλ°
μ λ μΌμνμ΄ μλλΌ νμνμΈκ°λ΄μ^^ νμ©νΈ λμ΄κ°λ€ 30% μ λ λ£κ³ λμ ν λ΅λ΅ν΄μ κΈ°λ³ΈνΈμ λ€μ΄λ²λ Έλ€μ^^. νμ£Ό νμ£Ό κΉμνλ κ°μ λ€μΌλ λ μ λλ λͺ¨μ΅μ μ€μ€λ‘ λλλλ€. νΉν μ€
www.inflearn.com