๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ๏ธ Today I Learned(TIL)/์ŠคํŒŒ๋ฅดํƒ€ ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

[ TIL ] JPA ์‹ฌํ™”_Day 3

by carrot0911 2025. 1. 16.

์˜ค๋Š˜ ํ•œ ๊ณต๋ถ€ ๐Ÿง 

JPA ์‹ฌํ™” 4, 5์ฃผ์ฐจ ๊ฐ•์˜

  • Cascade (์˜์†์„ฑ ์ „์ด)
    • ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ ๋ฐ˜๋Œ€ํŽธ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.
    • @OneToMany ๋˜๋Š” @OneToOne์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์–‘์ชฝ Entity์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์ด ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋น„์Šทํ•ด์•ผ ํ•œ๋‹ค.
    • ์˜ต์…˜ ์ข…๋ฅ˜
      • ALL: ์ „์ฒด ์ƒํƒœ ์ „์ด
      • PERSIST: ์ €์žฅ ์ƒํƒœ ์ „์ด
      • REMOVE: ์‚ญ์ œ ์ƒํƒœ ์ „์ด → ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์ž์‹ ํ…Œ์ด๋ธ”์˜ ๊ฐ’์ด ๊ฐ™์ด ์‚ญ์ œ๋˜์–ด์•ผ ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
      • MERGE: ์—…๋ฐ์ดํŠธ ์ƒํƒœ ์ „์ด 
      • REFRESH: ๊ฐฑ์‹  ์ƒํƒœ ์ „์ด
      • DETACH: ๋น„์˜์†์„ฑ ์ƒํƒœ ์ „์ด
  • orphanRemoval (๊ณ ์•„ ๊ฐ์ฒด ์ œ๊ฑฐ)
    • @OneToMany ๋˜๋Š” @OneToOne์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. (๋ถ€๋ชจ Entity)
    • Cascade.REMOVE์™€ ๋น„์Šทํ•œ ์šฉ๋„๋กœ ์‚ญ์ œ๋ฅผ ์ „ํŒŒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
    • ๋ถ€๋ชจ ๊ฐ์ฒด์—์„œ ๋ฆฌ์ŠคํŠธ ์š”์†Œ์‚ญ์ œ๋ฅผ ํ–ˆ์„ ๊ฒฝ์šฐ ํ•ด๋‹น ์ž์‹ ๊ฐ์ฒด๋Š” ๋งคํ•‘์ •๋ณด๊ฐ€ ์—†์–ด์ง€๋ฏ€๋กœ ๋Œ€์‹  ์‚ญ์ œํ•ด ์ค€๋‹ค.
  • Casecade.REMOVE์™€ orphanRemoval์˜ ์ฐจ์ด์ 
    • Cascade.REMOVE: 1์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ชจ Entity๋ฅผ em.remove๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์‚ญ์ œํ•  ๋•Œ, ๊ทธ ์•„๋ž˜์— ์žˆ๋Š” N์— ํ•ด๋‹นํ•˜๋Š” ์ž์‹ Entity๋“ค์ด ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
      • ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ๊ฐ’์ด ์‚ญ์ œ๋˜์–ด๋„ ์ž์‹ ํ…Œ์ด๋ธ”์€ ์‚ญ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค. 
    • orphanRemoval=true: ์œ„ ์ผ€์ด์Šค๋„ ํฌํ•จํ•˜๋ฉฐ, 1์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ชจ Entity์˜ ๋ฆฌ์ŠคํŠธ์—์„œ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ๋งŒ ํ•ด๋„ ํ•ด๋‹น N์— ํ•ด๋‹นํ•˜๋Š” ์ž์‹ Entity๊ฐ€ delete ๋˜๋Š” ๊ธฐ๋Šฅ๊นŒ์ง€ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
      • ๋ถ€๋ชจ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ’์„ ์‚ญ์ œํ•˜๋”๋ผ๋„ ์ž์‹์—์„œ delete๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • ์˜์†์„ฑ ์ „์ด ์ตœ๊ฐ• ์กฐํ•ฉ: orphanRemoval=true + Cascade.ALL
  • Fetch (์กฐํšŒ ์‹œ์ )
    • ๊ธฐ๋ณธ LAZY๋ฅผ ์„ค์ •ํ•œ ๋’ค์— ํ•„์š”ํ•  ๊ฒฝ์šฐ์— fetch Join์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ํ•ญ์ƒ ๊ฐ™์ด ์“ฐ์ด๋Š” ์—ฐ๊ด€๊ด€๊ณ„์ผ ๊ฒฝ์šฐ๋งŒ EAGER๋ฅผ ์„ค์ •ํ•œ๋‹ค.
    • ์˜ต์…˜
      • EAGER: ์ฆ‰์‹œ ๋กœ๋”ฉ (๋ถ€๋ชจ ์กฐํšŒ ์‹œ ์ž์‹๋„ ๊ฐ™์ด ์กฐํšŒ)
      • LAZY: ์ง€์—ฐ ๋กœ๋”ฉ (์ž์‹์€ ํ•„์š”ํ•  ๋•Œ ๋”ฐ๋กœ ์กฐํšŒ)

 

์˜ค๋Š˜ ํ•˜๋ฃจ ์ •๋ฆฌ โœ๏ธ

์˜ค๋Š˜์€ ๋ญ”๊ฐ€ ํ•˜๋ฃจ๊ฐ€ ๋ฐ”์˜๊ฒŒ ์ง€๋‚˜๊ฐ„ ๊ฒƒ ๊ฐ™๋‹ค.
์˜ค์ „์—๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Java ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ 1๋ฌธ์ œ ํ’€๊ณ  JPA ์‹ฌํ™” 4์ฃผ์ฐจ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ๋‚˜๋‹ˆ ์ ์‹ฌ์‹œ๊ฐ„์ด ๋˜์—ˆ๋‹ค.. (๋‚ด๊ฐ€ ๊ณต๋ถ€ํ•˜๋Š” ์†๋„๊ฐ€ ๋Š๋ฆฐ ๊ฑด๊ฐ€.. ๐Ÿคจ)

์˜คํ›„์—๋Š” ๊ตญ์ทจ์ œ ์ƒ๋‹ด์ด ์žˆ์–ด์„œ ๋‹ค๋…€์™”๋Š”๋ฐ ์ด๋™์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ ค์„œ 2์‹œ๊ฐ„์ด ๋„˜๋Š” ์‹œ๊ฐ„์ด ๊ธˆ๋ฐฉ ์ง€๋‚˜๊ฐ€๋ฒ„๋ ธ๋‹ค.
์Šคํƒ ๋‹ค๋“œ๋ฐ˜ ์„ธ์…˜๊ณผ ์˜์†์„ฑ๊ณผ ํŠธ๋žœ์žญ์…˜ ์„ธ์…˜์„ ๋“ฃ์ง€ ๋ชปํ•ด์„œ ๋‚˜์ค‘์— ๋…นํ™”๋ณธ์ด ์˜ฌ๋ผ์˜ค๋ฉด ๋ฐ”๋กœ ๋ณด๋ฉด์„œ ๊ณต๋ถ€ํ•  ์˜ˆ์ •์ด๋‹ค!!

JPA ์‹ฌํ™” 5์ฃผ์ฐจ ๊ฐ•์˜๊นŒ์ง€ ๋‹ค ๋“ฃ๊ณ  ๋‚ด๊ฐ€ ์ง€๊ธˆ ์ œ๋Œ€๋กœ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„์ด ๋ฌด์—‡์ธ์ง€ ์ •๋ฆฌํ•˜๊ณ 
Cascade๊ณผ orphanRemoval์˜ ์ฐจ์ด์ , Page์™€ Pageable ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ๊ฐ•์˜๋ฅผ ๋“ค์—ˆ์„ ๋•Œ ์•„์ง ์ œ๋Œ€๋กœ ์•Œ๊ณ  ์žˆ์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ๊ณ , ์‹œ๊ฐ„์ด ์ƒ๊ธฐ๋Š” ๋Œ€๋กœ ๊ณต๋ถ€ ํ›„ ๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค!

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

 

๋‚ด์ผ ๊ณ„ํš โฐ

  • ๊ฐœ์ธ ๊ณผ์ œ ์‹œ์ž‘!
  • ์Šคํƒ ๋‹ค๋“œ๋ฐ˜ ์„ธ์…˜ ๋…นํ™”๋ณธ ๋“ฃ๊ธฐ
  • ์˜์†์„ฑ๊ณผ ํŠธ๋žœ์žญ์…˜ ๋…นํ™”๋ณธ ๋“ฃ๊ธฐ
  • TIL ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ

+์ถ”๊ฐ€ ๊ณ„ํš์ด ๋” ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ์–ด์š”~_~