๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒท Spring/๊ฐœ๋…

[Spring][JPA] ์—”ํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €(EntityManager)์™€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž!

by hyeong._.ing 2026. 6. 9.

 

 

์ „ ํฌ์ŠคํŒ…์—์„œ Cascade์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ๋‹ค.
์‚ฌ์‹ค Cascade๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ
์—”ํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์ข‹๋‹ค.
๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—” ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

 

 

 

1. ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €(Entity Manager)

  • ์ž๋ฐ” ์ฝ”๋”ฉ์„ ํ•  ๋•Œ ๋‹ค๋ฃจ๋Š” ๊ฑด ๊ฐ์ฒด(Object) ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB) ํ…Œ์ด๋ธ”์ด๋‹ค.
  • ๋‘˜์€ ์ „ํ˜€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€ํ™”๊ฐ€ ์ž˜ ์•ˆํ†ตํ•œ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ค‘๊ฐ„์—์„œ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ , ์•Œ์•„์„œ DB์— ๋งž๋Š” SQL๋กœ ๋ฐ”๊ฟ”์„œ ์ €์žฅํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ์ผ์„ ํ•ด์ค„ ์• ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ๊ทธ ์ผ์„ ํ•ด๋‚ด๋Š” ์• ๊ฐ€ ๋ฐ”๋กœ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์ด๋‹ค.
  • ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ๋‚ด๋ถ€์—” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ผ๋Š” ์ผ์ข…์˜ ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‘๊ณ  ๋ฌผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•œ๋‹ค.  →  ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด, ๋งค๋‹ˆ์ €๋Š” ๋น„๋ฐ€ ๋ฌผ๋ฅ˜์ฐฝ๊ณ (์˜์†์„ฑ ์ปจํ…์ŠคํŠธ)๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งค๋‹ˆ์ €๋Š” DB๋ผ๋Š” ์ง„์งœ ์ผํ„ฐ๋กœ ๋›ฐ์–ด๊ฐ€๊ธฐ ์ „์— ๋น„๋ฐ€ ๋ฌผ๋ฅ˜ ์ฐฝ๊ณ ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๋„ฃ๊ณ  ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค.

  • 1์ฐจ ์บ์‹œ : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์ „์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ ์บ์‹œ๋ฅผ ๋จผ์ € ํ™•์ธํ•œ๋‹ค. ์ด๋ฏธ ์กฐํšŒํ–ˆ๋˜ ๋ฐ์ดํ„ฐ๋ผ๋ฉด DB์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ƒ ์ด์ ์ด ์žˆ๋‹ค.  →  ์–ด๋–ค ์œ ์ €๊ฐ€ ํ™๊ธธ๋™ ํšŒ์› ์ •๋ณด๋ฅผ ๋ณด์—ฌ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋งค๋‹ˆ์ €๋Š” DB๋กœ ๋‹ฌ๋ ค๊ฐ€๊ธฐ ์ „์— ๋น„๋ฐ€ ๋ฌผ๋ฅ˜ ์ฐฝ๊ณ ๋ถ€ํ„ฐ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ์กฐ๊ธˆ ์ „์— ํ™๊ธธ๋™ ์ •๋ณด๋ฅผ ๊บผ๋‚ด๋‘” ๊ฒŒ ์ฐฝ๊ณ ์— ๋‚จ์•„ ์žˆ๋‹ค๋ฉด DB๊นŒ์ง€ ์•ˆ๊ฐ€๊ณ  ๋ฐ”๋กœ ๊บผ๋‚ด์„œ ๋ณด์—ฌ์ค€๋‹ค.
  • ๋ณ€๊ฒฝ๊ฐ์ง€(Dirty Checking) : ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ๋ณ„๋„์˜ update( ) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์—”ํ‹ฐํ‹ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๋Š” ์‹œ์ ์— ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ UPDATE SQL์„ ์‹คํ–‰ํ•œ๋‹ค.    ํšŒ์› ์ด๋ฆ„์„ ํ™๊ธธ๋™์—์„œ ๊น€์ฒ ์ˆ˜๋กœ ๋ฐ”๊พผ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ž๋ฐ” ์ฝ”๋“œ์—์„œ ๊ทธ๋ƒฅ ๊ฐ์ฒด์˜ ์ด๋ฆ„๋งŒ setName("๊น€์ฒ ์ˆ˜")๋กœ ๋ฐ”๊พผ๋‹ค. ๋”ฐ๋กœ update( ) ๊ฐ™์€ ๋ช…๋ น์„ ๋‚ด๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ๋งค๋‹ˆ์ €๋Š” ์ฒ˜์Œ ์ฐฝ๊ณ ์— ๋“ค์–ด์™”์„ ๋•Œ ํ™๊ธธ๋™ ๋ชจ์Šต๊ณผ ๊น€์ฒ ์ˆ˜์˜ ๋ชจ์Šต์„ ๋น„๊ต(์Šค๋ƒ…์ƒท ๋น„๊ต)ํ•œ๋‹ค. ์ด๋ฆ„์ด ๋ฐ”๋€๊ฑธ ์•Œ์•„์ฐจ๋ฆฐ ๋งค๋‹ˆ์ €๋Š” ์ผ์ด ๋๋‚  ๋•Œ ์ž๋™์œผ๋กœ DB์— ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๋ผ๊ณ  ๋ณด๋‚ธ๋‹ค.
  • ์“ฐ๊ธฐ์ง€์—ฐ(Transactional Write-Behind) : ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅ(persist)ํ•  ๋•Œ ์ฆ‰์‹œ DB์— ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ์ง€ ์•Š๊ณ , ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ €์žฅ์†Œ์— ๋ชจ์•„๋‘์—ˆ๋‹ค๊ฐ€ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๋Š” ์ˆœ๊ฐ„ ํ•œ๊บผ๋ฒˆ์— DB๋กœ ๋ณด๋‚ธ๋‹ค.    ํšŒ์› 3๋ช…์„ ํ•œ ๋ฒˆ์— ๊ฐ€์ž…์‹œํ‚ค๋ ค๊ณ  ํ•  ๋•Œ, ๋งค๋‹ˆ์ €๋Š” ๋งค๋ฒˆ DB๋กœ ๋›ฐ์–ด๊ฐ€์„œ ํ•œ ๋ช…์”ฉ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฃผ๋ฌธ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์ฐฝ๊ณ ์— ์ž˜ ์Œ“์•„๋‘์—ˆ๋‹ค๊ฐ€, ์–ด๋А ์‹œ์ ์— ํ•œ๊บผ๋ฒˆ์— DB๋กœ ๊ฐ€์ ธ๊ฐ€์„œ ์ฒ˜๋ฆฌ(ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹)ํ•œ๋‹ค. ์›€์ง์ด๋Š” ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์„œ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค.

  • ์ฃผ์˜) ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ์Šค๋ ˆ๋“œ ๊ฐ„์— ์ ˆ๋Œ€ ๊ณต์œ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ์•คํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๊ฐ€ ์žˆ๊ณ , ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ์š”์ฒญ(ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜)๋‹น ํ•˜๋‚˜์˜ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•œ ๋’ค ๋ฐ˜๋“œ์‹œ ๋‹ซ์•„์•ผ ํ•œ๋‹ค.     ์ด ๋งค๋‹ˆ์ €๋Š” ์†๋‹˜ ํ•œ ๋ช…๋‹น ๋งค๋‹ˆ์ € ํ•œ ๋ช…์”ฉ์œผ๋กœ ๋ฐฐ์ •ํ•ด์•ผํ•œ๋‹ค. ๋งŒ์•ฝ ํ•œ ๋ช…์˜ ๋งค๋‹ˆ์ €๊ฐ€ ์—ฌ๋Ÿฌ ์†๋‹˜์˜ ์š”์ฒญ์„ ๋™์‹œ์— ๋“ค์–ด์ฃผ๋ฉด ์ฐฝ๊ณ  ์•ˆ์ด ๊ผฌ์ด๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ๋งค๋‹ˆ์ €๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ผ์ด ๋๋‚˜๋ฉด ์ข…๋ฃŒ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

  • ์Šคํ”„๋ง ๋ถ€ํŠธ ํ™˜๊ฒฝ์—์„œ JpaRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ save( ), findById( ) ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด, ์ด๋ฏธ ๊ทธ ๋‚ด๋ถ€์—์„œ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๊ฐ€ ์ผ์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
  • Spring Data JPA๊ฐ€ ์ด ๋ณต์žกํ•œ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์˜ ์ƒ์„ฑ, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋‹ซ๊ธฐ ๊ณผ์ •์„ ์•Œ์•„์„œ ์ถ”์ƒํ™”ํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์ง์ ‘ ์ฝ”๋“œ๋กœ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 


 

 

 

 

2. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(Persistence Context)

  • ์˜์†์„ฑ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์„ ๋งํ•œ๋‹ค.
  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ๊ฐ์ฒด๋ฅผ ์˜ค๋ž˜ ๋ณด์กดํ•˜๋Š” ๊ณต๊ฐ„์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

  • ๊ฐ์ฒด๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์–ด๋–ค ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ 4๊ฐ€์ง€ ์ƒํƒœ๋กœ ๋‚˜๋‰œ๋‹ค.
  • ๋น„์˜์† (Transient)
    ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์•„๋ฌด ๊ด€๊ณ„ ์—†๋Š” ์ƒํƒœ์ด๋‹ค. Java ์˜์—ญ์—๋งŒ ์กด์žฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™๋œ ์  ์—†๋Š” ์ˆœ์ˆœํ•œ ๊ฐ์ฒด๋กœ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๊ฐ€ persist ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์† ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜์† (Managed)
    ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ ์ค‘์ธ ์ƒํƒœ์ด๋‹ค. DB์— ์ €์žฅ๋˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ๋„ ๊ฐ™์€ ์ƒํƒœ๋กœ ์กด์žฌํ•˜๋Š” ์ƒํƒœ๋กœ PK(๊ธฐ๋ณธํ‚ค) ๊ฐ’์„ ํ†ตํ•ด ํ•„์š”ํ•œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ๋ถ€ํ„ฐ JPA์˜ ๊ด€๋ฆฌ๋ฅผ ๋ฐ›๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.
  • ์ค€์˜์† (Detached) 
    ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋˜์–ด ์žˆ์—ˆ์œผ๋‚˜ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ์ด๋‹ค. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ(์บ์‹œ, ๋ณ€๊ฒฝ ๊ฐ์ง€ ๋“ฑ)์„ ๋” ์ด์ƒ ๋ฐ›์ง€ ๋ชปํ•œ๋‹ค.
  • ์‚ญ์ œ (Removed) 
    ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ์™„์ „ํžˆ ์‚ญ์ œ๋œ ์ƒํƒœ์ด๋‹ค. DB ์ƒ์—์„œ ์‚ญ์ œ๋˜๋ฉฐ ๊ฐ์ฒด๋Š” ๋”์ด์ƒ ์˜์† ์ปจํ…์ŠคํŠธ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.