๐Ÿฆ๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ ๋ฐฑ์—”๋“œ ์Šคํ„ฐ๋”” (2)

์œค์ค€์ƒยท2024๋…„ 8์›” 14์ผ
0

๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ

๋ชฉ๋ก ๋ณด๊ธฐ
1/4
post-thumbnail

์Šคํ„ฐ๋””๋ฅผ ํ•œ์ง€ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ์ง€๋‚˜๊ธด ํ–ˆ์ง€๋งŒ, ๊ธฐ๋ก์ด ์ง„์งœ ์ค‘์š”ํ•˜๊ณ , ์ด๋Ÿฐ ๊ธฐ๋ก ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ๋‚˜์—๊ฒŒ ๋„์›€ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ๋‚˜๋ฅผ ์œ„ํ•ด ์“ด๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๋Šฆ๊ฒŒ๋ผ๋„ ์“ด๋‹ค.

์ง€๊ธˆ์€ ๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ ๋Œ€ํ•™ 12th HACKATHON์„ ๊ฒฝํ—˜ํ•˜๊ณ  ์˜จ ํ›„์—ฌ์„œ ๊ทธ๋•Œ ์Šคํ„ฐ๋””ํ• ๋•Œ๋Š” ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ์“ฐ์ด์ง€? ๋ญ์ง€? ๋ผ๋Š” ์ƒ๊ฐ์ด ํ•ด์ปคํ†ค์„ ๊ฒฝํ—˜ํ•œ ํ›„, ์•„ ์ด๋ ‡๊ฒŒ ์“ฐ์ด๋Š”๊ตฌ๋‚˜ ์ด๋Ÿฐ์‹์ด๊ตฌ๋‚˜ ๋ผ๋Š”๊ฑธ ๋งŽ์ด ๊นจ๋‹ฌ์•˜๋‹ค.
์—ญ์‹œ ๋‚˜๋Š” ๋ชธ์œผ๋กœ ์ง์ ‘ ๋ถ€๋”ช์น˜๋ฉด์„œ ๊นจ๋‹ฌ์•„์•ผํ•œ๋‹ค๋Š”๊ฒƒ์„ ์•Œ์•˜๋‹ค. ์ฐธ ๋งŽ์€ ๋„์›€์ด ๋œ ํ•ด์ปคํ†ค์ด์—ฌ์„œ ๋น ๋ฅธ ์‹œ์ผ ๋‚ด์— ํšŒ๊ณ ๋ฅผ ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๋ฐฑ์—”๋“œ ์Šคํ„ฐ๋”” (2)


์šฉ์–ด

์—ฐ๊ด€๊ด€๊ณ„ (Association)

์—”ํ‹ฐํ‹ฐ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๊ฐ„ ์™ธ๋ž˜ ํ‚ค ๊ด€๊ณ„์— ํ•ด๋‹นํ•œ๋‹ค.

๋งคํ•‘ (Mapping)

๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ์ž‘์—…. JPA์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•˜๊ณ , ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•œ๋‹ค.

๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„ (Unidirectional Association)

ํ•œ ์ชฝ ์—”ํ‹ฐํ‹ฐ๋งŒ ๋‹ค๋ฅธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ด€๊ณ„

์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„ (Bidirectional Association)

๋‘ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ด€๊ณ„

์ผ๋Œ€์ผ (One-to-One)

ํ•œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•˜๋‚˜์˜ ๋‹ค๋ฅธ ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๋œ ๊ด€๊ณ„

์ผ๋Œ€๋‹ค (One-to-Many)

ํ•œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๋œ ๊ด€๊ณ„

๋‹ค๋Œ€์ผ (Many-to-One)

์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•œ ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๋œ ๊ด€๊ณ„

๋‹ค๋Œ€๋‹ค (Many-to-Many)

์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๋œ ๊ด€๊ณ„

์ฃผ์ธ ์—”ํ‹ฐํ‹ฐ (Owner Entity)

์—ฐ๊ด€๊ด€๊ณ„์—์„œ ์™ธ๋ž˜ํ‚ค๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ

์ฃผ์ธ ์•„๋‹Œ ์—”ํ‹ฐํ‹ฐ (Non-Owner Entity)

์™ธ๋ž˜ํ‚ค๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ์—”ํ‹ฐํ‹ฐ


์—ฐ๊ด€๊ด€๊ณ„์˜ ํ•„์š”์„ฑ

๊ฐ์ฒด ๋ชจ๋ธ์—์„œ๋Š” ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์—”ํ‹ฐํ‹ฐ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๊ฐ„ ์™ธ๋ž˜ํ‚ค์™€ ๊ฐ™์€ ๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋งคํ•‘์˜ ๋ชฉ์ 

๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ์กฐ๋ฅผ ์ผ์น˜์‹œ์ผœ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ๋ชจ๋ธ์„ ํ†ตํ•ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํ˜ธ์ž‘์šฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ฐ์ฒด ์—ฐ๊ด€๊ด€๊ณ„๋Š” ๊ฐ„์ ‘์ ์ด๊ณ , ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„๋Š” ์™ธ๋ž˜ ํ‚ค๋กœ ๋ช…ํ™•ํžˆ ํ‘œํ˜„๋˜๋ฉฐ, JPA ๋งคํ•‘์„ ํ†ตํ•ด ์ด๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.


์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์˜ ์ข…๋ฅ˜

์ผ๋Œ€์ผ(One-to-One) ๊ด€๊ณ„

๊ฐ์ฒด ์—ฐ๊ด€๊ด€๊ณ„

Member ๊ฐ์ฒด์™€ Locker ๊ฐ์ฒด๊ฐ€ 1:1๋กœ ๋งคํ•‘๋˜์–ด ์žˆ๋‹ค.
์ฆ‰, Member๋Š” ํ•˜๋‚˜์˜ Locker๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , Locker๋„ ํ•˜๋‚˜์˜ Member์—๋งŒ ์—ฐ๊ฒฐ๋œ๋‹ค.

ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” MEMBER ํ…Œ์ด๋ธ”์ด LOCKER_ID๋ฅผ ์™ธ๋ž˜ ํ‚ค๋กœ ๊ฐ€์ง€๋ฉฐ, ์ด ํ‚ค๋ฅผ ํ†ตํ•ด LOCKER ํ…Œ์ด๋ธ”๊ณผ 1:1 ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค.
LOCKER_ID ํ•„๋“œ๋Š” ์™ธ๋ž˜ ํ‚ค(FK)์ด๋ฉด์„œ ์œ ๋‹ˆํฌ(UNIQUE) ์ œ์•ฝ์กฐ๊ฑด์ด ์„ค์ •๋˜์–ด ์žˆ์–ด, ๊ฐ Locker๋Š” ํ•˜๋‚˜์˜ Member์™€๋งŒ ์—ฐ๊ด€๋  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋Œ€์ผ ๊ด€๊ณ„๋Š” ๋‘ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์„œ๋กœ 1:1๋กœ ๋งคํ•‘๋˜๋Š” ๊ด€๊ณ„๋กœ, ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์—๋งŒ ์—ฐ๊ด€๋˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ์™ธ๋ž˜ ํ‚ค์™€ ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•ด ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๊ฐ์ฒด ๋ชจ๋ธ์—์„œ๋Š” ํ•„๋“œ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.

๋‹ค๋Œ€์ผ(Many-to-One) ๊ด€๊ณ„

<๋‹จ๋ฐฉํ–ฅ>

๊ฐ์ฒด ์—ฐ๊ด€๊ด€๊ณ„

Member ๊ฐ์ฒด์™€ Team ๊ฐ์ฒด๊ฐ€ ๋‹ค๋Œ€์ผ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค.
์ฆ‰, ์—ฌ๋Ÿฌ Member ๊ฐ์ฒด๊ฐ€ ํ•˜๋‚˜์˜ Team ๊ฐ์ฒด์™€ ์—ฐ๊ด€๋  ์ˆ˜ ์žˆ๋‹ค.
Member ํด๋ž˜์Šค๋Š” Team team ํ•„๋“œ๋ฅผ ํ†ตํ•ด Team ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
์ด๋Š” ์—ฌ๋Ÿฌ Member๊ฐ€ ๋™์ผํ•œ Team ๊ฐ์ฒด์— ์†ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” MEMBER ํ…Œ์ด๋ธ”์ด TEAM_ID๋ฅผ ์™ธ๋ž˜ ํ‚ค(FK)๋กœ ๊ฐ€์ง€๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด TEAM ํ…Œ์ด๋ธ”๊ณผ์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•œ๋‹ค.
TEAM_ID ํ•„๋“œ๋Š” MEMBER ํ…Œ์ด๋ธ”์— ์†ํ•˜๋ฉฐ, ์ด๋Š” ์—ฌ๋Ÿฌ MEMBER๊ฐ€ ๋™์ผํ•œ TEAM์— ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

๋‹ค๋Œ€์ผ ๊ด€๊ณ„๋Š” ์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•˜๋‚˜์˜ ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๋˜๋Š” ๊ด€๊ณ„๋กœ, ๊ฐ์ฒด ๋ชจ๋ธ์—์„œ๋Š” Member๊ฐ€ Team์„ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ์™ธ๋ž˜ ํ‚ค๋ฅผ ํ†ตํ•ด ์ด ๊ด€๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ Member๊ฐ€ ๊ฐ™์€ Team์— ์†ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ตฌ์กฐ๋Š” ํŒ€๊ณผ ์†Œ์†๋œ ๋ฉค๋ฒ„๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

<์–‘๋ฐฉํ–ฅ>

๊ฐ์ฒด ์—ฐ๊ด€๊ด€๊ณ„

Member์™€ Team ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค. Member ๊ฐ์ฒด๋Š” Team team ํ•„๋“œ๋ฅผ ํ†ตํ•ด Team ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ, Team ๊ฐ์ฒด๋Š” List< Member > members ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ Member ๊ฐ์ฒด๋“ค์„ ์ฐธ์กฐํ•œ๋‹ค.
์ฆ‰, ์—ฌ๋Ÿฌ Member๊ฐ€ ํ•˜๋‚˜์˜ Team์— ์†ํ•˜๊ณ , Team์€ ์ž์‹ ์—๊ฒŒ ์†ํ•œ ๋ชจ๋“  Member๋“ค์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” MEMBER ํ…Œ์ด๋ธ”์ด TEAM_ID ์™ธ๋ž˜ ํ‚ค(FK)๋ฅผ ํ†ตํ•ด TEAM ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ด€๋˜์–ด ์žˆ๋‹ค.
์‚ฌ์ง„์—์„œ ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ, Team ๊ฐ์ฒด์— ์ถ”๊ฐ€๋œ members ํ•„๋“œ๋Š” ํ…Œ์ด๋ธ” ๊ตฌ์กฐ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉฐ, ์ด๋Š” ๊ฐ์ฒด ๋ชจ๋ธ ์ƒ์—์„œ๋งŒ ๊ด€๋ฆฌ๋œ๋‹ค.

์ด ๊ด€๊ณ„์—์„œ Member ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์™ธ๋ž˜ ํ‚ค(TEAM_ID)๊ฐ€ MEMBER ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‹ค์ œ๋กœ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ํ•ด๋‹น ํ‚ค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ด ๊ตฌ์กฐ๋Š” Member์™€ Team ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, Member๊ฐ€ Team์„ ์ฐธ์กฐํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Team๋„ ์ž์‹ ์—๊ฒŒ ์†ํ•œ Member๋“ค์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
์ด๋Ÿฌํ•œ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์—์„œ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์ธ ์—”ํ‹ฐํ‹ฐ(Member)์™€ ๋น„์ฃผ์ธ ์—”ํ‹ฐํ‹ฐ(Team)๋กœ ๊ตฌ๋ถ„๋˜์–ด ๊ตฌํ˜„๋œ๋‹ค.

์ผ๋Œ€๋‹ค(One-to-Many) ๊ด€๊ณ„

<๋‹จ๋ฐฉํ–ฅ>


์ฝ”๋“œ ๊ตฌ์„ฑ์„ ๋ณด๋ฉด Team ํด๋ž˜์Šค๊ฐ€ @OneToMany ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ Member๋“ค๊ณผ ์ผ๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•˜๊ณ  ์žˆ๋‹ค.
@JoinColumn(name = "TEAM_ID") ์–ด๋…ธํ…Œ์ด์…˜์€ members ๋ฆฌ์ŠคํŠธ๊ฐ€ TEAM_ID ์™ธ๋ž˜ ํ‚ค๋ฅผ ํ†ตํ•ด Member๋“ค๊ณผ ์—ฐ๊ด€๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
List< Member > members ํ•„๋“œ๋ฅผ ํ†ตํ•ด Team ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ Member ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ์ฒด ์—ฐ๊ด€๊ด€๊ณ„

Team ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ Member ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐ๋˜๋ฉฐ, ์ด ๊ด€๊ณ„๋Š” ๋‹จ๋ฐฉํ–ฅ์ด๋‹ค. ์ฆ‰, Team์€ Member๋“ค์„ ์ฐธ์กฐํ•˜์ง€๋งŒ, Member๋Š” Team์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
๊ด€๊ณ„๊ฐ€ ๋‹จ๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์— Member ๊ฐ์ฒด์—์„œ๋Š” Team์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†๋‹ค.

ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ TEAM_ID๋Š” MEMBER ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค๋กœ ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Member๊ฐ€ ์–ด๋–ค Team์— ์†ํ•ด ์žˆ๋Š”์ง€๋Š” MEMBER ํ…Œ์ด๋ธ”์˜ TEAM_ID ์ปฌ๋Ÿผ์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋œ๋‹ค.

  • ์ฃผ์˜์‚ฌํ•ญ
    <์™ธ๋ž˜ ํ‚ค ๊ด€๋ฆฌ>
    @JoinColumn์„ ํ†ตํ•ด ์ง€์ •๋œ ์™ธ๋ž˜ ํ‚ค๋Š” ๋ฐ˜๋“œ์‹œ MEMBER ํ…Œ์ด๋ธ”์— ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด Team๊ณผ Member ๊ฐ„์˜ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์„ค์ •๋œ๋‹ค.
    team.getMembers().add(member) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด, Member์˜ TEAM_ID ํ•„๋“œ๊ฐ€ null๋กœ ์ €์žฅ๋˜์–ด ๊ด€๊ณ„๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค.

    <Update ์ฟผ๋ฆฌ ๋ฐœ์ƒ>
    Team ๊ฐ์ฒด์— Member ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์™ธ๋ž˜ ํ‚ค(TEAM_ID)๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ์ฃผ์˜ํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

    <์‹ค์ˆ˜๋กœ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„๋กœ ๋ณ€ํ™˜๋  ๊ฐ€๋Šฅ์„ฑ>
    ๋งŒ์•ฝ Member ๊ฐ์ฒด๊ฐ€ Team ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ๋‹จ๋ฐฉํ–ฅ์—์„œ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ Member ํด๋ž˜์Šค์— Team ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  @ManyToOne ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

    ์ด ๊ตฌ์กฐ๋Š” Team ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ Member ๊ฐ์ฒด์™€ ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋„๋ก ์„ค์ •ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์—์„œ ์™ธ๋ž˜ ํ‚ค๋Š” MEMBER ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋ฉฐ, ์ด ๊ด€๊ณ„๋Š” ๊ฐ์ฒด ๋ชจ๋ธ์—์„œ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋‹จ์ˆœํ•˜์ง€๋งŒ, ์™ธ๋ž˜ ํ‚ค ๊ด€๋ฆฌ ๋ฐ ์—…๋ฐ์ดํŠธ ์ฟผ๋ฆฌ์— ์ฃผ์˜ํ•ด์•ผ ํ•˜๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

<์–‘๋ฐฉํ–ฅ>

์ฝ”๋“œ๊ตฌ์„ฑ์„ ๋ณด๋ฉด Member ํด๋ž˜์Šค๋Š” Team ํด๋ž˜์Šค์™€ ๋‹ค๋Œ€์ผ(Many-to-One)๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ, @ManyToOne ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ด๋ฅผ ์„ค์ •ํ•œ๋‹ค.
@JoinColumn(name = "TEAM_ID") ์–ด๋…ธํ…Œ์ด์…˜์€ Member ํ…Œ์ด๋ธ”์—์„œ ์™ธ๋ž˜ ํ‚ค๋กœ TEAM_ID๋ฅผ ์‚ฌ์šฉํ•จ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
insertable = false, updatable = false ์„ค์ •์€ ์ด ํ•„๋“œ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œํ•œ๋‹ค. ์ด๋Š” ํ•ด๋‹น ๊ด€๊ณ„๊ฐ€ ์–‘๋ฐฉํ–ฅ์ด์ง€๋งŒ, ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•œ์ชฝ์—์„œ๋งŒ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•˜๋ ค๋Š” ๋ชฉ์ ์ด๋‹ค.

๊ฐ์ฒด ์—ฐ๊ด€๊ด€๊ณ„

Team๊ณผ Member ๊ฐ„์˜ ๊ด€๊ณ„๋Š” ์–‘๋ฐฉํ–ฅ์ด๋‹ค. Team ํด๋ž˜์Šค๋Š” List< Member > ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ Member ๊ฐ์ฒด๋“ค์„ ์ฐธ์กฐํ•˜๊ณ , Member ํด๋ž˜์Šค๋Š” Team ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
์ฆ‰, Member๊ฐ€ ์–ด๋Š Team์— ์†ํ•˜๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, Team๋„ ์ž์‹ ์—๊ฒŒ ์†ํ•œ Member๋“ค์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” MEMBER ํ…Œ์ด๋ธ”์ด TEAM_ID ์™ธ๋ž˜ ํ‚ค๋ฅผ ํ†ตํ•ด TEAM ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ์ด ์™ธ๋ž˜ ํ‚ค๋Š” Member ์—”ํ‹ฐํ‹ฐ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์ง€๋งŒ, ํ•ด๋‹น ํ•„๋“œ๋Š” ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •๋˜์–ด์žˆ๋‹ค.

์ผ๋Œ€๋‹ค ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„๋Š” Team์ด ์—ฌ๋Ÿฌ Member๋ฅผ ์ฐธ์กฐํ•˜๊ณ , Member๋„ Team์„ ์ฐธ์กฐํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด ๊ด€๊ณ„์—์„œ Member ์ชฝ์—์„œ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜์ง€๋งŒ, ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ํŠน์ • ์ƒํ™ฉ์—์„œ ๊ด€๊ณ„๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๋˜, ์™ธ๋ž˜ ํ‚ค ๊ด€๋ฆฌ๋ฅผ ํ•œ์ชฝ์—์„œ๋งŒ ์ฑ…์ž„์ง€๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋Œ€๋‹ค(Many-to-Many) ๊ด€๊ณ„


๊ฐ์ฒด ์—ฐ๊ด€๊ด€๊ณ„

๊ฐ์ฒด ๋ชจ๋ธ์—์„œ๋Š” Member์™€ Product ๊ฐ„์˜ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ List< Product >์™€ List< Member >๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Member๋Š” ์—ฌ๋Ÿฌ Product๋ฅผ, Product๋Š” ์—ฌ๋Ÿฌ Member๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
@ManyToMany ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ณ , @JoinTable ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”(MEMBER_PRODUCT)์„ ์„ค์ •ํ•˜์—ฌ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ์ง์ ‘์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”(์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”)์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์€ ๋‘ ์—”ํ‹ฐํ‹ฐ์˜ ์™ธ๋ž˜ ํ‚ค๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๊ฐ๊ฐ์˜ ์™ธ๋ž˜ ํ‚ค๋Š” ์–‘์ชฝ ์—”ํ‹ฐํ‹ฐ์™€ ์ผ๋Œ€๋‹ค[1:N]๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค.
์˜ˆ์‹œ์—์„œ๋Š” Member_Product๋ผ๋Š” ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด MEMBER์™€ PRODUCT ๊ฐ„์˜ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.

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

๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋Š” ๋‘ ์—”ํ‹ฐํ‹ฐ ๊ฐ„์˜ ๋‹ค๋Œ€๋‹ค ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๊ตฌ์กฐ๋กœ, ์ด๋ฅผ ์œ„ํ•ด ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ๊ฐ์ฒด ๋ชจ๋ธ์—์„œ๋Š” @ManyToMany ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์‹ค๋ฌด์—์„œ๋Š” ์ด๋ฅผ ๋‹ค๋Œ€์ผ ๊ด€๊ณ„๋กœ ํ’€์–ด๋‚ด์–ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.


์š”์•ฝ

์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์—์„œ ์—”ํ‹ฐํ‹ฐ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ณ , ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ๊ณผ ์ผ์น˜์‹œ์ผœ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠนํžˆ, ์ ์ ˆํ•œ ๋งคํ•‘ ์„ค๊ณ„๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. ์ž˜๋ชป๋œ ๋งคํ•‘์€ ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ ๋ฐœ์ƒ์ด๋‚˜ N+1 ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์˜ฌ๋ฐ”๋ฅธ ๋งคํ•‘์€ ์ฟผ๋ฆฌ์˜ ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์€ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์•ˆ์ •์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
ํ˜๋Ÿฌ๊ฐ€๋˜ ์›ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ

0๊ฐœ์˜ ๋Œ“๊ธ€