Post

[JPA] Dirty Checking

[JPA] Dirty Checking

๐Ÿ“Œ Dirty Checking์ด๋ž€?

Dirty Checking(๋ณ€๊ฒฝ ๊ฐ์ง€)๋ž€ JPA๊ฐ€ ์˜์† ์ƒํƒœ์ธ ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ด, ํŠธ๋žœ์žญ์…˜์„ย flushํ•˜๋Š” ์ˆœ๊ฐ„ ํ•„์š”ํ•œย UPDATEย ์ฟผ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ๋”ฐ๋กœ save ๋˜๋Š” saveAndFlush ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚  ๋•Œ ์ž๋™์œผ๋กœ ์—”ํ‹ฐํ‹ฐ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด DB์— ๋ฐ˜์˜๋œ๋‹ค.

์ค€์˜์† ๋˜๋Š” ๋น„์˜์† ์—”ํ‹ฐํ‹ฐ๋Š” Dirty Checking ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋“ค์€ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๋„ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด DB์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ“Œ ๋™์ž‘ ๊ณผ์ •

persist , find ๋ฉ”์„œ๋“œ ๋“ฑ์œผ๋กœ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์† ์ƒํƒœ๊ฐ€ ๋˜๋ฉด, ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋Š” 1์ฐจ ์บ์‹œ์— ์ €์žฅ๋˜๊ณ , ์—”ํ‹ฐํ‹ฐ์˜ ์Šค๋ƒ…์ƒท ๋˜ํ•œ ํ•จ๊ป˜ ๋ณด๊ด€๋œ๋‹ค.

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

ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๋ฉด flush ๊ฐ€ ํ˜ธ์ถœ๋˜๊ฒŒ ๋˜๋Š”๋ฐ, JPA๋Š” flush ์‹œ์ ์—์„œ 1์ฐจ ์บ์‹œ์˜ ์Šค๋ƒ…์ƒท๊ณผ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•„๋“œ๋ณ„๋กœ ๋น„๊ตํ•˜์—ฌ ๋‹ฌ๋ผ์ง„ ์ ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ์žˆ๋‹ค๋ฉด, ์“ฐ๊ธฐ ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— UPDATE ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋„ฃ๋Š”๋‹ค.

flush ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ ์“ฐ๊ธฐ ์ง€์—ฐ SQL ์ €์žฅ์†Œ์˜ ์ฟผ๋ฆฌ๋ฅผ DB์— ์ „์†กํ•˜๊ณ , ์‹ค์ œ ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹์ด ์ผ์–ด๋‚˜๋ฉด์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— DB์— ๋ฐ˜์˜๋˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ“Œ ํŠน์ง•

์ƒ์„ฑ๋˜๋Š” UPDATE ์ฟผ๋ฆฌ๋Š” ๋ณ€๊ฒฝ๋œ ํ•„๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ์ฟผ๋ฆฌ์ด๋‹ค. ๋ณ€๊ฒฝ๋œ ํ•„๋“œ๊ฐ€ ๋งž์ถฐ ์ฟผ๋ฆฌ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๋น„์šฉ๋ณด๋‹ค ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ „์†กํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ๋น„์šฉ์ด ๋” ์ ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ญ์ƒ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ฟผ๋ฆฌ๋ฅผ ์บ์‹œํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ ์—”ํ‹ฐํ‹ฐ์˜ ์Šค๋ƒ…์ƒท์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์—”ํ‹ฐํ‹ฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ํ•„๋“œ๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ flush ์‹œ์ ์—์„œ ์˜์† ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ ๊ฐ’ ๋น„๊ต ์‹œ ๋น„์šฉ๋„ ์ฆ๊ฐ€ํ•œ๋‹ค. ๊น€์˜ํ•œ ๋‹˜์˜ โ€˜์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐโ€™์— ์˜ํ•˜๋ฉด, ํ•„๋“œ๊ฐ€ 30๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์ „์ฒด ํ•„๋“œ UPDATE ์ฟผ๋ฆฌ๋ฌธ์˜ ์žฅ์ ์ด ํ‡ด์ƒ‰๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ, @DynamicUpdate ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ˆ˜์ •๋œ ํ•„๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ UPDATE ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, ํ•„๋“œ๊ฐ€ 30๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ํ…Œ์ด๋ธ” ์„ค๊ณ„๋ฅผ ๋‹ค์‹œ ์‚ดํŽด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๋˜๋Š” ํŠน์ • ํ•„๋“œ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” JPQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. ๋‹ค๋งŒ ์ด ๋ฐฉ๋ฒ•์€ DB์™€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๊ฐ„ ๋ถˆ์ผ์น˜ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. JPQL ์ฟผ๋ฆฌ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ DB์— ์ฟผ๋ฆฌ๋ฅผ ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งŒ์•ฝ ์ฝ๊ธฐ ์ „์šฉ ํŠธ๋žœ์žญ์…˜์ด๋ผ๋ฉด, @Transaction(readOnly = true) ๋ฅผ ํ†ตํ•ด Dirty Checking์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ์ฐธ๊ณ 

https://jojoldu.tistory.com/415

This post is licensed under CC BY 4.0 by the author.