PersistenceContext (์์์ฑ ์ปจํ ์คํธ)
์์์ฑ ์ปจํ ์คํธ๋ ์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ์ด๋ผ๋ ๋ป์ด๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์์ ๊ฐ์ฒด๋ฅผ ๋ณด๊ดํ๋ ๊ฐ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ญํ ์ ํ๋ค.
์ํฐํฐ ๋งค๋์ ๋ฅผ ํตํด ์ํฐํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์กฐํํ๋ฉด ์ํฐํฐ ๋งค๋์ ๋ ์์์ฑ ์ปจํ ์คํธ์ ์ํฐํฐ๋ฅผ ๋ณด๊ดํ๊ณ ๊ด๋ฆฌํ๋ค.
public Long save(Member member) {
em.persist(member);
return member.getId();
}
EntityManager.persist(member) : ์ํฐํฐ ๋งค๋์ ๋ฅผ ์ฌ์ฉํด ํ์ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅํ๋ค๋ ์๋ฏธ!
์ค์ ๋ก๋ DB์ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ํตํด์ Entity๋ฅผ ์์ํํ๋ค๋ ๋ป์ด๋ค.
์ ํํ ๋งํ๋ฉด persist() ์์ ์๋ Entity๋ฅผ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํ๋ ๊ฒ์ด๋ค.
EntityManager๋ฅผ ํตํด์ ์์์ฑ ์ปจํ
์คํธ์ ์ ๊ทผํ๋ค.
EntityManager๊ฐ ์์ฑ๋๋ฉด 1:1๋ก ์์์ฑ ์ปจํ
์คํธ๊ฐ ์์ฑ๋๋ค.
์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ
//๊ฐ์ฒด๋ฅผ ์์ฑํ ์ํ(๋น์์)
Member member = new Member();
member.setId("member1");
member.setUsername("ํ์1");
์์์ฑ ์ปจํ ์คํธ์ ์ ํ ๊ด๊ณ๊ฐ ์๋ ์๋ก์ด ์ํ
JPA ์ ๊ด๊ณ๊ฐ ์๋ ์ํ - ๋น์์ ์ํ
์์ (managed)
์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋๋ ์ํ
// ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ํ(์์)
em.persist(member);
member ๊ฐ์ฒด๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅํ ์ํ
์์ง DB์ ์ ์ฅ๋ ๊ฒ์ ์๋๋ค
DB๋ ์ดํ์ ํธ๋์ญ์ ์ปค๋ฐํด์ผ ์ ์ฅ๋๋ค
์ค์์(detached)
//ํ์ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์์ ๋ถ๋ฆฌ, ์ค์์ ์ํ
em.detach(member);
์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์ด์๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ
์์ -> ์ค์์
์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ ๋ชปํจ
์์ ์ํ๊ฐ ๋๋ ๋ฐฉ๋ฒ
1.
em.persist(member)
2.
em.find(member)
์กฐํํ๋๋ฐ ์์์ฑ ์ปจํ ์คํธ(1์ฐจ ์บ์)์ ์๋ค
-> DB์์ ์กฐํํด์ 1์ฐจ ์บ์์ ์ ์ฅํ๋ค .
1์ฐจ ์บ์(์์ ์ปจํ ์คํธ)์ ์ฌ๋ผ๊ฐ ์ํ == ์์ ์ํ == JPA๊ฐ ๊ด๋ฆฌํ๋ ์ํ
์ค์์ ์ํ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ
em.detach(entity)
ํน์ ์ํฐํฐ๋ง ์ค์์ ์ํ๋ก ์ ํ
em.clear()
์์์ฑ ์ปจํ ์คํธ๋ฅผ ์์ ํ ์ด๊ธฐํ
em.close()
์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ข ๋ฃ
์ญ์ (removed)
//๊ฐ์ฒด๋ฅผ ์ญ์ ํ ์ํ(์ญ์ )
em.remove(member);
์ญ์ ๋ ์ํ
์์์ฑ ์ปจํ ์คํธ์ ์ด์
1์ฐจ ์บ์
์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์ ์ค๊ฐ ๊ณ์ธต์ด ์์
DB๋ฅผ ์กฐํํ๊ธฐ ์ ์ 1์ฐจ ์บ์๋ฅผ ๋จผ์ ์กฐํํ๋ค .
1์ฐจ ์บ์์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด DB๋ฅผ ์กฐํํ๋ค -> ๊ทธ ๋ฐ์ดํฐ๋ฅผ 1์ฐจ ์บ์์ ์ ์ฅ -> ๋ฐ์ดํฐ ๋ฐํ
์์ ์ํฐํฐ์ ๋์ผ์ฑ ๋ณด์ฅ
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //๋์ผ์ฑ ๋น๊ต true
์ํฐํฐ ๋ฑ๋ก ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ
transaction.begin(); // [ํธ๋์ญ์
] ์์
์ํฐํฐ ๋งค๋์ ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํธ๋์ญ์ ์ ์์ํด์ผ ํ๋ค.
em.persist(memberA);
em.persist(memberB);
//์ฌ๊ธฐ๊น์ง INSERT SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณด๋ด์ง ์๋๋ค.
//์ปค๋ฐํ๋ ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ INSERT SQL์ ๋ณด๋ธ๋ค.
transaction.commit(); // [ํธ๋์ญ์
] ์ปค๋ฐ
์ปค๋ฐํ๋ ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ SQL ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ธ๋ค
memberB๊ฐ 1์ฐจ ์บ์์ ์ ์ฅํ๊ณ ๋์์
SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์์๋๋ค .
์ด ์์๋ ์ฟผ๋ฆฌ๋ค์ ์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ก๋ ๊น?
transaction.commit(); ํ๋ ์์ ์
์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์์ฌ์๋ ์ฟผ๋ฆฌ๋ค์ด flush๊ฐ ๋๋ฉด์ DB์ ์ ์ก๋๋ค .
์ํฐํฐ ์์ โจ,๋ณ๊ฒฝ ๊ฐ์ง(dirty checking)
// ์์ ์ํฐํฐ ์กฐํ
Member memberA = em.find(Member.class, "memberA");
์์์ฑ ์ปจํ ์คํธ์์ ๋ฉค๋ฒ๋ฅผ ์กฐํํ๋ค .
// ์์ ์ํฐํฐ ๋ฐ์ดํฐ ์์
memberA.setUsername("hi");
memberA.setAge(10);
์กฐํํ ๋ฉค๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ค
//em.update(member) ์ด๋ฐ ์ฝ๋๊ฐ ์์ด์ผ ํ์ง ์์๊น?
์๋ฐ์ ์ปฌ๋ ์ ์์๋ ๊ฐ์ ๊บผ๋ด๊ณ ๋ณ๊ฒฝํ์ ๋
๊ทธ ๋ค์ ๋ค์ ์ปฌ๋ ์ ์ ์ง์ด ๋ฃ์ง ์๋๋ค
JPA๋ ๋๊ฐ๋ค
1. ๋ฐ์ดํฐ๋ฒ ์ด์ค commit ํ๋ ์์ ์ ๋ด๋ถ์ ์ผ๋ก flush() ๊ฐ ํธ์ถ์ด ๋๋ค .
2. ์ํฐํฐ์ ์ค๋ ์ท์ ๋น๊ตํ๋ค .
์ค๋ ์ท : ์ต์ด ์ํ(์์์ฑ ์ปจํ ์คํธ์ ๋ค์ด์จ ์์ )
memberA.setUsername("hi");
memberA.setAge(10);
์์์ฑ ์ปจํ ์คํธ์์ ์กฐํํ ๋ฉค๋ฒ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์
์ํฐํฐ์ ์ค๋ ์ท์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ํ์ธ
3. -> UPDATE ์ฟผ๋ฆฌ๋ฅผ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ๋ง๋ค์ด๋๋ค .
flush(ํ๋ฌ์)
์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ๋ด์ฉ์โจ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์
์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋น์ฐ์ง ์์
flush()๋ฅผ ํ๋ฉด ์์์ฑ ์ปจํ ์คํธ์ ์๋ 1์ฐจ ์บ์๊ฐ ์ง์์ง๋ ๊ฒ์ด ์๋
์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํ
๋ฐ์ดํฐ๋ฅผ ๋ค ๋ณด๋ด๋ ๊ฒ์ด ์๋๋ผ
์ํฐํฐ ์์ ,๋ณ๊ฒฝ ๊ฐ์ง(dirty checking) ->
์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์์ธ SQL (๋ฑ๋ก, ์์ , ์ญ์ ์ฟผ๋ฆฌ) ์ ๋ฐ์ํ๋ ๊ณผ์
์ด ์ฟผ๋ฆฌ๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ก โจ
ํธ๋์ญ์ ์ด๋ผ๋ ์์ ๋จ์๊ฐ ์ค์ -> ์ปค๋ฐ ์ง์ ์๋ง ๋๊ธฐํ ํ๋ฉด ๋จ
์์์ฑ ์ปจํ ์คํธ๋ฅผโจ ํ๋ฌ์ํ๋ ๋ฐฉ๋ฒ
- em.flush() - ์ง์ ํธ์ถ
- ํธ๋์ญ์ ์ปค๋ฐ - ํ๋ฌ์ ์๋ ํธ์ถ
- JPQL ์ฟผ๋ฆฌ ์คํ - ํ๋ฌ์ ์๋ ํธ์ถ