π[Java] JPA λ΄λΆ λμ λ°©μ
JPA λ΄λΆ λμ λ©μ»€λμ¦
λ€μμ JPA
λ₯Ό μ΄ν΄νκΈ° μν΄ κ°μ₯ μ€μν κ°λ
2κ°μ§λ€.
1. κ°μ²΄μ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ λ§€ν
2. μμμ± μ»¨ν
μ€νΈ
μμμ± μ»¨ν μ€νΈ(Persistence Context)
μμμ± μ»¨ν
μ€νΈ
λ, μν°ν°λ₯Ό μꡬ μ μ₯νλ νκ²½μΌλ‘, λμ 보μ΄μ§ μλ λ
Όλ¦¬μ μΈ κ°λ
μ΄λ€.
μν°ν° λ§€λμ
λ₯Ό ν΅ν΄μ μμμ± μ»¨ν
μ€νΈ
μ μ κ·Όνλ λ°©μμ΄λ€.
μν°ν°μ μν°ν° λ§€λμ
μν°ν°
- μν°ν°(Entity)λ DBμ μ‘΄μ¬νλ νλμ Tableμ ν΄λμ€λ‘ ꡬνν κ²μ΄λ€.
- μν°ν° κ°μ²΄λ₯Ό μν°ν°λΌκ³ νλ€.
μν°ν° λ§€λμ
- μν°ν° λ§€λμ (Entity Manager)λ μν°ν°(κ°μ²΄)μ μλͺ μ£ΌκΈ°λ₯Ό κ΄λ¦¬νλ€.
- μν°ν° λ§€λμ λ μν°ν° κ°μ²΄λ₯Ό μμμ± μ»¨ν μ€νΈμ μ μ₯ν΄ κ΄λ¦¬νλ€.
- μ¦, μν°ν°μ μμμ± μ»¨ν μ€νΈ μ¬μ΄μ μμΉνλ€.
μν°ν°μ μλͺ μ£ΌκΈ°?
μν°ν°μ μλͺ μ£ΌκΈ°μ λ°λΌ λΆλ₯ν΄λ³Έλ€.
- λΉμμ
- μμμ± μ»¨ν μ€νΈμ μ ν κ΄κ³κ° μλ μλ‘μ΄ μνλ₯Ό λ»νλ€.
- μμ(managed)
- μμμ± μ»¨ν μ€νΈμ μν΄ κ΄λ¦¬λλ μνλ₯Ό λ»νλ€.
- μ€μμ(detached)
- μμμ± μ»¨ν
μ€νΈμ μ μ₯λμλ€κ°
λΆλ¦¬
λ μνλ₯Ό λ»νλ€.
- μμμ± μ»¨ν
μ€νΈμ μ μ₯λμλ€κ°
- μμ (removed)
- λ§ κ·Έλλ‘ μμ λ₯Ό λ»νλ€.
- λ§ κ·Έλλ‘ μμ λ₯Ό λ»νλ€.
λΉμμ
λΉμμ
μνλ JPAμ κ΄κ³ μμ΄ κ°μ²΄λ§ μμ±νλ λ¨κ³μ΄λ€.
//κ°μ²΄λ₯Ό μμ±ν μν(λΉμμ)
Member member = new Member();
member.setId("member1");
member.setUsername("νμ1");
μμ
μμ
μνλ κ°μ²΄λ₯Ό persist()
λ₯Ό ν΅ν΄ μμμ± μ»¨ν
μ€νΈμ μ μ₯ν μνμ΄λ€.
//κ°μ²΄λ₯Ό μμ±ν μν(λΉμμ)
Member member = new Member();
member.setId("member1");
member.setUsername(βνμ1β);
// μν°ν° λ§€λμ νΈμΆ
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAμ΄λ¦");
μΆμ²: https://devraphy.tistory.com/513 [κ°λ°μλ₯Ό ν₯νμ¬:ν°μ€ν 리]
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//κ°μ²΄λ₯Ό μ μ₯ν μν(μμ)
em.persist(member);
μ¬κΈ°μ μ£Όμν΄μΌν λΆλΆμ΄ μλ€. μμ μνκ° λμλ€κ³ ν΄μ κ³§λ°λ‘ DBμ μ μ₯λλ κ²μ μλλ€!
κ·ΈλΌ μΈμ DBμ μ μ₯λ κΉ? -> νΈλμμ
μ΄ commitμ ν΄μΌ DBμ μ μ₯λλ€!
μμμ± μ»¨ν μ€νΈμ μ₯μ
μμμ± μ»¨ν μ€νΈμ μ₯μ μ λ€μκ³Ό κ°λ€.
1. 1μ°¨ μΊμ
μμμ± μ»¨ν
μ€νΈμλ 1μ°¨ μΊμλΌλ κ²μ΄ μ‘΄μ¬νλλ°, κ°μ΄ μ‘΄μ¬νλ€λ©΄ DBμ μ κ·Όν νμ μμ΄ 1μ°¨ μΊμμμ μ‘°νν΄ κ²μ μλλ₯Ό λμΌ μ μλ€.
λ§μ½, 1μ°¨ μΊμμ κ°μ΄ μλ€λ©΄ DBμμ μ‘°νν ν ν΄λΉ κ°μ 1μ°¨ μΊμμ μ μ₯νκ³ λ°ννλ€.
νμ§λ§ 1μ°¨ μΊμλ ν νΈλμμ
μμμλ§ μ ν¨νκΈ° λλ¬Έμ ν° μ±λ₯ ν₯μμ κΈ°λνκΈ°λ μ΄λ ΅λ€.
2. λμΌμ±(identity) 보μ₯
1μ°¨ μΊμλ‘ λ°λ³΅ κ°λ₯ν μ½κΈ°(REPEATABLE READ)
λ±κΈμ νΈλμμ
격리 μμ€μ λ°μ΄ν°λ² μ΄μ€κ° μλ μ ν리μΌμ΄μ
μ°¨μμμ μ 곡νλ κΈ°λ₯μ΄λ€.
3. νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°(transactional write-behind)
μμμ± μ»¨ν
μ€νΈμλ 1μ°¨ μΊμκ° μ‘΄μ¬νμ§λ§, μ°κΈ° μ§μ° SQL μ μ₯μ
λΌλ κ³³λ μ‘΄μ¬νλ€.
κ° βAβλ₯Ό persist()λ₯Ό ν΅ν΄ λ±λ‘νλ©΄, μΌλ¨ 1μ°¨ μΊμμ μ μ₯νκ³ JPAκ° κ° βAβλ₯Ό λΆμν΄ insert SQLμ μ°κΈ° μ§μ° SQL μ μ₯μμ μ μ₯νλ€.
λ€λ₯Έ κ°μ λ persistνλ©΄, ν΄λΉ κ°μ SQLμ 차곑차곑 μμ μ¬λ¦°λ€.
μ΄λ κ² μμΈ SQLμ νΈλμμ
commit μμ μ DBμ μ μ₯(flush)
λλ€.
4. λ³κ²½ κ°μ§(Dirty Checking)
Member member = em.find(Member.class, 150L);
member.setName("HELLO");
μ μ½λκ° λμνκ³ λλ©΄, em.persit(member)
μ κ°μ μ½λ μΆκ°κ° νμν κΉ?
κ²°λ‘ λΆν° μ΄μΌκΈ° νλ©΄, νμ μλ€.
JPAμ λͺ©μ
μ λν΄μ μκ°ν΄λ³Ό νμκ° μλ€.
JPAλ λ°μ΄ν°λ₯Ό μλ° μ»¬λ μ
(Collections)
μ²λΌ μ¬μ©νκΈ° μν¨μΈλ°, 컬λ μ
μμ λ°μ΄ν°λ₯Ό μμ ν νμ λ€μ μ μ₯ν΄μ£Όλ μμ
μ΄ νμ νμλ?
컬λ μ
μμλ κ·Έλ° μμ
μ νμ μμλ€. κ·Έλ¬λ―λ‘ JPAλ μΆκ°λ‘ μ μ₯ν΄μ£Όλ μ½λλ νμ μλ€.
JPAλ λ°μ΄ν°λ² μ΄μ€ νΈλμμ
μ»€λ° μμ μ 컀λ°μ μννκ² λλ©΄ λ΄λΆμ μΌλ‘ flush
κ° νΈμΆλλ€.
κ·Έ νμλ μν°ν°μ μ€λ
μ·(SHAPSHOT)
μ λΉκ΅νλ λμμ μννλ€.
μ¦, 1μ°¨ μΊμ μμλ ID, Entity, SNAPSHOT(1μ°¨ μΊμμ κ°μ΄ λ€μ΄μμ λμ μ΅μ΄ μμ ) μ΄ μ‘΄μ¬νλ€.
5. μ§μ° λ‘λ©(Lazy Loading)
μ°Έκ³ μλ£
[μΈνλ°]μλ° ORM νμ€ JPA νλ‘κ·Έλλ°(κΉμν) - κΈ°λ³ΈνΈ
https://devraphy.tistory.com/513
λκΈλ¨κΈ°κΈ°