μμμ± μ»¨ν μ€νΈ
μμμ± μ»¨ν μ€νΈ (Persistence Context) λ?
μν°ν° 맀λμ λ₯Ό ν΅ν΄ μ κ·Όκ°λ₯ν λ
Όλ¦¬μ μΈ νκ²½μΌλ‘, μν°ν°λ₯Ό μꡬ μ μ₯νλ νκ²½μ΄λ€.
μν°ν°μ μλͺ μ£ΌκΈ°
β’
λΉμμ (new / transient)
μμμ± μ»¨ν
μ€νΈμ μ ν κ΄κ³κ° μλ μλ‘μ΄ μν
β’
μμ (managed)
μμμ± μ»¨ν
μ€νΈμ μν΄ κ΄λ¦¬λλ μν
β’
μ€μμ (detached)
μμμ± μ»¨ν
μ€νΈμ μ μ₯λμλ€κ° λΆλ¦¬λ μν
β’
μμ (removed)
μμ λ μν
λΉμμ
λ¨μ μλ° κ°μ²΄λ₯Ό μμ±ν μνλ λΉμμ μνμ΄λ€.
//κ°μ²΄λ₯Ό μμ±ν μν(λΉμμ)
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);
Java
볡μ¬
em.persist() λ₯Ό ν λ DB μ μΏΌλ¦¬κ° κ°λ κ²μ΄ μλλΌ, μ΄νμ commit μ μΏΌλ¦¬κ° λ μκ°λ€.
μ€μμ
κ°μ²΄λ₯Ό μμμ± μ»¨ν
μ€νΈμμ λΆλ¦¬ν μνμ΄λ€. (κ°μ²΄ μ체λ μ‘΄μ¬ν¨)
//νμ μν°ν°λ₯Ό μμμ± μ»¨ν
μ€νΈμμ λΆλ¦¬, μ€μμ μν
em.detach(member);
Java
볡μ¬
μμ
μν°ν° μ체λ₯Ό DBμμ μμ νλ€.
//μμ λμ μν°ν° μ‘°ν
Member memberA = em.find(Member.class, "memberA");
em.remove(memberA); //μν°ν° μμ
Java
볡μ¬
μμμ± μ»¨ν μ€νΈμ μ΄μ
β’
1μ°¨ μΊμ
β’
λμΌμ± 보μ₯
β’
νΈλμμ
μ μ§μνλ μ°κΈ° μ§μ°
β’
λ³κ²½ κ°μ§
β’
μ§μ° λ‘λ©
1μ°¨ μΊμ
@SpringBootApplication
public class HelloJpaApplication {
public static void main(String[] args) {
SpringApplication.run(HelloJpaApplication.class, args);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager(); // em : DB connection
EntityTransaction tx = em.getTransaction();
tx.begin(); // νΈλμμ
μμ
try {
// λΉμμ
Member member = new Member();
member.setId(2L);
member.setName("HelloA");
// μμν
em.persist(member); // 1μ°¨ μΊμμ μ μ₯
// SELECT
Member findMember = em.find(Member.class, 2L);
// findMember : JPA λ₯Ό ν΅ν΄μ κ°μ Έμ¨ κ°μ²΄λ DBμ μ°κ²°λΌμλ€κ³ 보면 λ¨
// 1μ°¨ μΊμμ member κ° μκΈ° λλ¬Έμ DBμ μ‘°ν쿼리λ₯Ό μ λ λ¦¬κ³ μΊμμμ μ‘°νν΄μ΄
System.out.println("findMember.id = " + findMember.getId());
System.out.println("findMember.name = " + findMember.getName());
tx.commit(); // νΈλμμ
컀λ°
} catch (Exception e) {
tx.rollback(); // νΈλμμ
λ‘€
} finally {
em.close();
}
emf.close();
}
}
Java
볡μ¬
findMember.id μ findMember.name μ΄ μ°ν λ DB μ μΏΌλ¦¬κ° μ λ λΌκ° κ²μ νμΈν μ μλ€.
μ¦, μμμ± μ»¨ν
μ€νΈμ 1μ°¨ μΊμμμ κ°μ κ°μ Έμλ€λ λ»μ΄λ€.
νμ§λ§ μμμ± μ»¨ν
μ€νΈλ λ³΄ν΅ νΈλμμ
λ¨μλ‘ μμ±λμλ€κ° λ€μ μ΄κΈ°νλκΈ° λλ¬Έμ 1μ°¨ μΊμμ μ±λ₯ μ ν° μ΄μ μ μκΈ΄νλ€.
μμ μν°ν°μ λμΌμ± 보μ₯
κ°μ νΈλμμ
λ¨μ(μμμ± μ»¨ν
μ€νΈ λ΄)μμμ κ°μ μν°ν°μ λμΌμ±μ 보μ₯ν΄μ€λ€.
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //λμΌμ± λΉκ΅ true
Java
볡μ¬
μ°κΈ° μ§μ°
μ°κΈ°λ₯Ό μ§μ°νλ€κ° νΈλμμ
μ»€λ° μμ DBμ 쿼리λ₯Ό λ λ¦°λ€.
SQL μ DBμ λ λ¦¬μ§ μκ³ μμ±ν SQL μ μ°κΈ° μ§μ° SQL μ μ₯μμ μ μ₯ν΄λλλ€.
κ·Έ ν, commit() λ©μλ μμ μ μ°κΈ° μ§μ° SQL μ μ₯μμ SQL λ€μ΄ flush κ° λλ©΄μ μ€μ DB μ νΈλμμ
μ΄ μ»€λ°λλ€. (sql μ€ν)
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//μν°ν° 맀λμ λ λ°μ΄ν° λ³κ²½μ νΈλμμ
μ μμν΄μΌ νλ€.
transaction.begin(); // [νΈλμμ
] μμ
em.persist(memberA);
em.persist(memberB);
//μ¬κΈ°κΉμ§ INSERT SQLμ λ°μ΄ν°λ² μ΄μ€μ 보λ΄μ§ μλλ€.
//컀λ°νλ μκ° λ°μ΄ν°λ² μ΄μ€μ INSERT SQLμ 보λΈλ€.
transaction.commit(); // [νΈλμμ
] 컀λ°
Java
볡μ¬
persistence.xml νμΌμμ jcbc λ°°μΉ μ¬μ΄μ¦ μ΅μ
μ ν΅ν΄ ν λ²μ flush νλ sql κ°μλ₯Ό μ€μ ν μ μλ€.
<property name="hibernate.jdbc.batch_size" value="10"/>
XML
볡μ¬
λ³κ²½ κ°μ§(Dirty Checking)
JPA λ‘ λΆλ¬μ¨ κ°μ λ§μΉ μλ° collection μ λ€λ£¨λ―μ΄ λ³κ²½νκΈ°λ§ νλ©΄, JPA κ° κ°μ§λ₯Ό ν΄μ DBμ 쿼리λ₯Ό λ λ €μ€λ€.
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(); // [νΈλμμ
] 컀λ°
Java
볡μ¬
λ΄λΆμ리
κΈ°μ‘΄ μν°ν°μ κ°μ΄ μ€λ
μ·μΌλ‘ μ μ₯λΌμλλ°, JPA κ° μΊμ±λ Entity μ μ€λ
μ·μ λΉκ΅νμ¬ λ³κ²½λ κ°μ λν΄ UPDATE SQL μ μμ±ν΄μ€λ€.
νλ¬μ (flush)
νλ¬μλ?
μμμ± μ»¨ν
μ€νΈμ λ³κ²½λ΄μ©μ μ€μ DB μ λ°μνλ κ²(== 쿼리λ₯Ό λ 리λ κ²)
νλ¬μ λ°μ μ μμμ± μ»¨ν μ€νΈμ λ΄λΆ λμ
1.
flush() λ°μ
2.
λ³κ²½λ JPA κ°μ²΄μ λν΄, JPAκ° μμμ± μ»¨ν
μ€νΈμ λ³κ²½μ κ°μ§ν¨
3.
μμ λ μν°ν°μ κ΄ν SQL(쿼리)μ μ°κΈ° μ§μ° SQL μ μ₯μμ λ±λ‘ν¨
4.
μ°κΈ° μ§μ° SQL μ μ₯μ μ 쿼리λ₯Ό DB μ λ λ¦Ό
μμμ± μ»¨ν μ€νΈλ₯Ό νλ¬μ νλ λ°©λ²
1.
em.flush() : μ§μ νΈμΆ
2.
νΈλμμ
commit() : νλ¬μ μλ νΈμΆ
3.
JPQL 쿼리 μ€ν μ : νλ¬μ μλ νΈμΆ
em.flush()
// λΉμμ
Member member1 = new Member(32L, "memA");
Member member2 = new Member(33L, "memB");
// μμν
em.persist(member1); // 1μ°¨ μΊμμ μ μ₯
em.persist(member2); // 1μ°¨ μΊμμ μ μ₯ (but, 쿼리λ μ λκ°κ³ SQL μ μ₯μμ λ²νΌλ§ μν)
em.flush(); // νλ¬μ μ§μ νΈμΆ μμΌμ μ»€λ° μ μ DB μ 쿼리 λ λ¦Ό
System.out.println("============");
tx.commit(); // νΈλμμ
컀λ°
Java
볡μ¬
Β em.flush() λ₯Ό ν΅ν΄ νλ¬μλ₯Ό μ§μ νΈμΆν΄μ tx.commit() μ μ DB μ 쿼리λ₯Ό λ λ¦°λ€.
System.out.println("============") μ μ μΏΌλ¦¬κ° λκ°μ νμΈν μ μλ€.
JPQL 쿼리 μ€ν μ νλ¬μ μλνΈμΆ
νλ‘κ·Έλλ¨Έμ νΈμλ₯Ό μν΄ JPQL 쿼리 μ€ν μ, JPA κ° μλμΌλ‘ νλ¬μλ₯Ό μλνΈμΆν΄μ νμ¬μ μμμ± μ»¨ν
μ€νΈλ₯Ό DBμ λ°μνλ€.
λ¨, νλ¬μκ° λλλΌλ μμμ± μ»¨ν
μ€νΈμ 1μ°¨ μΊμλ κ·Έλλ‘ μ μ§λλ€.
1μ°¨ μΊμλ μν°ν° 맀λμ κ° λ¦¬μ
λ λ κ°μ΄ 리μ
λλ€.
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// μ€κ°μ JPQL μ€ν
// μλμΌλ‘ flush μ€νλΌμ memberA, memberB, memberC μμ±μΏΌλ¦¬κ° DBμ λ λΌκ°λ€.
query = em.createQuery("select m from Member m", Member.class);
List<Member> members= query.getResultList();
Java
볡μ¬
νλ¬μ μ΅μ
em.setFlushMode(FlushModeType.COMMIT)
1.
FlushModeType.AUTO (κΈ°λ³Έκ°)
νΈλμμ
μ»€λ° κ³Ό JPQL 쿼리λ₯Ό μ€νν λ νλ¬μκ° νΈμΆλλ€.
2.
FlushModeType.COMMIT
νΈλμμ
μ»€λ° μμλ§ νλ¬μκ° νΈμΆλλ€. (JPQL 쿼리 μ€ν μμ νλ¬μ μλνΈμΆ X)
μΌλ°μ μΌλ‘ AUTO λ₯Ό κ±°μ μ΄λ€.
μ€μμ μν
μμ μνλ‘ λ§λλ λ°©λ²
1.
em.persist()
2.
em.find() λ± νΈμΆμμ 1μ°¨μΊμμ μν°ν°κ° μμ΄μ DB μ κ·ΌμΌλ‘ 1μ°¨μΊμμ μν°ν°λ₯Ό λ±λ‘ν λ
μ€μμ μνλ?
μμ μνμ μν°ν°λ₯Ό μμμ± μ»¨ν
μ€νΈμμ λΆλ¦¬(detach)νλ κ²
μ¦, λ μ΄μ μμμ± μ»¨ν
μ€νΈμ κ΄λ¦¬λ₯Ό λ°μ§ μκΈ° λλ¬Έμ λ³κ²½ κ°μ§ λ±μ μμμ± μ»¨ν
μ€νΈκ° μ 곡νλ κΈ°λ₯μ μ¬μ©νμ§ λͺ»νλ€.
μ€μμ μνλ‘ λ§λλ λ°©λ²
1.
em.detach(entity)
νΉμ μν°ν°λ§ μ€μμ μνλ‘ μ ν
2.
em.clear()
μμμ± μ»¨ν
μ€νΈ μ체λ₯Ό μμ ν μ΄κΈ°ν
3.
em.close()
μμμ± μ»¨ν
μ€νΈλ₯Ό μ’
λ£