[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
  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ