[JPA] ํ”Œ๋Ÿฌ์‹œ

๐Ÿ“‚ ํ”Œ๋Ÿฌ์‹œ

ํ”Œ๋Ÿฌ์‹œ( flush() )๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•œ๋‹ค. ํ”Œ๋Ÿฌ์‹œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚œ๋‹ค. 

  1. ๋ณ€๊ฒฝ ๊ฐ์ง€๊ฐ€ ๋™์ž‘ํ•ด์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์žˆ๋Š” ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ ์Šค๋ƒ…์ƒท๊ณผ ๋น„๊ตํ•ด ์ˆ˜์ •๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐพ๋Š”๋‹ค. ์ˆ˜์ •๋œ ์—”ํ‹ฐํ‹ฐ๋Š” ์ˆ˜์ • ์ฟผ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด ์“ฐ๊ธฐ ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— ๋“ฑ๋กํ•œ๋‹ค.
  2. ์“ฐ๊ธฐ ์ง€์—ฐ SQL ์ €์žฅ์†Œ์˜ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „์†กํ•œ๋‹ค.(๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ ์ฟผ๋ฆฌ)

๐Ÿ“‚ ํ”Œ๋Ÿฌ์‹œ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์˜ 3๊ฐ€์ง€์ด๋‹ค. 

  1. em.flush() ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœ
  2. ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ ํ”Œ๋Ÿฌ์‹œ๊ฐ€ ์ž๋™ ํ˜ธ์ถœ
  3. JPQL ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ ํ”Œ๋Ÿฌ์‹œ๊ฐ€ ์ž๋™ ํ˜ธ์ถœ

ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž. 

1๏ธโƒฃ ์ง์ ‘ ํ˜ธ์ถœ( em.flush() )

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์˜ flush() ๋ฉ”์†Œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ด์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ•์ œ๋กœ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ…Œ์ŠคํŠธ๋‚˜ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ JPA๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

2๏ธโƒฃ ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ SQL๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ํŠธ๋žœ์žญ์…˜๋งŒ ์ปค๋ฐ‹ํ•˜๋ฉด ์–ด๋–ค ๋ฐ์ดํ„ฐ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ปค๋ฐ‹ ์ „์— ๊ผญ ํ”Œ๋Ÿฌ์‹œ๋ฅผ ํ˜ธ์ถœํ•ด ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•ด์•ผ ํ•œ๋‹ค. 

JPA๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•  ๋•Œ ํ”Œ๋Ÿฌ์‹œ๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. 

3๏ธโƒฃ JPQL ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ

JPQL์ด๋‚˜ Criteria ๊ฐ™์€ ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋„ ํ”Œ๋Ÿฌ์‹œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. 

๊ทธ ์ด์œ ๋ฅผ ๋‹ค์Œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์ž. 

- JPQL ์ฟผ๋ฆฌ ์‹คํ–‰ ์ฝ”๋“œ

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();

๋จผ์ €, em.persist()๋ฅผ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ๋“ค์„ ์˜์† ์ƒํƒœ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด ์—”ํ‹ฐํ‹ฐ๋“ค์€ ์•„์ง ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜๋‹ค. ์ด๋•Œ JPQL์„ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? JPQL์€ SQL๋กœ ๋ณ€ํ™˜๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์•„์ง ์—”ํ‹ฐํ‹ฐ๋“ค์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค

๋”ฐ๋ผ์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ง์ „์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•ด์„œ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•ด์•ผ ํ•œ๋‹ค. JPA๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด JPQL์„ ์‹คํ–‰ํ•  ๋•Œ๋„ ํ”Œ๋Ÿฌ์‹œ๋ฅผ ์ž๋™ ํ˜ธ์ถœํ•œ๋‹ค. ๋”ฐ๋ผ์„œ memberA, memberB, memberC๋„ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— ํฌํ•จ๋œ๋‹ค. 

์ฐธ๊ณ ) find() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ํ”Œ๋Ÿฌ์‹œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. 

๐Ÿ“‚ ํ”Œ๋Ÿฌ์‹œ ๋ชจ๋“œ ์˜ต์…˜

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์— ํ”Œ๋Ÿฌ์‹œ ๋ชจ๋“œ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๋ ค๋ฉด javax.persistence.FlushModeType ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 

  • FlushModeType.AUTO : ์ปค๋ฐ‹์ด๋‚˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ”Œ๋Ÿฌ์‹œ(Default)
  • FlushModeType.COMMIT : ์ปค๋ฐ‹ํ•  ๋•Œ๋งŒ ํ”Œ๋Ÿฌ์‹œ

 ํ”Œ๋Ÿฌ์‹œ ๋ชจ๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด AUTO๋กœ ๋™์ž‘ํ•œ๋‹ค. COMMIT ๋ชจ๋“œ๋Š” ์„ฑ๋Šฅ์˜ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋’ค์—์„œ ์•Œ์•„๋ณด์ž. 

// ํ”Œ๋Ÿฌ์‹œ ๋ชจ๋“œ ์ง์ ‘ ์„ค์ •
em.setFlushMode(FlushModeType.COMMIT);

 

์ค‘์š”

ํ”Œ๋Ÿฌ์‹œ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณด๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง€์šฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™๊ธฐํ™”๋ฅผ ์ตœ๋Œ€ํ•œ ๋Šฆ์ถ”๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ํŠธ๋žœ์žญ์…˜์ด๋ผ๋Š” ์ž‘์—… ๋‹จ์œ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์ง์ „์—๋งŒ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณด๋‚ด ๋™๊ธฐํ™”ํ•˜๋ฉด ๋œ๋‹ค. 


์ฐธ๊ณ 

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๊น€์˜ํ•œ ์ €)