[JPA] 3.์์์ฑ ๊ด๋ฆฌ - ๋ด๋ถ ๋์ ๋ฐฉ์
1. ์์์ฑ ์ปจํ ์คํธ
JPA์์ ๊ฐ์ฅ ์ค์ํ ๋ ๊ฐ์ง
1) ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋งตํ (Object Relational Mapping)
2) ์์์ฑ ์ปจํ ์คํธ
์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ์ ์ํฐํฐ ๋งค๋์
- ๊ณ ๊ฐ์ ์์ฒญ์ด ์ฌ ๋๋ง๋ค EntityManagerFactory๊ฐ EntityManage ์์ฑ -> EntityManager๊ฐ ๋ด๋ถ์ ์ผ๋ก DB Connection ์ฌ์ฉํด์ DB ์ฌ์ฉ
์์์ฑ ์ปจํ ์คํธ
- JPA๋ฅผ ์ดํดํ๋๋ฐ ๊ฐ์ฅ ์ค์ํ ์ฉ์ด
- ์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ์ด๋ผ๋ ๋ป
- EntityManager.persist(entity);
- ์์์ฑ ์ปจํ ์คํธ๋ ๋ ผ๋ฆฌ์ ์ธ ๊ฐ๋
- ๋์ ๋ณด์ด์ง ์์
- EntityManager๋ฅผ ํตํด์ ์์์ฑ ์ปจํ ์คํธ์ ์ ๊ทผ
- EntityManager ์์ฑํ๋ฉด 1๋1๋ก ์์์ฑ ์ปจํ ์คํธ ์์ฑ (PersistenceContext)
- EntityManager ์์ PersistenceContext๋ผ๋ ๊ณต๊ฐ์ด ์๊น
- ์คํ๋ง ํ๋ ์์ํฌ์ ๊ฒฝ์ฐ ๋ค๋์ผ
์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ
- ๋น์์ (new/transient) : ์์์ฑ ์ปจํ ์คํธ์ ์ ํ ๊ด๊ณ๊ฐ ์๋ ์๋ก์ด ์ํ
- ์์ (managed) : ์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋๋ ์ํ
- ์ค์์ (detached) : ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ
- ์ญ์ (removed) : ์ญ์ ๋ ์ํ
(a) ๋น์์ (new/transient)
// ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ํ(๋น์์)
Member member = new Member();
member.setId("member1");
member.setUsername("ํ์1");
- ๋งด๋ฒ๊ฐ์ฒด ์์ฑํ๋๋ฐ entityManager์ ์๋ฌด๊ฒ๋ ์๋ฃ๊ณ ๊ฐ์ฒด๋ง ์์ฑํ ์ํ
- JPA์ ๊ด๋ จ X
(b) ์์ (managed)
// ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ํ(๋น์์)
Member member = new Member();
member.setId("member1");
member.setUsername("ํ์1");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ํ(์์)
em.persist(member);
* ์์์ํ๋ผ๊ณ db์ ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ๋ ๊ฒ์ด ์๋
* transaction commitํ๋ ์์ (tx.commit())์ ์์์ฑ context์ ์๋ ์ ๊ฐ db ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ๊ฒ๋จ
(c) ์ค์์ (detached), (d)์ญ์
// ํ์ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์์ ๋ถ๋ฆฌ, ์ค์์ ์ํ
em.detach(member);
// ๊ฐ์ฒด๋ฅผ ์ญ์ ํ ์ํ(์ญ์ก)
em.remove(member);
์์์ฑ ์ปจํ ์คํธ์ ์ด์
- 1์ฐจ ์บ์
- ๋์ผ์ฑ(identity) ๋ณด์ฅ
- ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ (transactional wirte-behind)
- ๋ณ๊ฒฝ ๊ฐ์ง (dirty checking)
- ์ง์ฐ ๋ก๋ฉ (lazy loading)
(a) ์ํฐํฐ ์กฐํ, 1์ฐจ ์บ์
// ์ํฐํฐ๋ฅผ ์์ฑํ ์ํ (๋น์์)
Member member = new Member();
member.setId("member1");
member.setUsername("ํ์1");
// ์ํฐํฐ๋ฅผ ์์
em.persist(member);
- ์์์ฑ ์ปจํ ์คํธ ๋ด๋ถ์ 1์ฐจ์บ์ ๋ค๊ณ ์์ (1์ฐจ์บ์=์์์ฑ ์ปจํ ์คํธ ๋ผ๊ณ ํด๋ ๋ฌด๋ฐฉ)
- em.persist(member) ํตํด์ 1์ฐจ ์บ์์ ์ ์ฅ
- key(@id), value(Entity) = ("member1", member๊ฐ์ฒด)
1์ฐจ ์บ์์์ ์กฐํ
Member findMember = em.find(Member.class, "member1");
- db๋ฅผ ๋ค์ง๋ ๊ฒ์ด ์๋๋ผ 1์ฐจ์บ์์์ ์กฐํํด์ด
- ๋ง์ฝ member2๋ฅผ ์กฐํํ๋ฉด (emf ๋ค์ ์์ฑํด์ 1์ฐจ์บ์์ ์์) -> 1์ฐจ์บ์์ ์ ์ฅํ -> member2 ๋ฐํ
(b) ๋์ผ์ฑ ๋ณด์ฅ
member a = em.find(Member.class, "member1");
member b = em.find(Member.class, "member1");
System.out.println(a == b); // ๋์ผ์ฑ ๋น๊ต true
- 1์ฐจ ์บ์๋ก ๋ฐ๋ณต ๊ฐ๋ฅํ ์ฝ๊ธฐ(Repeatable Read) ๋ฑ๊ธ์ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ DB๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฐจ์์์ ์ ๊ณต
(c) ์ํฐํฐ ๋ฑ๋ก - ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// ์ํฐํฐ ๋งค๋์ ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํธ๋์ญ์
์ ์์ํด์ผํจ
transaction.begin();
em.persist(memberA);
em.persist(memebrB);
// ์ฌ๊ธฐ๊น์ง๋ INSERT SQL๋ฅผ DB์ ๋ณด๋ด์ง ์์
// ์ปค๋ฐํ๋ ์๊ฐ DB์ INSERT SQL ๋ณด๋
transaction.commit();
> em.persist(memberA)
- memberA 1์ฐจ ์บ์์ ์ ์ฅ
- JPA๊ฐ ์ํฐํฐ ๋ถ์ํด์ INSERT SQL ์์ฑ
- ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ SQL์ ์์๋
> em.persist(memberB)
- memberB 1์ฐจ ์บ์์ ์ ์ฅ
- SQL INSERT SQL ์์ฑํด์ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์์๋
>transaction.commit();
- ์์ธ SQL์ DB์ ํ๋ฒ์ ๋ณด๋ผ์์์ (JDBC ๋ฐฐ์น ๊ฐ๋ )
์ต์ ์์ ์กฐ์ ๊ฐ๋ฅ -> hibernate.jdbc.batch_size / value
(๋ฒํผ๋ง ๊ธฐ๋ฅ)
* JPA๋ ๊ฐ์ฒด(Entity)์ ์์ฑ์ ๋ง๋ค ๋ ๊ธฐ๋ณธ ์์ฑ์ public Member() {} ํ๋ ์์ด์ผํจ
(d) ๋ณ๊ฒฝ ๊ฐ์ง (Dirty Checking)
- ์ํฐํฐ ์กฐํํ ๊ฐ ๋ณ๊ฒฝํ๋ฉด ์๋์ผ๋ก UPDATE
- ํธ๋์ญ์ ์ปค๋ฐ -> flush -> ์ํฐํฐ๋ ์ค๋ ์ท ๋น๊ต -> update์ฟผ๋ฆฌ ์ฐ๊ธฐ์ง์ฐ์ ์ฅ์ ๋ฃ๊ณ -> flush -> commit
์ํฐํฐ ์ญ์
// ์ญ์ ๋์ ์ํฐํฐ ์กฐํ
Member memberA = em.find(Member.class, "memberA");
// ์ํฐํฐ ์ญ์
em.remove(memberA);
(e) ์ง์ฐ ๋ก๋ฉ
??
2. ํ๋ฌ์
ํ๋ฌ์
- ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์
ํ๋ฌ์ ๋ฐ์
- ๋ณ๊ฒฝ ๊ฐ์ง
- ์์ ๋ ์ํฐํฐ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ๋ฑ๋ก
- ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์ฟผ๋ฆฌ๋ฅผ DB์ ์ ์ก (๋ฑ๋ก / ์์ / ์ญ์ / ์ฟผ๋ฆฌ)
์์์ฑ ์ปจํ ์คํธ๋ฅผ ํ๋ฌ์ํ๋ ๋ฐฉ๋ฒ
- em.flush() : ์ง์ ํธ์ถ
- ํธ๋์ญ์ ์ปค๋ฐ : ํ๋ฌ์ ์๋ ํธ์ถ
- JPQL ์ฟผ๋ฆฌ ์คํ : ํ๋ฌ์ ์๋ ํธ์ถ (em.persist๋ก memberA,B,C ๋ฃ์๋๋ฐ flush ์ํ๋ฉด DB์์ ์กฐํ๊ฐ ์๋จ)
ํ๋ฌ์ ๋ชจ๋ ์ต์
em.setFlushMode(FlushModeType.COMMIT)
- FlushModeType.AUTO : ์ปค๋ฐ์ด๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ ํ๋ฌ์ (๊ธฐ๋ณธ๊ฐ)
- FlushModeType.COMMIT : ์ปค๋ฐํ ๋๋ง ํ๋ฌ์
ํ๋ฌ์๋!
- ์์์ฑ ์ปจํ
์คํธ๋ฅผ ๋น์ฐ์ง ์์
- ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํ
- ํธ๋์ญ์ ์ด๋ผ๋ ์์ ๋จ์๊ฐ ์ค์ -> ์ปค๋ฐ ์ง์ ์๋ง ๋๊ธฐํํ๋ฉด ๋จ
3. ์ค์์ ์ํ
- ์์ -> ์ค์์
- ์์ ์ํ์ ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ ์คํธ์์ ๋ถ๋ฆฌ (detachd)
- ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ ๋ชปํจ
์ค์์ ์ํ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ
- em.detach(entity) : ํน์ ์ํฐํฐ๋ง ์ค์์ ์ํ๋ก ์ ํ
- em.clear() : ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์์ ํ ์ด๊ธฐํ
- em.close() : ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ข ๋ฃ
'๐จโ๐ป Web Development > JPA - ๊ธฐ๋ณธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] 4.์ํฐํฐ ๋งตํ (0) | 2023.03.10 |
---|---|
[JPA] 2.JPA ์์ํ๊ธฐ (0) | 2023.03.09 |
[JPA] 1.JPA ์๊ฐ (0) | 2023.03.08 |
์ต๊ทผ๋๊ธ