πJPA μμμ± μ»¨ν μ€νΈ
Spring JPA
EntityManagerμ EntityManager Factory
μμμ± μ»¨ν μ€νΈ
- JPAλ₯Ό μ΄ν΄νλλ° κ°μ₯ μ€μν μ©μ΄μ΄λ€.
- μν°ν°λ₯Ό μꡬ μ μ₯νλ νκ²½μ΄λΌλ λ»μ΄λ€.
EntityManager.persist(entity);
- μν°ν° λ§€λμ λ₯Ό ν΅ν΄μ μ κ·Όν μ μλ€.
JPA Entityμ μλͺ μ£ΌκΈ°
- λΉμμ μν : JPAκ° κ΄λ¦¬νμ§ μλ κ·Έλ₯ μλ° κ°μ²΄μ΄λ€.
//κ°μ²΄λ₯Ό μμ±ν μν(λΉμμ) Member member = new Member(); member.setId("member1"); member.setUsername("νμ1");
- μμ μν : κ·Έλ λ€λ©΄ μ΄κ±΄ κ΄λ¦¬
```java
//κ°μ²΄λ₯Ό μμ±ν μν(λΉμμ)
Member member = new Member();
member.setId(βmember1β);
member.setUsername(βνμ1β);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//κ°μ²΄λ₯Ό μ μ₯ν μν(μμ)
em.persist(member);
// νΉμ JPAμμ μ»μ΄μ¨ κ°μ²΄(find λ±)
무μμ΄ μμμνμΈκ°λ₯Ό μμμλκ²μ΄ μ€μνλ€. λμ€μ κ°λ
μ ν΅ν΄ μ λλ‘ μ΄ν΄ν΄λ³΄μ.
- μ€μμμν : μμμνμλ€κ° λΆλ¦¬λ μν
em.detach(member);
- μμ
em.remove(member);
## μμμ± μ»¨ν
μ€νΈμ μ΄μ
- 1μ°¨ μΊμ
- μ¬μ€ νΈλμμ
νλ λ΄μμμ μΊμμ΄λ―λ‘ λΉμ§λμ€ λ‘μ§μ΄ μμ²λκ² ν¬μ§μλ€λ©΄ μ±λ₯μμ μ΄μ μ λ³λ‘ μμ§λ§, μμ μνλ₯Ό ꡬννλλ° κ°μ₯ κ²°μ μ μΈ μμμ΄λ€. μ¬μ€μ 1μ°¨ μΊμλ₯Ό μμμ± μ»¨ν
μ€νΈλΌκ³ λ΄λ λλ€.
- μμ½ν΄μ μ€λͺ
νλ©΄, μμμ± μ»¨ν
μ€νΈμλ 1μ°¨ μΊμλΌλ κ³³μ΄ μ‘΄μ¬ν΄μ μ΄λ₯Ό ν΅ν΄ μ€μ λ‘ μΏΌλ¦¬κ° λκ°μ§ μλκ°μ§κ° κ²°μ λλ€.

μ κ·Έλ¦Όμ²λΌ νμ¬ μμμ± μ»¨ν
μ€νΈμ μλ κ°μ²΄λ€μ 1μ°¨ μΊμμ 보κ΄λμ΄ μμΌλ©°, findλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μ°Ύμμλ μΊμμ μ‘΄μ¬νλ€λ©΄ μ€μ λ‘ μΏΌλ¦¬λ λκ°μ§ μλλ€.

λ°λ©΄ μΊμμ μλ κ°μ²΄ μ°Ύλλ€λ©΄ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ‘°ννκ² λκ³ , μ»μ΄μ¨ κ°μ λ°νλλ©° λμμ μμμ± μ»¨ν
μ€νΈμ 보κ΄λ λλ€. λ€μμ μ°Ύλ μΌμ΄ μλ€λ©΄ μΊμμμ ν΄κ²°λ κ²μ΄λ€.
λ€μ μ€λͺ
μ λμ€κ² μ§λ§ μ΄λ¬ν κ²½μ°μλ μΏΌλ¦¬κ° λ°λ‘ λκ°λ κ²μ μλλ€. flushλλ μμ μ λ€μμ μ€λͺ
νλ€.
- μμμν°ν°μ λμΌμ± 보μ₯
```java
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //λμΌμ± λΉκ΅ true
μ μ½λμμ λ³΄λ― λ¬Έμ μ¬νμ΄μλ λμΌμ±λ 보μ₯λλ€. 1μ°¨ μΊμκ° λ°λ³΅ κ°λ₯ν μ½κΈ°(Repeatable Read)λ₯Ό μ 곡νκΈ° λλ¬Έμ΄λ€.
=> νΈλμμ
격리 μμ€μ λ°μ΄ν°λ² μ΄μ€κ° μλ μ ν리μΌμ΄μ
μ°¨μμμ μ 곡
- νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°
μκΉ μ€λͺ νλ μΏΌλ¦¬κ° μ€μ λ‘ λκ°λ μμ μ΄λ€. flash()κ° νΈμΆλ λ μ€μ λ‘ μΏΌλ¦¬κ° λκ°μ§λ§, νΈλμμ μ΄ commitλ λ flushκ° μΌμ΄λλ―λ‘ μ¬μ€μ μ΄ μμ μ νΈμΆλλ€.
μ κ·Έλ¦Όμ²λΌ μΊμμ μ°μ°μ΄ μΌμ΄λ λλ§λ€ νμν μΏΌλ¦¬κ° μ μ₯μμ μ μ₯λλ€κ° λκ°λ―λ‘ μΏΌλ¦¬λ₯Ό νλ²μ λ²νΌλ§ν΄μ λ 리λ μ±λ₯μμ μ΄μ λ μλ€(μ€μ μμ λ²νΌμ ν¬κΈ°λ μ ν μ μλ€)
- λ³κ²½ κ°μ§(Dirty Checking)
EntityManager em = emf.createEntityManager(); EntityTransaction transaction = em.getTransaction(); transaction.begin(); // [νΈλμμ ] μμ // μμ μν°ν° μ‘°ν Member memberA = em.find(Member.class, "memberA"); // μμ μν°ν° λ°μ΄ν° μμ memberA.setUsername("hi"); memberA.setAge(10); //em.update(member) μ΄λ° μ½λκ° μμ΄μΌ νμ§ μμκΉ? <========== μλΆλΆ μ€μ transaction.commit(); // [νΈλμμ ] 컀λ°
μμμ± κ°μ²΄λ λ°λ‘ λͺ λ Ήμμ΄ κ°μ²΄λ§ λ³κ²½λμ΄λ λ³κ²½μ¬νμ΄ λ°μ΄ν°λ² μ΄μ€μ μ μ©λλ€. μ΄λ₯Ό λν°μ²΄νΉμ΄λΌκ³ νλ€. μ리λ μμ²λΌ μ€λ μ·κ³Όμ λΉκ΅λ₯Ό ν΅ν΄ μ λ°μ΄νΈ μΏΌλ¦¬κ° μλμΌλ‘ μμ±λλ νμμ΄λ€.
무μμΈ μμμ± κ°μ²΄μΈμ§λ₯Ό μμ΄ν΄νλ©΄ κ°μ²΄ μμ μ΄μΈμ λμμ νμνμ§ μλ€.
Flush()
- em.flush() : λ³λ‘μΈμΌμ μλ€.
- νΈλμμ 컀λ°
- JPQL 쿼리μ€ν
em.persist(memberA); em.persist(memberB); em.persist(memberC); //μ€κ°μ JPQL μ€ν query = em.createQuery("select m from Member m", Member.class); List<Member> members= query.getResultList();
μ λλ‘ jpqlμ΄ μνλλ €λ©΄ μ΄μ κ²°κ³Όκ° λ°μλμ΄ μμ΄μΌνλ―λ‘
- μ΄λ¦λλ¬Έμ ν·κ°λ¦¬μ§ λ§μ. SQLμ μ₯μκ° νλ¬μλλ κ²μ΄λ€. μμμ± μ»¨ν μ€νΈλ μ μ§λλ€.
- clear()μ μν΄μ μμμ± μ»¨ν μ€νΈκ° μ¬λΌμ§λ€.
μ€μμμνκ° λλλ²
- em.detach(entity)
- em.clear()
- em.close()
μμμ± μ»¨ν μ€νΈμ μλͺ
μκΉ 1μ°¨ μΊμμ μ±λ₯μμ μ΄μ μ λ³λ‘ μλ€κ³ λ§νκ²μ΄, νΈλμμ μ΄ λλλ©΄ μμμ± μ»¨ν μ€νΈλ μμ λλ€(μ΄κ±° λ§λμ§ νμΈ)