Post

[JPA] ์—ฐ๊ด€๊ด€๊ณ„

๐Ÿ“Œ 1. JPA ์—ฐ๊ด€๊ด€๊ณ„ ๊ฐœ์š”

  • JPA๋ž€? ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด์™€ ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜๋Š” API
  • ์—”ํ‹ฐํ‹ฐ(Entity): ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์— ๋Œ€์‘๋˜๋Š” ๊ฐ์ฒด๋กœ ํŠน์ • ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ํ‘œํ˜„
  • ์—ฐ๊ด€๊ด€๊ณ„์˜ ์˜๋ฏธ: JPA ์—”ํ‹ฐํ‹ฐ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋ฉฐ, ํ•œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋‹ค๋ฅธ ์—”ํ‹ฐํ‹ฐ์™€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•จ
  • ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ, ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•จ

๐Ÿ“Œ 2. One-to-Many (์ผ๋Œ€๋‹ค ์—ฐ๊ด€๊ด€๊ณ„)

๋ถ€๋ชจ ์ธก(์˜ˆ: ๊ฐ€์กฑ)๊ณผ ์ž์‹ ์ธก(์˜ˆ: ๊ตฌ์„ฑ์›)์˜ ๊ด€๊ณ„๋‹ค

๐Ÿ”น ์–‘๋ฐฉํ–ฅ One-to-Many

  • ์ „์ด(Cascade) ๋ฐฉํ–ฅ: ํ•ญ์ƒ ๋ถ€๋ชจ ์ธก์—์„œ ์ž์‹ ์ธก์œผ๋กœ๋งŒ ์ „์ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • ์ž์‹ ์ธก(@ManyToOne)์—๋Š” ์ „์ด ํƒ€์ž…์„ ๋ถ™์ด๋ฉด ์•ˆ๋œ๋‹ค

๐Ÿ”น ๋‹จ๋ฐฉํ–ฅ One-to-Many

  • ์ž์‹ ์ธก์—์„œ ๋ถ€๋ชจ๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์™ธ๋ž˜ํ‚ค๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์–ด โ€œ๋ณ„๋„์˜ ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”(Link Table)โ€์ด ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค
  • ๋ฌธ์ œ์  1 (๋น„ํšจ์œจ์„ฑ): ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ” ์ž์ฒด์˜ ์˜ค๋ฒ„ํ—ค๋“œ, 2๊ฐœ์˜ ์™ธ๋ž˜ํ‚ค ์ธ๋ฑ์‹ฑ์œผ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ฆ๊ฐ€, 3๊ฐœ ํ…Œ์ด๋ธ” ์กฐ์ธ์œผ๋กœ ์ธํ•œ ์ฟผ๋ฆฌ ๋ณต์žก์„ฑ ๋ฐ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค
  • ๋ฌธ์ œ์  2 (INSERT/DELETE ๋น„ํšจ์œจ): ์ƒˆ๋กœ์šด ์ž์‹(๊ตฌ์„ฑ์›)์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•  ๋•Œ, ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” โ€œ๊ธฐ์กด ๊ด€๊ณ„๋ฅผ ๋ชจ๋‘ ์‚ญ์ œ(DELETE)ํ•œ ํ›„, ์ƒˆ๋กœ์šด ์ž์‹์„ ํฌํ•จํ•˜์—ฌ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ์‚ฝ์ž…(INSERT)โ€ํ•˜๋Š” ๋น„ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ถ€๋ชจ๊ฐ€ ์ž์‹์˜ ์ƒํƒœ๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๊ธฐ ์ œํ•œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค
  • ๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (@JoinColumn): ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์— @JoinColumn์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ” ์—†์ด ์ž์‹ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ํ‚ค๋ฅผ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ์—ฌ์ „ํžˆ ์™ธ๋ž˜ํ‚ค ์„ค์ •์„ ์œ„ํ•œ ์ถ”๊ฐ€ UPDATE ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์–ด๋А ์ •๋„์˜ ์„ฑ๋Šฅ ์ €ํ•˜๋Š” ๋ฐœ์ƒํ•œ๋‹ค

๐Ÿ“Œ 3. Many-to-Many (๋‹ค๋Œ€๋‹ค ์—ฐ๊ด€๊ด€๊ณ„)

์–‘์ธก ๋ชจ๋‘ ๋ถ€๋ชจ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณ„๋„์˜ ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ๋‘ ๊ฐœ์˜ ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ด€๋ฆฌ

๐Ÿ”น ์ฃผ์š” ์ตœ์ ํ™” ์›์น™

  1. List ๋Œ€์‹  Set ์‚ฌ์šฉํ•˜๊ธฐ:
  2. CascadeType.ALL ๋ฐ REMOVE ์‚ฌ์šฉ ๊ธˆ์ง€:
  3. ์–‘์ธก ๋ชจ๋‘ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ์‚ฌ์šฉํ•˜๊ธฐ:

๐Ÿ“Œ 4. One-to-One (์ผ๋Œ€์ผ ์—ฐ๊ด€๊ด€๊ณ„)

๐Ÿ”น ๋‹จ๋ฐฉํ–ฅ One-to-One

  • ์ž์‹ ์ธก์— ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์œผ๋ฉฐ, ๋ถ€๋ชจ๋Š” ์ž์‹์˜ ์‹๋ณ„์ž๋ฅผ ์•Œ์ง€ ๋ชปํ•œ๋‹ค
  • ์ž์‹ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์กฐ๊ฑด ํƒ์ƒ‰์„ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ถ€๋ชจ๊ฐ€ ์ž์‹์„ ํ•„์š”๋กœ ํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค

๐Ÿ”น ์–‘๋ฐฉํ–ฅ One-to-One

  • ๋ถ€๋ชจ ์ธก์— @MappedBy๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์ œ์ : ์ง€์—ฐ ๋กœ๋”ฉ(LAZY)์„ ์„ค์ •ํ•˜๋”๋ผ๋„ ๋ถ€๋ชจ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์ž์‹๊นŒ์ง€ ๋ฌด์กฐ๊ฑด SELECT ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: @MapsId ์‚ฌ์šฉ

  • ์ž์‹ ์ธก์— @MapsId๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ž์‹ ํ…Œ์ด๋ธ”์ด ๋ถ€๋ชจ ํ…Œ์ด๋ธ”๊ณผ ๊ธฐ๋ณธํ‚ค(PK)๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. (์ž์‹ ์‹๋ณ„์ž ์ƒ์„ฑ ์ „๋žต(Strategy)์€ ์ œ๊ฑฐ)
  • ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์—์„œ๋Š” ๊ตณ์ด ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์„ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ™”
  • ์žฅ์  1: ๋ถ€๋ชจ ์กฐํšŒ ์‹œ ์ž์‹์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๊ฐ€ ์ฟผ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ
  • ์žฅ์  2: ๊ธฐ๋ณธํ‚ค์™€ ์™ธ๋ž˜ํ‚ค๋ฅผ ๋ชจ๋‘ ์ธ๋ฑ์‹ฑํ•  ํ•„์š”๊ฐ€ ์—†์–ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ์†Œ
This post is licensed under CC BY 4.0 by the author.