ํฐ์คํ ๋ฆฌ ๋ทฐ
[SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 3 (์์์ฑ ๊ด๋ฆฌ - ๋ด๋ถ ๋์ ๋ฐฉ์)
chaewonni 2024. 4. 25. 01:08๐ก์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ์ ์ํฐํฐ ๋งค๋์
- ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ(Entity Manager Factory):
- ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ์ค์ง ํ ๋ฒ๋ง ์์ฑ๋๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์์ ๋๋ง๋ค ์๋ก์ด ์ํฐํฐ ๋งค๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ณต์ฅ ์ญํ ์ ํ๋ค. ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์ ์ ์์ํ๋ ๋ฐ ํ์ํ ์ค์ ์ ๋ณด(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด, Dialect ๋ฑ)๋ฅผ ๊ด๋ฆฌํ๋ค.
- ์ํฐํฐ ๋งค๋์ (Entity Manager):
- ์ํฐํฐ ๋งค๋์ ๋ ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ์ ์ํด ์์ฑ๋๋ฉฐ, ์ค์ ๋ก ์ํฐํฐ์ ๊ด๋ จ๋ ์์ ๋ค์ ์ํํ๋ค. ์ํฐํฐ๋ฅผ ์ ์ฅ, ์์ , ์ญ์ , ์กฐํํ๋ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ฉฐ ๊ฐ ํด๋ผ์ด์ธํธ ์์ฒญ ๋ณ๋ก ์์ฑ๋์ด ์์ฒญ์ด ๋๋๋ฉด ํ๊ธฐ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ๊ณผ ์ง์ ์ ์ผ๋ก ๊ด๋ จ์ด ์์ผ๋ฉฐ, ์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
๐ก์์์ฑ ์ปจํ ์คํธ
๐ป ์์์ฑ ์ปจํ ์คํธ๋?
์์์ฑ ์ปจํ ์คํธ๋ '์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ'์ด๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์๋ค.
์ด๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ๋ก ์ ์ฅ๋๋ ๊ฒ์ด ์๋๋ผ, ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์์ ์ํฐํฐ๋ฅผ ๋ณด๊ดํ๊ณ ๊ด๋ฆฌํ๋ ๊ฐ์์ ๋ ์ด์ด๋ผ๊ณ ํ ์ ์๋ค.
EntityManager.persist(entity); ์ฝ๋๋ ์ํฐํฐ ๋งค๋์ ๋ฅผ ์ฌ์ฉํด์ ํ์ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅํ๋ค.
๐ป ์ํฐํฐ ๋งค๋์ ์์ ๊ด๊ณ
์ํฐํฐ ๋งค๋์ (Entity Manager)๋ฅผ ์์ฑํ ๋ ๊ฐ๊ฐ์ ์ํฐํฐ ๋งค๋์ ์๋ ๊ณ ์ ์ ์์์ฑ ์ปจํ ์คํธ๊ฐ ๋ง๋ค์ด์ง๋ค. ์ด ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํตํด ์ํฐํฐ ๋งค๋์ ๋ ์ํฐํฐ๋ค์ ๊ด๋ฆฌํ๋ฉฐ, ์ฌ๊ธฐ์ ์ํฐํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์ ๋ฐ์ดํธ, ์กฐํ, ์ญ์ ๋ฑ์ ์์ ์ ์ํํ๋ค.
++) ์ฌ๋ฌ ์ํฐํฐ ๋งค๋์ ๊ฐ ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ์ ์ ๊ทผํ ์ ์๋ค.
๐ป ์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ
์ํฐํฐ๋ ๋ค์ ๋ค ๊ฐ์ง ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค:
- ๋น์์(New/Transient): ์์์ฑ ์ปจํ ์คํธ์ ์ ํ ๊ด๊ณ๊ฐ ์๋ ์๋ก์ด ์ํ์ด๋ค.
//๊ฐ์ฒด๋ฅผ ์์ฑํ ์ํ(๋น์์)
Member member = new Member();
member.setId("member1");
member.setUsername("ํ์1");
- ์์(Managed): ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋ ์ํ์ด๋ค. ์๋ฅผ ๋ค์ด, em.persist(member);๋ฅผ ํธ์ถํ๋ฉด ์ด ์ํ๊ฐ ๋๋ค.
//๊ฐ์ฒด๋ฅผ ์์ฑํ ์ํ(๋น์์)
Member member = new Member();
member.setId("member1");
member.setUsername("ํ์1");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ํ(์์)
em.persist(member);
- ์ค์์(Detached): ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ์ด๋ค. ์ด ์ํ๋ em.detach(member);, em.close();, ๋๋ em.clear();๋ฅผ ํธ์ถํ๋ฉด ๋ฐ์ํ๋ค.
//ํ์ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์์ ๋ถ๋ฆฌ, ์ค์์ ์ํ
em.detach(member);
- ์ญ์ (Removed): ์์์ฑ ์ปจํ ์คํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ญ์ ๋ ์ํ์ด๋ค.
//๊ฐ์ฒด๋ฅผ ์ญ์ ํ ์ํ(์ญ์ )
em.remove(member);
๐ป ์์์ฑ ์ปจํ ์คํธ์ ํน์ง
- ์๋ณ์ ๊ฐ: ์์์ฑ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ๋ ๋ชจ๋ ์ํฐํฐ๋ ์๋ณ์ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค.
- ํธ๋์ญ์ ์ปค๋ฐ ์ SQL ์คํ: ์์์ฑ ์ปจํ ์คํธ๋ ํธ๋์ญ์ ์ ์ปค๋ฐํ๋ ์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ SQL์ ์คํํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋ค.
๐ป ์์์ฑ ์ปจํ ์คํธ์ ์ด์
- 1์ฐจ ์บ์
- ๋์ผ์ฑ(identity) ๋ณด์ฅ
- ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ (transactional write-behind)
- ๋ณ๊ฒฝ ๊ฐ์ง (Dirty Checking)
- ์ง์ฐ ๋ก๋ฉ (Lazy Loading)
1. 1์ฐจ ์บ์
์์์ฑ ์ปจํ ์คํธ๋ ๋ด๋ถ์ ์ผ๋ก 1์ฐจ ์บ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํฐํฐ์ ์์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค. 1์ฐจ ์บ์๋ '@Id'๋ก ๋งคํ๋ ํ๋๋ฅผ ํค๋ก ํ๊ณ , ์ํฐํฐ ์ธ์คํด์ค ์์ฒด๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๋ Map ๊ตฌ์กฐ๋ก ๋์ด์๋ค.
์๋ฅผ ๋ค์ด,
//์ํฐํฐ๋ฅผ ์์ฑํ ์ํ(๋น์์)
Member member = new Member();
member.setId("member1");
member.setUsername("ํ์1");
//์ํฐํฐ๋ฅผ ์์, 1์ฐจ ์บ์์ ์ ์ฅ๋จ
em.persist(member);
//1์ฐจ ์บ์์์ ์กฐํ
Member findMember = em.find(Member.class, "member1");
์ ์ฝ๋๊ฐ ์คํ๋๋ฉด, 'Member' ์ํฐํฐ๋ ์์์ฑ ์ปจํ ์คํธ์ 1์ฐจ ์บ์์ ์ ์ฅ๋๋ค.
๊ทธ ํ, ์กฐํ๋ฅผ ํ๋ ค๋ฉด em.find๋ก 1์ฐจ ์บ์์ ์๋ ๊ฐ์ ๊ฐ์ ธ์ค๋ฉด ๋๋ค.
๋ง์ฝ 1์ฐจ ์บ์์ ์กฐํํ๋ ค๋ ๊ฐ์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์๋ฅผ ๋ค์ด,
Member findMember2 = em.find(Member.class, "member2");
๋ก "member2"๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ๋ค๋ฉด,
- ์ํฐํฐ ์กฐํ ์์ฒญ: em.find(Member.class, "member2") ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ Member ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์๋ณ์ "member2"๋ก ์กฐํํ๋ค.
- 1์ฐจ ์บ์ ๊ฒ์ฌ: ์์ฒญ๋ ์ํฐํฐ๊ฐ 1์ฐจ ์บ์์ ์กด์ฌํ๋์ง ํ์ธํ๋ค. member2๊ฐ ์บ์์ ์์ผ๋ฏ๋ก DB์กฐํ๋ก ๋์ด๊ฐ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ: member2๊ฐ 1์ฐจ ์บ์์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ง์ ์กฐํ๋ฅผ ์ํํ๋ค.
- ์ํฐํฐ ์์ํ: ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ Member ์ํฐํฐ๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ 1์ฐจ ์บ์์ ์ ์ฅํ๋ค. ์ด ์์ ์์ member2๋ ์์ ์ํ๊ฐ ๋๋ค.
- ์ํฐํฐ ๋ฐํ: ์์ฑ ๋ฐ ์ ์ฅ ๊ณผ์ ์ ๊ฑฐ์น ์์ํ๋ Member ์ํฐํฐ๋ฅผ ๋ฐํํ๋ค.
๊ทธ ๋ค์์ ๋ "member2"๋ฅผ ํ ๋ฒ ๋ ์กฐํํ๊ณ ์ถ๋ค๋ฉด, ์ด๋ฏธ 1์ฐจ ์บ์์ ์ ์ฅ๋์๊ธฐ ๋๋ฌธ์ ๋ค์ DB์ ๊ฐ์ ์กฐํํ ํ์๊ฐ ์๋ค.
2. ๋์ผ์ฑ ๋ณด์ฅ
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //๋์ผ์ฑ ๋น๊ต true
JPA์ ์์์ฑ ์ปจํ ์คํธ์ 1์ฐจ ์บ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฒ๋ฆฌ๋๋ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ฐจ์์์ ๋ชจ๋ฐฉํ์ฌ, ํนํ ๋ฐ๋ณต ๊ฐ๋ฅํ ์ฝ๊ธฐ(REPEATABLE READ) ๊ฒฉ๋ฆฌ ์์ค์ ์ ๊ณตํ๋ค.
๋ฐ๋ผ์ a ์ b ๋ฅผ ๋์ผ์ฑ ๋น๊ตํ๋ฉด true๊ฐ ๋์จ๋ค.
3. ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ
JPA์์ ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ(transactional write-behind)์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ํจ์จ์ฑ์ ๊ทน๋ํํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํค๋ ์ค์ํ ๊ธฐ๋ฅ์ด๋ค. ์ด ๊ธฐ๋ฅ์ ํตํด ์ํฐํฐ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ฆ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ์ง ์๊ณ , ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ ์์ ์ ์ผ๊ด์ ์ผ๋ก SQL์ ์ ์กํ๋ค.
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//์ํฐํฐ ๋งค๋์ ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํธ๋์ญ์
์ ์์ํด์ผ ํ๋ค.
transaction.begin(); // [ํธ๋์ญ์
] ์์
em.persist(memberA);
em.persist(memberB);
//์ฌ๊ธฐ๊น์ง INSERT SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณด๋ด์ง ์๋๋ค.
//์ปค๋ฐํ๋ ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ INSERT SQL์ ๋ณด๋ธ๋ค.
transaction.commit(); // [ํธ๋์ญ์
] ์ปค๋ฐ
๋จผ์ , ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค๊ณ ํ๋ค๋ฉด,
์ํฐํฐ ๋ฑ๋ก
- 'em.persist(memberA)'์ 'em.persist(memberB)'๋ฅผ ํธ์ถํ ๋, ํด๋น ์ํฐํฐ๋ค์ INSERT SQL์ ์ฆ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์ก๋์ง ์๋๋ค.
- ๋์ , ์ด SQL๋ฌธ๋ค์ ์์์ฑ ์ปจํ ์คํธ ๋ด์ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์ ์ฅ๋๋ค.
์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์
- ์์์ฑ ์ปจํ ์คํธ๋ 1์ฐจ ์บ์์ ํจ๊ป ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์๋ฅผ ๊ด๋ฆฌํ๋ค.
- ์ด ์ ์ฅ์๋ ํธ๋์ญ์ ์ปค๋ฐ ์๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์กํด์ผ ํ ๋ชจ๋ SQL ๋ช ๋ น์ ๋ชจ์๋ค.
ํธ๋์ญ์ ์ปค๋ฐ
transaction.commit(); // ํธ๋์ญ์
์ปค๋ฐ
- ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ ์๊ฐ, ์์์ฑ ์ปจํ ์คํธ๋ ์ ์ฅ์์ ๋ชจ์ธ SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ผ๊ด ์ ์กํ๋ค.
- ์ด ๊ณผ์ ์ ํ๋ฌ์(flush)์ด๋ผ๊ณ ํ๋ฉฐ, ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํํ๋ค.
์ฐ๊ธฐ ์ง์ฐ์ ์ฅ์
์ฐ๊ธฐ ์ง์ฐ์ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํ๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ์ฌ๋ฌ ๋ณ๊ฒฝ ์ฌํญ์ ํ ๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์กํจ์ผ๋ก์จ ๋คํธ์ํฌ ๋น์ฉ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถํ๋ฅผ ์ค์ผ ์ ์๋ค.
- ํธ๋์ญ์ ๊ด๋ฆฌ ์ฉ์ด์ฑ: ๊ฐ๋ฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ๋ถ์ ์ธ ์์ ์ ์ ๊ฒฝ ์ฐ์ง ์๊ณ , ์ํฐํฐ์ ์ํ๋ง ๊ด๋ฆฌํ๋ฉด ๋๋ค. ๋ชจ๋ ๋ณ๊ฒฝ์ ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๋๋ง ๋ฐ์๋๋ค.
4. ๋ณ๊ฒฝ ๊ฐ์ง (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(); // [ํธ๋์ญ์
] ์ปค๋ฐ
์ํฐํฐ๋ฅผ ์์ ํ๊ณ ์ ํ ๋, ์์ ํ๊ณ ์ ํ๋ ๊ฐ์ ์ค์ ํ ํ์ "em.update(member)" ๊ฐ์ ์ฝ๋๊ฐ ์์ด์ผ ํ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ ๋ค.
๊ทธ๋ฌ๋ JPA๋ฅผ ์ด์ฉํ๋ฉด ์ํฐํฐ ๊ฐ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์์ ํ์ ๋ em.persist() ๋๋ em.update()๋ฅผ ์ํํ์ง ์์๋ DB์ ๋ณ๊ฒฝ์ด ๋ฐ์๋๋ค.
์์ ์ํฐํฐ ์กฐํ ๋ฐ ์์
- ์ํฐํฐ ๋งค๋์ ๋ฅผ ํตํด ์์์ฑ ์ปจํ ์คํธ ๋ด์์ ์ํฐํฐ๋ฅผ ์กฐํํ๋ค.
- ์กฐํ๋ ์ํฐํฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ค.
์ค๋ ์ท ์ ์ฅ
- ์์์ฑ ์ปจํ ์คํธ๋ ์ํฐํฐ์ ์๋ ์ํ(์ค๋ ์ท)๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ ์ฅํ๋ค.
- ์ค๋ ์ท์ด๋ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ๋ณด๊ดํ ๋, ์ต์ด ์ํ๋ฅผ ๋ณต์ฌํด์ ์ ์ฅํด๋ ๊ฒ์ด๋ค. ์ฆ ์ํฐํฐ๊ฐ ์ฒ์ ๋ก๋๋ ๋ ์์ฑ๋๋ค.
ํธ๋์ญ์ ์ปค๋ฐ ๋ฐ ํ๋ฌ์
- ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ ์์ ์ ์์์ฑ ์ปจํ ์คํธ๋ ํ๋ฌ์๋๋ฉฐ, ๋ณ๊ฒฝ๋ ์ํฐํฐ๋ฅผ ์ค๋ ์ท๊ณผ ๋น๊ตํ๋ค.
- ๋ณ๊ฒฝ์ด ๊ฐ์ง๋๋ฉด, ์์ ๋ ์ํฐํฐ์ ๋ํ ์ ์ ํ SQL ์ ๋ฐ์ดํธ ๋ช ๋ น์ด ์์ฑ๋์ด ์ฐ๊ธฐ ์ง์ฐ SQL์ ์ฅ์์ ์ถ๊ฐ๋๋ค.
- ์ ์ฅ์์ SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์ก๋์ด ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ค.
๐กํ๋ฌ์
ํ๋ฌ์๋ ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๋ ์ค์ํ ๊ณผ์ ์ด๋ค.
์ด ๋ฉ์ปค๋์ฆ์ ํตํด JPA๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋๊ธฐํํ๋ค.
๐ป ํ๋ฌ์์ ์ฃผ์ ๊ณผ์
- ๋ณ๊ฒฝ ๊ฐ์ง(Dirty Checking):
- ์์์ฑ ์ปจํ ์คํธ๋ ๊ด๋ฆฌํ๊ณ ์๋ ๋ชจ๋ ์ํฐํฐ์ ํ์ฌ ์ํ๋ฅผ ์ค๋ ์ท(์ต์ด ์ ์ฅ๋ ์ํ)๊ณผ ๋น๊ตํ๋ค.
- ๋ณ๊ฒฝ๋ ์ํฐํฐ๊ฐ ๊ฐ์ง๋๋ฉด, ํด๋น ์ํฐํฐ์ ๋ํ ์ ์ ํ ์์ SQL์ ์์ฑํ์ฌ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ๋ฑ๋กํ๋ค.
- ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์ ์ฒ๋ฆฌ:
- ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์ ์ฅ๋ ๋ชจ๋ SQL(๋ฑ๋ก, ์์ , ์ญ์ )์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์กํ๋ค.
- ์กฐํ ์ฟผ๋ฆฌ๋ ์ ์ฅ๋์ง ์์ผ๋ฉฐ, ํ์ ์ ์ฆ์ ์ํ๋๋ค.
๐ป ํ๋ฌ์๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ
- em.flush() - ์ง์ ํธ์ถ
- 'EntityManager'์ 'flush()' ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๊ฐ์ ๋ก ํ๋ฌ์ํ๋ค. ์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์๋ ๋๋ฌผ๊ฒ ์ฌ์ฉ๋๋ฉฐ, ํน์ํ ์ํฉ์ด๋ ํ ์คํธ ์์ ํ์ฉ๋๋ค.
- ํธ๋์ญ์
์ปค๋ฐ - ํ๋ฌ์ ์๋ ํธ์ถ
- ํธ๋์ญ์ ์ปค๋ฐ ์ ์๋์ผ๋ก ํ๋ฌ์๊ฐ ์ํ๋๋ค. ์ด๋ JPA๊ฐ ํธ๋์ญ์ ์ ์๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๊ธฐ ์ํด ์ํ๋๋ค.
- JPQL ์ฟผ๋ฆฌ ์คํ - ํ๋ฌ์ ์๋ ํธ์ถ
- JPQL์ด๋ Criteria ์ฟผ๋ฆฌ ์คํ ์ ์ ์๋์ผ๋ก ํ๋ฌ์๊ฐ ๋ฐ์ํ๋ค. ์ด๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ต์ ์ํ๋ฅผ ๋ฐ์ํ๋๋ก ํ๊ธฐ ์ํด์์ด๋ค. ์๋ฅผ ๋ค์ด, 'persist()'๋ก ์์ํ๋ ์ํฐํฐ๊ฐ ์ฟผ๋ฆฌ์ ํฌํจ๋๋๋ก ํ๊ธฐ์ํด ํ์ํ๋ค.
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();
๐ป ํ๋ฌ์ ๋ชจ๋ ์ต์
- FlushModeType.AUTO (๊ธฐ๋ณธ๊ฐ): ํธ๋์ญ์ ์ปค๋ฐ์ด๋ ์ฟผ๋ฆฌ ์คํ ์ ์๋์ผ๋ก ํ๋ฌ์ํฉ๋๋ค.
- FlushModeType.COMMIT: ์ปค๋ฐ ์์๋ง ํ๋ฌ์๋ฅผ ์ํํฉ๋๋ค.
ํ๋ฌ์ ๋ชจ๋๋ ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋ณธ ์ค์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ผ๋, ํน์ ์ํฉ์์ ์ฑ๋ฅ ์ต์ ํ๋ ๋์ ์ ์ด๋ฅผ ์ํด ๋ณ๊ฒฝํ ์ ์๋ค.
em.setFlushMode(FlushModeType.COMMIT); // ํ๋ฌ์ ๋ชจ๋๋ฅผ ์ปค๋ฐ ์๋ง ์ํํ๋๋ก ์ค์
๐ป ํ๋ฌ์๋ !!
- ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋น์ฐ์ง ์๋๋ค.
- ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํํ๋ค.
- ํธ๋์ญ์ ์ด๋ผ๋ ์์ ๋จ์๊ฐ ์ค์ํ๋ค. -> ์ปค๋ฐ ์ง์ ์๋ง ๋๊ธฐํํ๋ฉด ๋๋ค.
๐ก์ค์์ ์ํ
์ค์์ ์ํ๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ๋ ์์ ์ํ์ ์ํฐํฐ๊ฐ ๊ด๋ฆฌ ๋ฒ์์์ ๋ถ๋ฆฌ๋ ์ํ๋ฅผ ๋งํ๋ค.
์ด ์ํ์ ์ํฐํฐ๋ ๋ ์ด์ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ๊ณตํ๋ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ, ์บ์ฑ, ์ฐ๊ธฐ ์ง์ฐ, ๋ณ๊ฒฝ ๊ฐ์ง ๋ฑ์ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๋ค.
๐ป ์ค์์ ์ํ๋ก ์ ํํ๋ ๋ฐฉ๋ฒ
Member member = em.find(Member.class, 150L);
member.setName("AAAA");
em.detach(member); //ํน์ ์ํฐํฐ๋ง ์ค์์ ์ํ๋ก ์ ํ
em.clear(); //์์์ฑ ์ปจํ
์คํธ๋ฅผ ์์ ํ ์ด๊ธฐํ
em.close(); //์์์ฑ ์ปจํ
์คํธ๋ฅผ ์ข
๋ฃ
System.out.println(" ========== ");
tx.commit();
- ํน์ ์ํฐํฐ ๋ถ๋ฆฌ (em.detach(entity)):
- 'EntityManager'์ 'detach()' ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ํน์ ์ํฐํฐ๋ฅผ ์ค์์ ์ํ๋ก ์ ํํ๋ค. ์ด๋ ํด๋น ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ์์ ์ ๊ฑฐํ๋ค.
em.detach(member)๋ฅผ ํธ์ถํ๋ฉด,
- detach(memberA) ํธ์ถํ๋ค.
- 1์ฐจ ์บ์์ memberA์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ฑฐํ๋ค.
- ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์์ memberA ๊ด๋ จ SQL์ ์ ๊ฑฐํ๋ค.
์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
2. ์์์ฑ ์ปจํ ์คํธ ์ด๊ธฐํ (em.clear()):
- 'clear()' ๋ฉ์๋๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์์ ํ ์ด๊ธฐํํ์ฌ ๊ด๋ฆฌํ๊ณ ์๋ ๋ชจ๋ ์ํฐํฐ๋ฅผ ์ค์์ ์ํ๋ก ๋ง๋ ๋ค.
์์์ฑ ์ปจํ ์คํธ๊ฐ ์์ ํ ์ด๊ธฐํ๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
3. ์์์ฑ ์ปจํ ์คํธ ์ข ๋ฃ (em.close()):
- 'close()' ๋ฉ์๋๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ข ๋ฃํ๊ณ , ์ด์ ๊ด๋ จ๋ ๋ชจ๋ ์ํฐํฐ๋ฅผ ์ค์์ ์ํ๋ก ์ ํํ๋ค.
์์์ฑ ์ปจํ ์คํธ๊ฐ ์์ ํ ์ข ๋ฃ๋์๋ค.
๐ป ์ค์์ ์ํ์ ํน์ง
- ์๋ณ์ ์ ์ง: ์ค์์ ์ํ์ ์ํฐํฐ๋ ์์ ์ํ์ผ ๋ ํ ๋น๋ฐ์ ์๋ณ์ ๊ฐ์ ์ ์งํ๋ค.
- ๊ธฐ๋ฅ ์ฌ์ฉ ๋ถ๊ฐ: 1์ฐจ ์บ์, ์ฐ๊ธฐ ์ง์ฐ, ๋ณ๊ฒฝ ๊ฐ์ง, ์ง์ฐ ๋ก๋ฉ ๋ฑ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
- ์ง์ฐ ๋ก๋ฉ ๋ถ๊ฐ: ์ค์์ ์ํ์ ์ํฐํฐ๋ ์ง์ฐ ๋ก๋ฉ์ ์ํํ ์ ์๋ค. ์ค์ ๊ฐ์ฒด ๋์ ํ๋ก์๋ฅผ ๋ก๋ฉํ๋ ์ง์ฐ ๋ก๋ฉ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํ์๋ก ํ๊ธฐ ๋๋ฌธ์, ์ค์์ ์ํ์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ํค์๋ ๋ชจ์ #3 (0) | 2024.04.26 |
---|---|
[SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 4 (์ํฐํฐ ๋งคํ) (0) | 2024.04.25 |
[SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 2 (JPA ์์ํ๊ธฐ) (1) | 2024.04.19 |
[SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 1 (JPA ์๊ฐ) #2 (0) | 2024.04.19 |
[SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 1 (JPA ์๊ฐ) (8) | 2024.04.18 |
- Total
- Today
- Yesterday
- ์น MVC
- ์ง์ฐ๋ก๋ฉ
- ์ค์์
- ์๋ฐ ์คํ๋ง
- SQLD
- ๋ก๊ทธ์์
- ์๋ฐ
- ์ปค๋ฎค๋ํฐ
- EnumType.ORDINAL
- ์คํ๋ง
- SQL
- elasticsearch
- ํ์ํํด
- ์คํ๋ง ๋ถ๋งํฌ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ํ๋ก ํธ์๋
- DP
- ๋น์์
- ์คํ๋ง๋ถํธ
- JPA
- ์์
- ๋ก๊น
- ๋ฐฑ์ค
- ์ธํ ๋ฆฌ์ ์ด
- SQL ๋ ๋ฒจ์
- ๋ฐฑ์ค ํ์ด์ฌ
- ๋ถ๋งํฌ
- ์นMVC
- ํ์ด์ฌ
- ์คํ๋ง ์ปค๋ฎค๋ํฐ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |