[JPA] ์์์ฑ ์ปจํ ์คํธ์ ์ํฐํฐ
by rlaehddnd0422JPA๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ํฌ๊ฒ ์ํฐํฐ์ ํ ์ด๋ธ์ ๋งคํํ๋ ์ค๊ณ ๋ถ๋ถ๊ณผ ๋งคํํ ์ํฐํฐ๋ฅผ ์ค์ ์ฌ์ฉํ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋จผ์ EntityManager์ EntityManagerFactory์ ๋ํ ์ดํด๊ฐ ํ์ํฉ๋๋ค.
EntityManager
๋งคํํ ์ํฐํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ EntityManager๋ผ๋ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค.
EntityManager๋ ๋ง ๊ทธ๋๋ก Entity๋ฅผ ์ ์ฅ, ์์ , ์ญ์ , ์กฐํ ํ๋ ๋ฑ ์ํฐํฐ์ ๊ด๋ จ๋ ๋ชจ๋ ์ผ๋ค์ ์ฒ๋ฆฌํด์ค๋๋ค.
+ ๋ด๋ถ์ DataSource๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปค๋ฅ์ ์ ์ป์ด DB์ ์ ๊ทผํฉ๋๋ค.
EntityManagerFactory
EntityManager๋ EntityManagerFactory๋ฅผ ํตํด ์์ฑํ ์ ์์ต๋๋ค.
- ์ํฐํฐ ๋งค๋์ ๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ๋ฉด ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ ๋ ๊ฐ์ ๊ณต์ ๊ฐ ์ผ์ด๋๋ฉด X
- ๋ฐ๋ผ์ EntityMnager๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์ฌ ๋ ๋ง๋ค EntityManagerFactory๋ฅผ ํตํด์ EntityManager ์์ฑ
์์์ฑ ์ปจํ ์คํธ๋?
์์์ฑ ์ปจํ ์คํธ๋ ์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ๊ณต๊ฐ์ผ๋ก ์ค์ ์กด์ฌํ๋ ๊ณต๊ฐ์ด ์๋ ๋ ผ๋ฆฌ์ ์ธ ๊ฐ๋ ์ ๋๋ค.
์๋ฅผ๋ค์ด EntityManager์ persist ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ member Entity๋ฅผ ์ ์ฅํ๊ฒ ๋๋ฉด ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋ฉ๋๋ค.
- ์์์ฑ ์ปจํ ์คํธ๋ EntityManager๋ฅผ ํตํด ์ ๊ทผํ ์ ์๊ณ , EntityManager๋ฅผ ํตํด ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
Entity์ ์๋ช ์ฃผ๊ธฐ
Entity์๋ 4๊ฐ์ง ์ํ๊ฐ ์กด์ฌํฉ๋๋ค.
1. ๋น์์ : ์์์ฑ ์ปจํ ์คํธ์ ์๋ฌด๋ฐ ๊ด๊ณ๊ฐ ์๋ ์์ํ ๊ฐ์ฒด ์ํ๋ก ์์์ฑ ์ปจํ ์คํธ์ DB์ ์ ํ ๊ด๋ จ์ด ์๋ ์ํ์ ๋๋ค.
2. ์์ : ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋ ์ํ๋ก persist(entity)์ ์ํด ์ด๋ฃจ์ด์ง๋๋ค. ์์ ์ํ์ธ ์ํฐํฐ๋ ์์์ฑ ์ปจํ ์คํธ์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค.
3. ์ค์์ : ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ์ ๋๋ค. ํน์ ์ํฐํฐ๋ฅผ ์ค์์ ์ํ๋ก ๋ง๋ค๋ ค๋ฉด em.detach(entity) ํธ์ถํ๊ฑฐ๋ em.close()๋ฅผ ํธ์ถํด์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ซ๊ฑฐ๋, em.clear()๋ฅผ ํธ์ถํด์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ด๊ธฐํํ๋ฉด ์์์ฑ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ๋ ์ํฐํฐ๋ ์ค์์ ์ํ๊ฐ ๋ฉ๋๋ค.
4. ์ญ์ : ์์์ฑ ์ปจํ ์คํธ์์ ์ญ์ ๋ ์ํ๋ก em.remove(entity)์ ์ํด ์ด๋ฃจ์ด์ง๋๋ค.
์์์ฑ ์ปจํ ์คํธ์ ํน์ง
1. ์์์ฑ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ๋ ์ํฐํฐ๋ ์๋ณ์ ๊ฐ(@Id๋ก ํ ์ด๋ธ์ PK์ ๋งคํํ ๊ฐ)์ผ๋ก ์ํฐํฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ ์์ ์ํ์ ์ํฐํฐ๋ ๋ฐ๋์ ์๋ณ์ ๊ฐ์ด ์์ด์ผ ํฉ๋๋ค. ์๋ณ์ ๊ฐ์ด ์์ผ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
2. ์์์ฑ ์ปจํ ์คํธ์ ๋ณด๊ด๋ ์ํฐํฐ(์์ ์ํ์ ์ํฐํฐ)๋ฅผ ์ ์ฅ ์(em.persist()) ํธ๋์ญ์ ์ด ์ปค๋ฐ๋์ด์ผ DB์ ๋ฐ์๋ฉ๋๋ค.
์ํฐํฐ CRUD๋ฅผ ํตํ ์์์ฑ ์ปจํ ์คํธ ์ฅ์ ์ดํด๋ณด๊ธฐ
1. ์กฐํ em.find() : ์ฑ๋ฅ ํฅ์ by 1์ฐจ ์บ์ (CRUD)
์์์ฑ ์ปจํ ์คํธ๋ ๋ด๋ถ์ ์บ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์์์ํ์ ์ํฐํฐ๋ ๋ชจ๋ ์บ์์ ์ ์ฅ๋ฉ๋๋ค. (์บ์๋ Map<@Id, Entity>๋ก ์ด๋ฃจ์ด์ ธ ์์)
EntityManager๋ฅผ ํตํด persist ๋ฉ์๋๋ก ์ํฐํฐ๋ฅผ ์ ์ฅํ๋ฉด ์์์ฑ ์ปจํ ์คํธ์ ํด๋น ์ํฐํฐ๊ฐ ๋ณด๊ด๋จ๊ณผ ๋์์ 1์ฐจ ์บ์์ ํด๋น ์ํฐํฐ๊ฐ ์ ์ฅ๋ฉ๋๋ค.
์ด ์ํ์์ ์ ์ฅํ ์ํฐํฐ member๋ฅผ ์กฐํํ๋ ค๊ณ ํ ๋, JPA๋ ์ฐ์ ์ ์ผ๋ก 1์ฐจ์บ์์์ ํด๋น ์ํฐํฐ๊ฐ ์๋์ง ์กฐํํ๊ณ , ๋ง์ฝ 1์ฐจ ์บ์์ ํด๋น ์ํฐํฐ๊ฐ ์๋ ๊ฒฝ์ฐ DB์์ ํด๋น ์ํฐํฐ๋ฅผ ์กฐํํฉ๋๋ค. DB์ ์ฐ์ ์ ์ผ๋ก ์ ๊ทผํ์ง ์๊ณ ๋จผ์ ์บ์๋ฅผ ํตํด ์ํฐํฐ๋ฅผ ์กฐํํจ์ผ๋ก์จ ์ฑ๋ฅ ์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
2. ์กฐํ em.find() : ๋์ผ์ฑ ๋ณด์ฅ by 1์ฐจ ์บ์ (CRUD)
Member a = em.find(Member.class,"1L");
Member b = em.find(Member.class,"1L");
์ฌ๊ธฐ์ a==b๋ ์ฐธ์ผ๊น์? ๊ฑฐ์ง์ผ๊น์?
๋ต์ ์ฐธ์ ๋๋ค. ์์์ฑ ์ปจํ ์คํธ๋ em.find()๋ฅผ ๋ฐ๋ณต ํธ์ถํด๋ 1์ฐจ ์บ์์์ ํด๋น ์ํฐํฐ๋ฅผ ์๋ณ์ @Id๋ฅผ ํตํด ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฐ๋ผ์ ์์์ฑ ์ปจํ ์คํธ๋ ์ฑ๋ฅ์ ์ด์ ๊ณผ ์ํฐํฐ์ ๋์ผ์ฑ(๊ฐ์ ์ธ์คํด์ค์)์ ๋ณด์ฅํด์ค๋๋ค.
3. ์ ์ฅ em.persist() : ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ (CRUD)
- EntityManager๋ ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ธฐ ์ง์ ๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํฐํฐ๋ฅผ ์ ์ฅํ์ง ์๊ณ ๋ด๋ถ ์ฟผ๋ฆฌ ์ ์ฅ์์ SQL์ ๋ชจ์๋ก๋๋ค.
- ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ ์๊ฐ ๋ด๋ถ ์ฟผ๋ฆฌ ์ ์ฅ์์ ์ ์ฅ๋ SQL์ flush()ํ์ฌ DB์ ์ ๋ฌํจ์ผ๋ก์จ, ๋ด๋ถ ์ฟผ๋ฆฌ ์ ์ฅ์์ ์ ์ฅ๋ SQL์ DB์ ๋ฐ์ํฉ๋๋ค.
- flush()๋ ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํํ๋ ์์ ์ผ๋ก ์ด๋ ๋ฑ๋ก, ์์ , ์ญ์ ํ ์ํฐํฐ๋ฅผ DB์ ๋ฐ์ํฉ๋๋ค.
- commit()์ ์๋์ผ๋ก flush()๋ฅผ ํธ์ถํฉ๋๋ค.
- ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ํ ๋ฒ์ ์ ๋ฌํด์ ์ปค๋ฐํจ์ผ๋ก์จ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
4. ์์ : ์ํฐํฐ ๋ณ๊ฒฝ ๊ฐ์ง (CRUD)
SQL์ ์ง์ ์ฌ์ฉํ๋ฉด ์์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ง์ฝ ์๊ตฌ์ฌํญ์ด ๋์ด๋๋ฉด์ ์์ฑ์ด ์ถ๊ฐ๋๋ค๋ฉด ์์ ์ฟผ๋ฆฌ๋ ์ ์ ์ปค์ง๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง JPA์ EntityManager๋ฅผ ์ฌ์ฉํ์ฌ ์ํฐํฐ๋ฅผ ์์ ํ ๋๋ ๋จ์ํ ์ํฐํฐ๋ฅผ ์กฐํํ๊ณ ์ํฐํฐ๋ฅผ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
Member member = em.find(Member.class, "1L");
member.setUsername("hi");
member.setAge(10);
๋ญ๊ฐ ๋ณ๋์ update ๋ฉ์๋๊ฐ ์์ด์ผ ํ ๊ฒ ๊ฐ์ง๋ง, ์์ด๋ ๋ฉ๋๋ค.
๋์ ๊ณผ์ ์ ์ด๋ ์ต๋๋ค.
- 1. JPA๋ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ๋ณด๊ดํ ๋, ์ต์ด ์ํ๋ฅผ ๋ณต์ฌํด์ ์ ์ฅํด๋ก๋๋ค. (์ค๋ ์ท)
- 2. flush() ์์ (commit ์์ )์ ์ค๋ ์ท๊ณผ ์ํฐํฐ๋ฅผ ๋น๊ตํด์ ๋ณ๊ฒฝ๋ ์ํฐํฐ๋ฅผ ์ฐพ์ต๋๋ค.
- 3. ๋ณ๊ฒฝ๋ ์ํฐํฐ๊ฐ ์์ผ๋ฉด ์์ ์ฟผ๋ฆฌ(Update/set/where)๋ฅผ ์์ฑํด์ ๋ด๋ถ ์ฟผ๋ฆฌ ์ ์ฅ์์ ๋ณด๋
๋๋ค.
- ์ด ๋ ๊ธฐ๋ณธ์ ๋ต์ ์ํฐํฐ์ ๋ชจ๋ ํ๋๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- 4. ํธ๋์ญ์ ์ ์ปค๋ฐํฉ๋๋ค.
์ด๋ ๊ฒ ์ํฐํฐ์ ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋์ผ๋ก ๋ฐ์ํ๋ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ ๊ฐ์ง๋ผ๊ณ ํฉ๋๋ค.
* ๋ณ๊ฒฝ ๊ฐ์ง๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ๋ ์์ ์ํ์ ์ํฐํฐ์๋ง ์ ์ฉ
๋ณ๊ฒฝ ๊ฐ์ง ๊ธฐ๋ฅ ์ฅ์
1. ๋ชจ๋ ํ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ฟผ๋ฆฌ๊ฐ ๊ฐ๋ค. ๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด๋๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ.
2. ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณด๋ด๋ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ด์ ์ ํ ๋ฒ ํ์ฑ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ.
๋ฌผ๋ก ๋ชจ๋ ํ๋๋ฅผ ์ ๋ฐ์ดํธ ํ์ง ์๊ณ , org.hibernate.annotations.DynamicUpdate ๋ฅผ ์ฌ์ฉํด์, ๋์ Update SQL์ ์์ฑํ ์๋ ์์ต๋๋ค.
5. ์ญ์ : em.remove()
์ํฐํฐ๋ฅผ ์ญ์ ํ๋ ค๋ฉด ์ญ์ ๋์ ์ํฐํฐ๋ฅผ ์กฐํํด์ผ ํฉ๋๋ค.
Member member = em.find(Member.class, "1L");
em.remove(member);
๋ฌผ๋ก ๋ง์ฐฌ๊ฐ์ง๋ก commit() ์ ํธ์ถํด์ผ ์ค์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ญ์ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ฌํฉ๋๋ค.
- ์ด ๋ ์ฐธ๊ณ ๋ก remove๋ฅผ ํธ์ถํ๋ ์๊ฐ member๋ ์์์ฑ ์ปจํ ์คํธ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
- rollback์์๋ ์์์ฑ ์ปจํ ์คํธ์ ํด๋น ์ํฐํฐ ๋ณต๊ตฌ๋จ.
ํ๋ฌ์
ํ๋ฌ์(flush())๋ ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํฉ๋๋ค.
ํ๋ฌ์๋ฅผ ์คํํ๋ฉด ๋ค์ ๋์์ ์ํํฉ๋๋ค.
1. ๋ณ๊ฒฝ ๊ฐ์ง๊ฐ ๋์ํด์, ๋ชจ๋ ์ํฐํฐ๋ฅผ ์ค๋ ์ท์ ๋น๊ตํด์ ์์ ๋ ์ํฐํฐ๋ฅผ ์ฐพ์.
2. ์์ ๋ ์ํฐํฐ๋ ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์์์ฑ ์ปจํ ์คํธ ๋ด๋ถ SQL ์ ์ฅ์์ ๋ณด๊ด.
3. ๋ด๋ถ SQL ์ ์ฅ์์ ๋ฑ๋ก๋ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ก(๋ฑ๋ก, ์์ , ์ญ์ ์ฟผ๋ฆฌ)
์์์ฑ ์ปจํ ์คํธ์ ํ๋ฌ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์๋
- em.flsuh()๋ก ์ง์ ํธ์ถํ๋ ๋ฐฉ๋ฒ
- commit()์ ํตํด ํ๋ฌ์๋ฅผ ์๋ํธ์ถ ํ๋ ๋ฐฉ๋ฒ
- JPQL ์ฟผ๋ฆฌ ์คํ์ ํตํด ํ๋ฌ์๋ฅผ ์๋์ผ๋ก ํธ์ถํ๋ ๋ฐฉ๋ฒ
์ด ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ง์ em.flush()๋ฅผ ํธ์ถํจ์ผ๋ก์จ ํ๋ฌ์ํ๋ ๋ฐฉ๋ฒ์ ์ ์ฌ์ฉํ์ง ์๊ณ , ๋ณดํต commit()์ ํตํด ํ๋ฌ์๋ฅผ ์๋ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
JPQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ์ ์๋์ผ๋ก flush()๋ฅผ ํธ์ถํ ๊น์?
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// ์ค๊ฐ์ JPQL ์ฟผ๋ฆฌ ์คํ
query = em.createQuery("select m from Member m", Member.class);
List<Member> list = query.getResultList();
1. ๋จผ์ persist๋ฅผ ํตํด memberA, memberB, memberC๋ฅผ ์์์ํ๋ก ๋ง๋ค์์ต๋๋ค.
2. ์ด๋ JPQL์ ์คํํ๋ฉด JPQL์ SQL๋ก ๋ณํ๋์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํฐํฐ๋ฅผ ์กฐํํฉ๋๋ค.
3. ํ์ง๋ง memberA, memberB, memberC๋ ์์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋ ์ํ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ก ์กฐํ๋์ง ์์ต๋๋ค.
4. ๋ฐ๋ผ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ง์ ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ flush()ํด์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํด์ผ ํ๋๋ฐ JPA๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๊ธฐ ์ํด์ JPQL์ ์คํํ ๋๋ ํ๋ฌ์๋ฅผ ์๋์ผ๋ก ํธ์ถํฉ๋๋ค.
์ฃผ์ : ํ ํธ๋์ญ์ ๋ด์์ find() ๋ฉ์๋๋ ์คํ ์ง์ flush()๋ฅผ ์คํํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ํ ํธ๋์ญ์ ๋ด์์ find ๋ก๋ ์กฐํ๋ถ๊ฐ
ํ๋ฌ์ ๋ชจ๋ ์ต์
์ํฐํฐ ๋งค๋์ ์ ํ๋ฌ์ ๋ชจ๋๋ฅผ ์ง์ ์ง์ ํ๋ ค๋ฉด javax.persistence.FlushModeType์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
FlushModeType.AUTO : ์ปค๋ฐ์ด๋ ์ฟผ๋ฆฌ(JPQL,SQL)๋ฅผ ์คํํ ๋ ํ๋ฌ์ (Default)
FlushModeType.COMMIT : ์ปค๋ฐํ ๋๋ง ํ๋ฌ์
COMMIT์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ฌ์ฉ.
์ค์์ ์ํ (์์ โก๏ธ ์ค์์)
์์์ฑ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ๋ ์์ ์ํ์ ์ํฐํฐ๊ฐ, ์์์ฑ ์ปจํ ์คํธ์์ ๋ถ๋ฆฌ๋ ๊ฒ์ ์ค์์ ์ํ๋ผ๊ณ ํฉ๋๋ค.
- ์ค์์ ์ํ์ ์ํฐํฐ๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์์ํ์ ์ํฐํฐ๋ฅผ ์ค์์ ์ํ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ
- 1. em.detach(entity) : ํน์ ์ํฐํฐ๋ง ์ค์์ ์ํ๋ก ์ ํ
- entity๋ ์์์ฑ ์ปจํ ์คํธ ๋ด entity ๊ด๋ จ๋ 1์ฐจ ์บ์ ๋ฐ ๋ด๋ถ SQL ์ฟผ๋ฆฌ ์ ์ฅ์์์ ์ญ์ ๋๊ณ ํด๋น entity๋ ์ค์์ ์ํ๊ฐ ๋ฉ๋๋ค.
- 2. em.clear() : ์์์ฑ ์ปจํ
์คํธ๋ฅผ ์์ ํ ์ด๊ธฐํ
- ์์์ฑ ์ปจํ ์คํธ ๋ด์ 1์ฐจ์บ์์ ๋ด๋ถ SQL ์ฟผ๋ฆฌ ์ ์ฅ์๊ฐ ์ด๊ธฐํ๋๊ณ ์ ์ฅ๋์ด ์๋ entity๋ค์ ์ค์์ ์ํ๊ฐ ๋ฉ๋๋ค.
- 3. em.close() : ์์์ฑ ์ปจํ
์คํธ๋ฅผ ์ข
๋ฃ
- ์์์ฑ ์ปจํ ์คํธ ๋ด์ 1์ฐจ์บ์์ ๋ด๋ถ SQL ์ฟผ๋ฆฌ ์ ์ฅ์๊ฐ ์ด๊ธฐํ๋๊ณ ์ ์ฅ๋์ด ์๋ entity๋ค์ ์ค์์ ์ํ๊ฐ ๋ฉ๋๋ค.
- ์ถ๊ฐ์ ์ผ๋ก ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ข ๋ฃ
์ค์์ ์ํ ํน์ง
1. ์์์ฑ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ์ง ์์ผ๋ฏ๋ก ๊ฑฐ์ ๋น์์ ์ํ์ ๊ฐ๊น์ต๋๋ค.
2. ๋น์์ ์ํ์ ๋ฌ๋ฆฌ ์๋ณ์ ๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. (์์ ์ํ์ผ ๋ ๊ฐ์ง๊ณ ์๋ ์๋ณ์๋ฅผ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์์)
3. ์ง์ฐ๋ก๋ฉ ๋ถ๊ฐ : ์ค์์ ์ํ์์๋ ์ค์ ๊ฐ์ฒด๋์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ก๋ฉํด๋๊ณ ํด๋น ๊ฐ์ฒด๋ฅผ ์ค์ ์ฌ์ฉํ ๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ธ ์ง์ฐ๋ก๋ฉ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ค์์ ์ํ์ ์ํฐํฐ๋ฅผ ์์ ์ํ๋ก ๋ค์ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
์ค์์ ์ํ (์ค์์ โก๏ธ ์์)
๋ณํฉ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ( em.merge() )
merge() ๋ฉ์๋๋ ์ค์์ ์ํ์ ์ํฐํฐ๋ฅผ ๋ฐ์์ ๊ทธ ์ ๋ณด๋ก ์๋ก์ด ์์ ์ํ์ ์ํฐํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
TestCode
public class MergeMain_115 {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = new Member();
// 1. member ๊ฐ์ฒด ์์ฑ ๋ฐ ์ ์ฅ -> ์ปค๋ฐํจ์ผ๋ก์จ DB์ ์์ ์ฌํญ ๋ฐ์
try {
member.setId(6301L);
member.setName("๊น๋์
");
em.persist(member);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
// 1.1 member ์ค์์ ์ํ๋ก ๋ณ๊ฒฝ
em.close();
}
// 2. ์ค์์ ์ํ๋ก ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก ์์ ์ฌํญ DB์ ๋ฐ์ X
member.setName("๊น๋์
2");
EntityManager em2 = emf.createEntityManager();
EntityTransaction tx2 = em2.getTransaction();
tx2.begin();
// 3. ์ค์์ ์ํ์ member ๊ฐ์ฒด -> ์์์ํ๋ก ๋ณ๊ฒฝ
try {
// merge()ํ์ฌ ์์์ํ๋ก ๋ณ๊ฒฝ
Member mergeMember = em2.merge(member);
tx2.commit();
// ์ค์์ ์ํ์ member
System.out.println("member = " + member);
// merge๋ก ์ธํด ์์์ํ๋ก ๋ฐ๋ member
System.out.println("mergeMember = " + mergeMember);
} catch (Exception e) {
tx2.rollback();
} finally {
em2.close();
}
}
}
1. member ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ persist๋ก ์ ์ฅํ์ฌ ์์์ํ๋ก ๋ง๋ ํ commitํจ์ผ๋ก ์ฐ๊ธฐ ์ง์ฐ SQL ์ฟผ๋ฆฌ๋ฅผ DB์ ์ ๋ฌํ์ฌ ๋ฐ์ดํฐ๋ฅผ DB์ ๋ฐ์ํ์ต๋๋ค.
2. 1์์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ซ์์ผ๋ก์จ ์ค์์ ์ํ๋ก ๋ฐ๋ member๋ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํด๋ DB์ ๋ฐ์๋์ง ์์ต๋๋ค.
3.. ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ซ์ผ๋ฉด์ ์ค์์ ์ํ๋ก ๋ฐ๋ member ๊ฐ์ฒด๋ฅผ ๋ค์ ์์ ์ํ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด merge() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
em.merge(member) ๋์ ๋ฐฉ์
โถ๏ธ em.merge(member) ์คํ
โถ๏ธ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ค์์ ์ํฐํฐ์ ์๋ณ์ ๊ฐ์ผ๋ก 1์ฐจ ์บ์์์ ์ํฐํฐ ์กฐํ ( 1์ฐจ ์บ์์ ํด๋น ์ํฐํฐ ์์ผ๋ฉด DB์์ ์กฐํํ๊ณ 1์ฐจ ์บ์์ ์ ์ฅ)
โถ๏ธ ์กฐํํ ์์ ์ํฐํฐ์ member ์ํฐํฐ์ ๊ฐ์ ์ฑ์ ๋ฃ์ต๋๋ค. ( member ์ํฐํฐ์ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์๋ก์ด ์ํฐํฐ(mergeMember์ ์ฃผ์ )
โถ๏ธ mergeMember ๋ฆฌํด
merge() ๋ฉ์๋๋ ์ค์์ ๋ฟ๋ง ์๋๋ผ ๋น์์์ํ์ ์ํฐํฐ๋ ์์ ์ํ๋ก ๋ณ๊ฒฝํด์ค๋๋ค.
์๋ณ์ ๊ฐ์ผ๋ก ์ํฐํฐ๋ฅผ ์กฐํํ ์ ์์ผ๋ฉด ๋ถ๋ฌ์ ๋ณํฉํ๊ณ , ์์ผ๋ฉด, ์๋ก ์์ฑํด์ ๋ณํฉํฉ๋๋ค.
<์ ๋ฆฌ>
- EntityManager๋ EntityManagerFactory์์ ์์ฑํฉ๋๋ค.
- ์์์ฑ ์ปจํ ์คํธ๋ Application๊ณผ DB์ฌ์ด์์ ๊ฐ์ฒด๋ฅผ ๋ณด๊ดํ๋ ๊ฐ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ์ ์ญํ ๋ก, ์ค์ ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ผ App๊ณผ DB์ฌ์ด์์์ Entity์ ์ํ๋ฅผ ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ํด ๋์ ํ ๊ฐ๋ ์ ๋๋ค.
- ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅํ ์ํฐํฐ๋ flush() ์์ ์ ์ปจํ ์คํธ ๋ด๋ถ์ SQL ์ ์ฅ์๊ฐ DB์ ์ ๋ฌ๋๋ฉด์ ์์ , ์ญ์ , ์กฐํ, ์์ฑ์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋ฉ๋๋ค. ํธ๋์ญ์ ์ปค๋ฐ์์ ์ ์์์ฑ ์ปจํ ์คํธ๊ฐ flush() ๋ฉ๋๋ค.
- ์์์ฑ ์ปจํ ์คํธ ๋ด๋ถ์ ์กด์ฌํ๋ ์ํฐํฐ๋ ์์ ์ํ์ ์ํฐํฐ๋ก ์ปจํ ์คํธ๊ฐ ์ ๊ณตํ๋ ์ฐ๊ธฐ ์ง์ฐ, ๋ณ๊ฒฝ ๊ฐ์ง, ์ง์ฐ ๋ก๋ฉ, 1์ฐจ ์บ์, ๋์ผ์ฑ ๋ณด์ฅ ๊ฐ์ ๊ธฐ๋ฅ ์ฌ์ฉ ๊ฐ๋ฅ
- ์ค์์(detach), ๋น์์(remove) ์ํ์ ์ํฐํฐ๋ ์ปจํ ์คํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Spring Data JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ - ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ (1) | 2023.04.30 |
---|---|
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ - ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ (0) | 2023.04.29 |
[JPA] Entity Mapping : ํ๋ โก๏ธ ์ปฌ๋ผ ๋งคํ (0) | 2023.04.28 |
[JPA] Entity Mapping : ๊ธฐ๋ณธ ํค(PK) ๋งคํ (0) | 2023.04.27 |
[JPA] Entity Mapping : ๊ฐ์ฒด โก๏ธ ํ ์ด๋ธ ๋งคํ (0) | 2023.04.27 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422