JiwonDev

#2 ํ”„๋กœ์ ํŠธ ๊ธฐํš & ๋„๋ฉ”์ธ ์„ค๊ณ„

by JiwonDev

ํ•ด๋‹น ๊ธ€์€ ๊น€์˜ํ•œ๋‹˜์˜ ์‹ค์ „ ์ŠคํŠธ๋ง ๋ถ€ํŠธ 1๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

#ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐํšํ•ด๋ณด์ž

ํ‰๋ฒ”ํ•œ ์‡ผํ•‘๋ชฐ, HELLO SHOP์„ ๋งŒ๋“ค ์˜ˆ์ •์ด๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํšŒ์›์ด ์ƒํ’ˆ์„ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๊ณ  ํŒ๋งค์ž๊ฐ€ ์ƒํ’ˆ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.  ์—ฌ๊ธฐ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ชฉ๋ก์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด์ž.

ํ”„๋กœํ† ํƒ€์ž…

1. ๋„๋ฉ”์ธ ํšŒ์›(Member)
์ƒํ’ˆ(Item)
์ฃผ๋ฌธ(Order)
2. ํšŒ์›๊ธฐ๋Šฅ ํšŒ์› ๋“ฑ๋ก
ํšŒ์› ์กฐํšŒ
3. ์ƒํ’ˆ๊ธฐ๋Šฅ ์ƒํ’ˆ ๋“ฑ๋ก
์ƒํ’ˆ ์ˆ˜์ •
์ƒํ’ˆ ์กฐํšŒ
4. ์ฃผ๋ฌธ๊ธฐ๋Šฅ ์ƒํ’ˆ ์ฃผ๋ฌธ
์ฃผ๋ฌธ ๋‚ด์—ญ ์กฐํšŒ
์ฃผ๋ฌธ ์ทจ์†Œ
5. ์š”๊ตฌ์‚ฌํ•ญ ์ƒํ’ˆ์€ ์žฌ๊ณ  ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
์ƒํ’ˆ์˜ ์ข…๋ฅ˜๋Š” ๋„์„œ, ์Œ๋ฐ˜, ์˜ํ™”๊ฐ€ ์žˆ๋‹ค.
์ƒํ’ˆ์„ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ƒํ’ˆ ์ฃผ๋ฌธ์‹œ ๋ฐฐ์†ก ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

* ์š”๊ตฌ์‚ฌํ•ญ์„ ์ƒ์„ธํ•˜๊ฒŒ ์ ์„ ์ˆ˜๋ก ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.


# ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค์–ด๋ณด์ž

Kakao Oven์ด๋‚˜ ๊ธฐํƒ€ ํ”„๋กœํ† ํƒ€์ž… ํˆด์„ ์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ํ™”๋ฉด์„ ๊ทธ๋ ค๋ณด์ž.

ํƒˆํ‡ด & ์ค‘๋ณตํšŒ์›์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€?
์ƒํ’ˆ๋“ฑ๋ก๊ณผ ์ˆ˜์ •
์ฃผ๋ฌธ์€ ํ™•์ • ์ „ ์ทจ์†Œ๊ฐ€๋Šฅ


# ๋„๋ฉ”์ธ๊ณผ ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•ด๋ณด์ž.

ํ•ด๋‹น ๋ถ€๋ถ„์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋ฅผ ๋ฐฐ์šฐ๋ฉด ์ž์„ธํ•˜๊ฒŒ ์•Œ๊ฒŒ๋œ๋‹ค. ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋”๋ผ๋„ ์ผ๋‹จ ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ฐฐ์›Œ๋ณด์ž.

 

@ ๋„๋ฉ”์ธ์˜ ๊ด€๊ณ„์™€ ์ œ์•ฝ์กฐ๊ฑด

DB ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ด€๊ณ„์™€ ์ œ์•ฝ์กฐ๊ฑด์„ ํŒŒ์•…ํ•ด๋ณด์ž.

  • ํšŒ์›์€ ์—ฌ๋Ÿฌ ์ƒํ’ˆ์„ ์ฃผ๋ฌธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ๋ฒˆ ์ฃผ๋ฌธํ•  ๋•Œ ์—ฌ๋Ÿฌ ์ƒํ’ˆ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. [ํšŒ์›<->์ฃผ๋ฌธ<->์ƒํ’ˆ]์ด N:N ๊ด€๊ณ„์ด๋ฏ€๋กœ, ์ค‘๊ฐ„์— '์ฃผ๋ฌธ ์ƒํ’ˆ'์ด๋ผ๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ 1:N ๊ด€๊ณ„๋กœ ๋ฐ”๊ฟ”์ฃผ์ž.
  • ์ƒํ’ˆ์€ ๋„์„œ, ์Œ๋ฐ˜, ์˜ํ™”๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์ง€๋งŒ, ๊ณตํ†ต ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ƒ์† ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ํ–ˆ๋‹ค.


@ ๋„๋ฉ”์ธ ์„ค๊ณ„

  • ํšŒ์›(Member): ๊ณ ์œ ๊ฐ’(id), ์ด๋ฆ„(name), ์ฃผ์†Œ(Address), ์ฃผ๋ฌธ ๋ฆฌ์ŠคํŠธ(orders)๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์ฃผ์†Œ(Address): ๊ฐ’ํƒ€์ž…(=์ž„๋ฒ ๋””๋“œ ํƒ€์ž…)์ด๋‹ค. ๋„์‹œ(city), ๋„๋กœ๋ช…(street), ์šฐํŽธ๋ฒˆํ˜ธ(zipcode)๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ๋ฐฐ์†ก(Delivery): ๊ณ ์œ ๊ฐ’(id), ํ•ด๋‹น ์ฃผ๋ฌธ(Order), ์ฃผ์†Œ(Address), ๋ฐฐ์†ก์ƒํƒœ(DeliveryStatus)๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์นดํ…Œ๊ณ ๋ฆฌ(Category): ๊ณ ์œ ๊ฐ’(id), ์นดํ…Œ๊ณ ๋ฆฌ๋ช…(name), ํ•ด๋‹น ์ƒํ’ˆ๋ฆฌ์ŠคํŠธ(items), ๋ถ€๋ชจ ์นดํ…Œ๊ณ ๋ฆฌ(Parent), ์ž์‹ ์นดํ…Œ๊ณ ๋ฆฌ ๋ฆฌ์ŠคํŠธ(child)๋ฅผ ๊ฐ€์ง„๋‹ค.

  • ์ƒํ’ˆ(Item): ๊ณ ์œ ๊ฐ’(id), ์ƒํ’ˆ๋ช…(name), ๊ฐ€๊ฒฉ(Price), ์žฌ๊ณ ์ˆ˜๋Ÿ‰(StockQuantity), ์นดํ…Œ๊ณ ๋ฆฌ(List)๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์ฃผ๋ฌธ์ƒํ’ˆ(OrderItem): ๊ณ ์œ ๊ฐ’(id), ์ƒํ’ˆ(item), ์ฃผ๋ฌธ(Order), ์ฃผ๋ฌธ๊ธˆ์•ก(orderPrice), ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰(count)์„ ๊ฐ€์ง„๋‹ค.
  • ์ฃผ๋ฌธ(Order): ๊ณ ์œ ๊ฐ’(id), ์ฃผ๋ฌธ ํšŒ์›(Member), ์ฃผ๋ฌธ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ(OrderItems), ๋ฐฐ์†ก์ •๋ณด(Delivery), ์ฃผ๋ฌธ๋‚ ์งœ(OrderData), ์ฃผ๋ฌธ์ƒํƒœ(OrderStatus)๋ฅผ ๊ฐ€์ง„๋‹ค.

์ด๋ ‡๊ฒŒ ์ •์˜๋ฅผ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด, ๊ฐ์ฒด(์—”ํ‹ฐํ‹ฐ)๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ…Œ์ด๋ธ”๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž.

์ฐธ๊ณ ๋กœ Order๋Š” DB์˜ [Order by]๋ž‘ ๊ฒน์ณ์„œ Orders๋ผ๊ณ  ์ ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

 


@ [๊ฐ์ฒด ๊ด€๊ณ„ -> DB ํ…Œ์ด๋ธ”] ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘

์œ„์—์„œ ์ •์˜ํ•œ ๋„๋ฉ”์ธ๋“ค๋กœ ํ…Œ์ด๋ธ” ๊ด€๊ณ„๋ฅผ ๋Œ€๋žต์ ์œผ๋กœ ๊ทธ๋ ค๋ณด๊ณ , ๊ด€๊ณ„๋งˆ๋‹ค ํŠน์ง•๊ณผ ๋ฌธ์ œ์ ์ด ์žˆ๋Š”์ง€ ๋ถ„์„ํ•ด๋ณด์ž

์ฐธ๊ณ ๋กœ DB์— Order by๋ผ๋Š” ์˜ˆ์•ฝ์–ด๊ฐ€ ์žˆ์–ด, Order์— s๋ฅผ ๋ถ™์ธ๋‹ค.

* ํ•ด๋‹น ์˜ˆ์ œ๋Š” ๋‚œ์ด๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ์œ„ํ•ด ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ…Œ์ด๋ธ”์„ ์ž‘์„ฑํ•˜์˜€๋‹ค. ๋งŒ์•ฝ ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋” ๊นŠ๊ฒŒ ์‚ดํŽด๋ณด์•„์•ผํ•œ๋‹ค. ํ•œ๊ฐ€์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณธ๋‹ค๋ฉด ์ฃผ๋ฌธ<->ํšŒ์›๊ฐ„์˜ ๊ด€๊ณ„์—์„œ ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด 'ํšŒ์›์ด ์ฃผ๋ฌธ์„ ํ•˜๋‹ˆ๊นŒ, orders๋ฅผ ๊ฐ€์ง€๋ฉด ๋˜๊ฒ ๊ตฌ๋‚˜!' ๋ผ๊ณ  ์ฐฉ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ์„œ๋น„์Šค๋Š” ํšŒ์›๊ณผ ์ฃผ๋ฌธ์€ ๋™๊ธ‰์ด๋‹ค.

๊ทธ ์ด์œ ๋Š” ํšŒ์›์„ ํ†ตํ•ด์„œ ์ฃผ๋ฌธ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฃผ๋ฌธ์„ ์ƒ์„ฑํ•  ๋•Œ ํšŒ์›์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Š” ๊ฐœ๋…์ ์œผ๋กœ๋„, ์ฟผ๋ฆฌ๋ฌธ์˜ ๋™์ž‘๋ฐฉ์‹๋„ ์ด๋Ÿฌํ•˜๋‹ค. ์ฆ‰ ์‚ฌ์‹ค์ƒ ํšŒ์›๊ณผ ์ฃผ๋ฌธ์˜ 1:N ๊ด€๊ณ„๋Š” ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ทธ ์™ธ์—๋„ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์Šคํ”„๋ง ์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด์ง€, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์—…์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ผ๋‹จ ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž.
  • ํšŒ์›(Member) <-> ์ฃผ๋ฌธ(Orders)
    1:N, N:1์˜ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„์ด๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์™ธ๋ž˜ํ‚ค๊ฐ€ ์žˆ๋Š” ์ฃผ๋ฌธ์„ ์ฃผ์ธ์œผ๋กœ ์ •ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ Order.member๋ฅผ ORDERS.MEMBER_ID ์™ธ๋ž˜ํ‚ค์™€ ๋งคํ•‘ํ•œ๋‹ค.
  • ์ฃผ๋ฌธ(Orders) <-> ์ฃผ๋ฌธ์ƒํ’ˆ(Order_Item)
    ์ฃผ๋ฌธ์ƒํ’ˆ๊ณผ ์ฃผ๋ฌธ์€ 1:N ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„์ด๋‹ค. ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์ฃผ๋ฌธ์ƒํ’ˆ์— ์žˆ์œผ๋ฏ€๋กœ ์ฃผ๋ฌธ์ƒํ’ˆ์ด ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด๋‹ค. ์ฆ‰ OrderItem.order๋ฅผ ORDER_ITEM.ORDER_ID์™€ ๋งคํ•‘ํ•œ๋‹ค.

  • ์ฃผ๋ฌธ์ƒํ’ˆ(Order_Item)๊ณผ ์ƒํ’ˆ(Item)
    ๋‹ค๋Œ€์ผ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„์ด๋‹ค. OrderItem.item ์„ ORDER_ITEM.ITEM_ID ์™ธ๋ž˜ ํ‚ค์™€ ๋งคํ•‘ํ•œ๋‹ค.
  • ์ฃผ๋ฌธ(Orders)๊ณผ ๋ฐฐ์†ก(Delivery)
    ์ผ๋Œ€์ผ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„์ด๋‹ค. Oder.delivery ๋ฅผ ORDERS.DELIVERY_ID ์™ธ๋ž˜ํ‚ค์™€ ๋งคํ•‘ํ•œ๋‹ค.

  • ์นดํ…Œ๊ณ ๋ฆฌ(Category)์™€ ์ƒํ’ˆ(Item)
    ์นดํ…Œ๊ณ ๋ฆฌ์™€ ์ƒํ’ˆ๋„ N:N ๊ด€๊ณ„๋ฏ€๋กœ, ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑํ•ด 1:N๊ด€๊ณ„๋กœ ํ’€์–ด์•ผํ•œ๋‹ค.
    ํ•˜์ง€๋งŒ N:N ๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์–ด๋– ํ•œ ๋ฌธ์ œ์ ์ด ์ƒ๊ธฐ๋Š”์ง€ ๋ณด์—ฌ์ค„๋ ค๊ณ  ์ผ๋ถ€๋Ÿฌ @ManyToMany๋ฅผ ์‚ฌ์šฉํ•ด ๋งคํ•‘ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ์ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์™œ ์‹ค๋ฌด์—์„œ N:N ๊ด€๊ณ„๋ฅผ 1:N ์œผ๋กœ ์ชผ๊ฐœ์•ผํ•˜๋Š”์ง€ ๋ฐฐ์›Œ๋ณด์ž.

์™œ ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ณณ์„ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์œผ๋กœ ์ •ํ•˜๋‚˜์š”?

๋”๋ณด๊ธฐ
์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์€ ๋‹จ์ˆœํžˆ '์™ธ๋ž˜ ํ‚ค๋ฅผ ๋ˆ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€?' ๋ฌธ์ œ์ด์ง€ ๋น„์ฆˆ๋‹ˆ์Šค์ƒ ์ƒ์œ„ ๊ฐœ๋…์ด๋ผ๊ณ  ์ฃผ์ธ์œผ๋กœ ์ •ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋™์ฐจ์™€ ๋ฐ”ํ€ด๊ฐ€ ์žˆ๋‹ค๋ฉด 1:N ๊ด€๊ณ„์—์„œ ํ•ญ์ƒ N์ชฝ์— ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ๋Š” ๋ฐ”ํ€ด๋ฅผ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์œผ๋กœ ์ •ํ•˜๋ฉด ๋œ๋‹ค. ๋ฌผ๋ก  ์ž๋™์ฐจ๋ฅผ ์ฃผ์ธ์œผ๋กœ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•œ๋‹ค๋ฉด ์ž๋™์ฐจ๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋ฐ”ํ€ด ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋˜๋ฏ€๋กœ ๊ด€๋ฆฌ์™€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค. ๋˜ํ•œ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ณ„๋„์˜ ์—…๋ฐ์ดํŠธ ์ฟผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์—ฌ ์„ฑ๋Šฅ๋ฌธ์ œ๋„ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.

์ด๋Š” Database์™€ JPA๋ฅผ ํ•™์Šตํ•˜๊ฒŒ๋˜๋ฉด ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃจ๋‹ˆ, ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋‹ค ํ•˜๋”๋ผ๋„ ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž.

 


# ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๊ฐœ๋ฐœ

์ด์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ์„ค๊ณ„๋ฅผ ๋งˆ์ณค๋‹ค. ํ…Œ์ด๋ธ”์„ ๋ฐ”ํƒ•์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž. ์Šคํ”„๋ง์—์„œ๋Š” @Entity ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์—”ํ‹ฐํ‹ฐ์ž„์„ ์•Œ๋ฆฐ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ฟผ๋ฆฌ๋ฌธ์„ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค.

 

- ์ƒ๋žต - (์ถ”ํ›„์— ๊นƒํ—ˆ๋ธŒ ์—…๋กœ๋“œ ์˜ˆ์ •)

 


# ์—”ํ‹ฐํ‹ฐ ์„ค๊ณ„์‹œ ์ฃผ์˜์ 

@ManyToMany๋Š” ์‚ฌ์šฉํ•  ์ผ์ด ์—†๋‹ค.

์™œ ๊ทธ๋Ÿฐ์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณต๋ถ€๋ฅผ ํ•˜๊ฒŒ๋˜๋ฉด ์ง€๊ฒน๋„๋ก ๋“ค์„ ์ˆ˜ ์žˆ๋‹ค. ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ ๋‘˜๋‹ค ๋งํ•ด๋ฒ„๋ฆฌ๋‹ˆ ์ ˆ๋Œ€๋กœ ์“ฐ์ง€๋ง์ž.


@ RDB์— ์—ฐ๊ฒฐํ•  ID๋Š” ์ด๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์ฃผ์ž.

๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ƒ๊ด€์—†์ง€๋งŒ DB์—์„œ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์ด๋ฆ„์ด ํ—ท๊ฐˆ๋ ค ์กฐ์ธํ•  ๋•Œ ๊ท€์ฐฎ์•„์ง„๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด [tableName_id] ์ด๋Ÿฐ์‹์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์ž.

public class Member {

    @Id
    @GeneratedValue
    @Column(name = "member_id") // id ๋Œ€์‹  member_id ์‚ฌ์šฉ
    private Long id;
}

@ ์—”ํ‹ฐํ‹ฐ์—๋Š” ๊ฐ€๊ธ‰์  Setter๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋ง์ž.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์•„๋‹Œ Setter๋กœ ๋ณ€๊ฒฝํ•˜๊ฒŒ๋˜๋ฉด ๋ณ€๊ฒฝ ํฌ์ธํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค. ๋‚˜์ค‘์— ๋ฆฌํŽ™ํ† ๋ง์œผ๋กœ Setter๋ฅผ ์ œ๊ฑฐํ•ด์ฃผ๋„๋ก ํ•˜์ž. ๋ฌผ๋ก  Getter๋Š” ๋‹จ์ˆœ ์กฐํšŒ์ด๊ธฐ์— ๊ทธ๋ ‡๊ฒŒ๊นŒ์ง€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๋Š” ์—†๋‹ค.

 

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


@ ๋ชจ๋“  ์—ฐ๊ด€๊ด€๊ณ„๋Š” ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ์„ค์ •ํ•˜์ž.

  • ์ฆ‰์‹œ๋กœ๋”ฉ( EAGER )์€ ์˜ˆ์ธก์ด ์–ด๋ ต๊ณ , ์–ด๋–ค SQL์ด ์‹คํ–‰๋ ์ง€ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ทธ๋‚˜๋งˆ JPA ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์ž์ฒด์ ์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ œ๊ณตํ•ด์ฃผ์ง€๋งŒ JPQL์„ ์‹คํ–‰ํ•  ๋•Œ๋Š” N+1 ๋ฌธ์ œ๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค. 
  • N+1 ๋ฌธ์ œ๋ž€, ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ ์ˆ˜(N)๋งŒํผ ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ๋‚ ๋ฆฌ๋Š” ๋ฌธ์ œ์ด๋‹ค.
  • ๊ทธ๋ž˜์„œ ์‹ค๋ฌด์—์„œ ๋ชจ๋“  ์—ฐ๊ด€๊ด€๊ณ„๋Š” ์ง€์—ฐ๋กœ๋”ฉ( LAZY )์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•จ๊ป˜ DB์—์„œ ์กฐํšŒํ•ด์•ผ ํ•˜๋ฉด, fetch join ๋˜๋Š” ์—”ํ‹ฐํ‹ฐ ๊ทธ๋ž˜ํ”„ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ์˜ค๋Š” @XToOne(OneToOne, ManyToOne) ๊ด€๊ณ„๋Š” ๊ธฐ๋ณธ์ด ์ฆ‰์‹œ๋กœ๋”ฉ์ด๋ฏ€๋กœ ์ง์ ‘ ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
    javax.persistence.FetchType.LAZY

@ ์ปฌ๋ ‰์…˜์€ ํ•„๋“œ์—์„œ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์†๋Œ€์ง€๋ง์ž

์ƒ์„ฑ์ž X ์ˆ˜์ •์ž X ํ•„๋“œ O, ๋ฉ”๋ชจ๋ฆฌ ์•„๊นŒ์›Œํ•˜์ง€ ๋ง์ž.

null ๋ฌธ์ œ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์ž. ํ•˜์ด๋ฒ„๋„ค์ดํŠธ(JPA)๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†ํ™” ํ•  ๋•Œ ์ปฌ๋ ‰์…˜์„ ๊ฐ์‹ธ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ์˜ ๋‚ด์žฅ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ž„์˜์˜ ๋ฉ”์„œ๋“œ์—์„œ ์ปฌ๋ ‰์…˜์„ ์ž˜๋ชป ์ƒ์„ฑํ•˜๊ฒŒ๋˜๋ฉด ์˜์†ํ™” ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

Member member = new Member();
System.out.println(member.getOrders().getClass()); // class java.util.ArrayList
em.persist(team); // ์˜์†ํ™”. ArrayList -> ๊ฐ์‹ธ๋ฒ„๋ฆผ.
System.out.println(member.getOrders().getClass()); // class ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๋‚ด์žฅ ์ปฌ๋ ‰์…˜

//์ถœ๋ ฅ ๊ฒฐ๊ณผ
class java.util.ArrayList
class org.hibernate.collection.internal.PersistentBag

@ ํ…Œ์ด๋ธ”, ์นผ๋Ÿผ๋ช… ์ƒ์„ฑ ๊ทœ์น™

์Šคํ”„๋ง๋ถ€ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๊ธฐ๋ณธ ๋งคํ•‘์ „๋žต์ด ๋ณ€๊ฒฝ๋œ๋‹ค. ์ฆ‰ ์‹ค์ œ ํ…Œ์ด๋ธ” ํ•„๋“œ๋ช…์ด ๋‹ค๋ฅด๋‹ค. ( ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ๋ช…์„ ๊ทธ๋Œ€๋กœ ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ๋ช…์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.)

์ž๋ฐ”์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜ ๊ทœ์น™์„ DB์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

๋งŒ์•ฝ ํšŒ์‚ฌ์—์„œ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด spring.jpa.hibernate.naming.physical-strategy ํด๋ž˜์Šค๋ฅผ ๋ณด๊ณ  ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

// ์Šคํ”„๋ง๋ถ€ํŠธ ์„ค์ •

// ํ…Œ์ด๋ธ” ์ด๋ฆ„์ด ์ ํ˜€์žˆ์ง€ ์•Š์•˜์„ ๋•Œ ๊ทœ์น™
spring.jpa.hibernate.naming.implicit-strategy:// ์ด๋ ‡๊ฒŒ ํด๋ž˜์Šค๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy

// ๋ชจ๋“  ์ด๋ฆ„์— ์ ์šฉ๋˜๋Š” ๊ทœ์น™ ๊ทœ์น™
spring.jpa.hibernate.naming.physical-strategy:
org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ