๐ค ์์์ฑ ์ปจํ ์คํธ?
์๋ฏธ๋ฅผ ํด์ํด๋ณด์๋ฉด "์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ" ์ด๋ผ๋ ๋ป์ผ๋ก ๋์ ๋ณด์ด์ง ์๋ ๋ ผ๋ฆฌ์ ์ธ ๊ฐ๋ ์ด๋ค, EntityManager๋ฅผ ํตํด์ ์์์ฑ ์ปจํ ์คํธ์ ์ ๊ทผํ๋ค.
โ ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ & ์ํฐํฐ ๋งค๋์ Process
EntityManager.persist(entity); // ์์ํ
EntityManager๋ฅผ ์์ฑํ๋ฉด 1:1๋ก PersistenceContext๋ผ๋ ๊ณต๊ฐ์ด ์์ฑ๋์ด์ง๊ณ , Entity๋ฅผ DB์ ์ ์ฅํ๋๊ฒ์ด ์๋๋ผ PersistenceContext์ ์ ์ฅํ๋ค.
โ ์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ
๐ ๋น์์(new/transient)
//๊ฐ์ฒด๋ฅผ ์์ฑํ ์ํ ( ๋น์์ )
Member member = new Member();
member.setId("member1");
member.setName("username");
๊ฐ์ฒด๋ฅผ ์์ฑ๋ง ํ ์ํ๋ก JPA์ ์ ํ ๊ด๊ณ์๋ ์๋ก์ด ์ํ
๐ ์์(managed)
//๊ฐ์ฒด๋ฅผ ์์ฑํ ์ํ ( ๋น์์ )
Member member = new Member();
member.setId("member1");
member.setName("username");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ํ(์์)
em.persist(member);
์์ฑํ member๊ฐ์ฒด๋ฅผ EntityManager๋ฅผ ํตํด persistํ์ฌ PersistenceContext์ ์ ์ฅํ ์ํ
๐ ์ค์์(detached)
em.detach(member); //ํน์ ์ํฐํฐ๋ง ์ค์์ ์ํ๋ก ์ ํ
em.clear(); // ์์์ฑ ์ปจํ
์คํธ๋ฅผ ์์ ํ ์ด๊ธฐํ
em.close(); // ์์์ฑ ์ปจํ
์คํธ๋ฅผ ์ข
๋ฃ
์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ
๐ ์ญ์ (removed)
em.remove(member);
์ญ์ ๋ ์ํ
โ ์์์ฑ ์ปจํ ์คํธ์ ์ด์
๐ 1์ฐจ ์บ์ ์กฐํ
//๊ฐ์ฒด๋ฅผ ์์ฑํ ์ํ ( ๋น์์ )
Member member = new Member();
member.setId("member1");
member.setName("username");
.
.
.
//๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ํ(์์)
em.persist(member); // 1์ฐจ ์บ์์ ์ ์ฅ๋จ
// 1์ฐจ ์บ์์์ ์กฐํ
Member findMember = em.find(Member.class, "member1");
// DB์์ ์กฐํ
Member findMember2 = em.find(Member.class, "member2"); // DB์กฐํ ํ 1์ฐจ์บ์์ ์ ์ฅ
EntityManager๋ transaction๋จ์๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ๊ณ ๊ฐ์ ์์ฒญ ํ ๋น์ฆ๋์ค๊ฐ ๋๋๊ฒ๋๋ฉด ์์์ฑ ์ปจํ ์คํธ๋ ์ง์์ง๊ณ , ์ฌ์ฉ์ ๋ชจ๋๊ฐ ๊ณต์ ํ๋ ์บ์๊ฐ ์๋ 1์ฐจ ์บ์์ด๊ธฐ ๋๋ฌธ์ ํฐ ์ฑ๋ฅ์์ ์ด์ ์ ๊ธฐ๋ํ๊ธด ํ๋ค์ง๋ง ๋น์ฆ๋์ค ๋ก์ง์ด ๋ณต์กํ ๊ฒฝ์ฐ์๋ ์ด์ ์ ์ป์ ์๋ ์๋ค.
๐ ์์ ์ํฐํฐ์ ๋์ผ์ฑ ๋ณด์ฅ
Member a = em.find(Memeber.class, "Member1");
Member b = em.find(Member.class, "Memeber2");
a == b // true
Java Collection์์ ๊ฐ์ ๊ฐ์ ธ์ค๋๊ฒ๊ณผ ๊ฐ์ด ๊ฐ์ Reference์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ฉด ๊ฐ์ ๊ฐ์ ๋ณด์ฌ์ค๋ค, ์ด๋ ์์์ ์ค๋ช ํ 1์ฐจ์บ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค.
๐ ์ํฐํฐ ๋ฑ๋ก - ์ฐ๊ธฐ ์ง์ฐ
em.persist(memberA)๋ฅผ ์คํํ๋ฉด JPA๊ฐ memberA๋ฅผ ๋ถ์ํ์ฌ Insert SQL์ ์์ํ์ฌ ์ฐ๊ธฐ์ง์ฐ SQL์ ์ฅ์์ ์ ์ฅํ๋ค. memberB๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
์ฐ๊ธฐ ์ง์ฐ SQL์ ์ฅ์์ ์ฐจ๊ณก์ฐจ๊ณก ์์ธ SQL์ transaction.commit() ๋ช
๋ น๊ณผ ํจ๊ป flush ๋์ด ํ๋ฒ์ ์คํ๋์ด์ง๋ค.
๐ก๊ทธ๋ผ ์ ํ๋ฒ์ ๋ชจ์์ ๋ณด๋ผ๊น?
DB์ ์๋ฌด๋ฆฌ insertํ๋๋ผ๋ commit๋์ง ์์ผ๋ฉด ๋ฐ์์ด ์๋๊ธฐ๋๋ฌธ์ commit์ด์ ์๋ง ์คํ๋๋ฉด ๋๋ค ๋ํ ์คํ ๋ ๋๋ง๋ค SQL์ ๋ณด๋ด์ ์คํํ๊ฒ ๋๋ฉด ์ต์ ํ ํ ์ ์๋ ์ฌ์ง๊ฐ ์ฌ๋ผ์ง๋ค.
Hibernate์์๋ ์ต์
์ผ๋ก ์ค์ ํ size๋งํผ SQL์ ๋ชจ์์ flushํ๋ค
<propert name="hibernate.jdbc.batch_size" value="10" />
๋ฒํผ๋ง๊ฐ์ ๊ธฐ๋ฅ์ผ๋ก ๋ชจ์๋ค๊ฐ DB๋ก ์ ์ฅํจ์ผ๋ก์จ ์ด์ ์ ์ป์ ์ ์๋ค.
๐ ์ํฐํฐ ์์ - ๋ณ๊ฒฝ ๊ฐ์ง(Dirty Checking)
JPA์ ๋ชฉ์ ์ Java Collection๋ค๋ฃจ๋ฏ์ด ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ update๋ผ๋ ํน์ ๋ช
๋ น์์ด ๊ฐ์ฒด๋ฅผ setํ์ฌ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ DB์ ๋ฐ์ํ๋ค.
์ด๋ฌํ ๋์์ด ๊ฐ๋ฅํ ์ด์ ๋ 1์ฐจ ์บ์ ์์๋ ์ค๋
์ท์ด๋ ๊ณต๊ฐ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ค๋
์ท์ ๊ฐ์ ์ต์ด๋ก ์ฝ์ด์จ ์์ ์ ์ํ๋ฅผ ์ ์ฅํ๊ณ , flush๋๋ ์์ ์ Entity์ ์ค๋
์ท์ ๋น๊ตํ์ฌ ์ฆ ์ต์ด ์์ ์ Entity์ flush์์ ์ Entity๋ฅผ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ๋์์ผ๋ฉด ๋ด๋ถ์ ์ผ๋ก update์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์คํํ๋ค.
๐ flush
์์์ฑ ์ปจํ
์คํธ์ ๋ณ๊ฒฝ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๋ค
- em.flush() - ์ง์ ํธ์ถ
- ํธ๋์ญ์ ์ปค๋ฐ - ํ๋ฌ์ ์๋ ํธ์ถ
- JPQL ์ฟผ๋ฆฌ ์คํ - ํ๋ฌ์ ์๋ ํธ์ถ
- ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋น์ฐ์ง ์๋๋ค.
- ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํ
- ํธ๋์ญ์ ์ด๋ผ๋ ์์ ๋จ์๊ฐ ์ค์ -> ์ปค๋ฐ ์ง์ ์๋ง ๋๊ธฐํ ํ๋ฉด ๋จ
๐ ์์ฝ
JPA๋ ์ฌ์ฉ์๊ฐ ์์ฒญ์ ํ๋ฉด EntityManagerFactory์์ EntityManager๋ฅผ ์์ฑํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋๋ฐ ์์์ฑ ์ปจํ
์คํธ(PersistenceContext)๋ผ๋ ๋
ผ๋ฆฌ์ ์ธ ๊ณต๊ฐ์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ค์ ๊ด๋ฆฌํ๊ฒ ๋๋ค.
์์์ฑ ์ปจํ
์คํธ๋ ํธ๋ ์ ์
๋จ์ ์์์ ์๋ํ๊ฒ ๋๋ฉฐ ๋น์ฆ๋์ค๊ฐ ๋๋๋ฉด ์ฌ๋ผ์ง๊ฒ ๋๋ค.
๋ํ ์์์ฑ ์ปจํ
์คํธ ๋ด๋ถ์๋ 1์ฐจ์บ์์ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ ์ด๋ฅผ ํตํด 1์ฐจ ์บ์ ์กฐํ, ์ฐ๊ธฐ ์ง์ฐ, ๋ณ๊ฒฝ ๊ฐ์ง ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ๊ฐ์ง ์ด์ ์ ์ ๊ณตํ๋ค.
๋ฐ์ดํฐ์ ์กฐํ, ๋ฑ๋ก, ์์ , ์ญ์ ์ Java ๊ฐ์ฒด ๋ค๋ฃจ๋ฏ ๋ด๋ถ์ ์ผ๋ก ๋น๊ตํ์ฌ SQL๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์์ฑํ์ง ์์๋ ์ต์ ํ๋ SQL๋ฌธ์ ์์ฑํ์ฌ DB์ ์์ฒญํ๋ค.
๐ ์ฐธ๊ณ ๋ฐ ์๋ฃ ์ถ์ฒ : ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ (๊น์ํ)