๐ ์ค๋ ๋ฐฐ์ด ๋ด์ฉ!
- DDD (Domain Driven Design)
- ์ ๊ทธ๋ฆฌ๊ฑฐํธ (Aggregate)
- ํ์ด์ง๋ค์ด์
- n+1 ๋ฌธ์
โ๏ธ DDD (Domain Driven Design)
- ๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ณ๋ฅผ ์ํ ๋๋ฉ์ธ ์์ฃผ์ ์ค๊ณ ๊ธฐ๋ฒ
- ๋ชจ๋ ๊ธฐ๋ฅ์ ๋๋ฉ์ธ ๋ชจ๋ธ ์์ฃผ๋ก ๋์๊ฐ๊ฒ ์ค๊ณํ๋ ๊ธฐ๋ฒ
โ๏ธ ๋๋ฉ์ธ (Domain)
- ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ํ์ค ์ธ๊ณ์์ ์ ํ๋ ์ ๋ฌด์ ํ ์์ญ ( ๋น์ฆ๋์ค์ ์ธ ์ด๋ค ์ ๋ฌด ์์ญ )
- ๋๋ฉ์ธ ์ง์(Domain Knoledge)๋ค์ ์๋น์ค ๊ณ์ธต์์ ๋น์ฆ๋์ค ๋ก์ง์ผ๋ก ๊ตฌํํด์ผํจ
โ
Ex. ๋ฐฐ๋ฌ ์ฃผ๋ฌธ ์ฑ์ ์์ ์์ค ๋๋ฉ์ธ - ํ์ / ์ฃผ๋ฌธ / ์์ / ๊ฒฐ์ / ๋ฐฐ๋ฌ ๋ฑ
โ
์ด ์์์๋ ๋๋ฉ์ธ์ ํ์ ์์ค ๋๋ฉ์ธ์ผ๋ก ์ธ๋ถํํ ์ ์์ โฌ๏ธ
Ex. ์ฃผ๋ฌธ - ์ฃผ๋ฌธ์ ์ ๋ณด / ์ฃผ๋ฌธ ์ ๋ณด / ์์ ์ ๋ณด / ์ฃผ์ ์ ๋ณด ๋ฑ
โ๏ธ ๋๋ฉ์ธ ์ง์ (Domain Knoledge)
- ๊ทธ ๋๋ฉ์ธ์ ์ ๋ฌธํ๋ ๊ด๋ จ ์ง์
[์ฐธ๊ณ ] https://ko.wikipedia.org/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8_%EC%A3%BC%EB%8F%84_%EC%84%A4%EA%B3%84
โ๏ธ ๋น์ฝํ ๋๋ฉ์ธ ๋ชจ๋ธ vs ํ๋ถํ ๋๋ฉ์ธ ๋ชจ๋ธ
๋น์ฝ - Service ํด๋์ค์ ๊ธฐ๋ฅ ์ง์ค ๋์ด ์๊ณ , Entity ํด๋์ค์๋ ๊ธฐ๋ฅ์ด ์๊ณ ํ๋๋ง ์์
ํ๋ถ - Service ํด๋์ค์ ๊ธฐ๋ฅ์ด ์ถ์ ๋๊ณ , Entity ํด๋์ค์ ๊ธฐ๋ฅ์ด ๋ง์ด ๋ค์ด์์
โ๏ธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ (Aggregate)
- ๋น์ทํ ๋ฒ์ฃผ์ ์ฐ๊ด๋ ์
๋ฌด๋ค์ ํ๋๋ก ๊ทธ๋ฃนํ ํด๋์ ๋ฌถ์
(๋น์ทํ ์ ๋ฌด ๋๋ฉ์ธ๋ค์ ๋ฌถ์) - DDD(Domain-Driven Design)์ ํจํด
Ex. ๋ฐฐ๋ฌ ์ฃผ๋ฌธ ์ฑ์์ - ํ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ / ์ฃผ๋ฌธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ / ์์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ / ๊ฒฐ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฑ
( ํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์์๋ 1๊ฐ ์ด์์ ๋๋ฉ์ธ(ํ์ ์์ค ๋๋ฉ์ธ)๋ค์ด ์กด์ฌ )
โ๏ธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ (Aggregate Root)
- ๋ฃจํธ ์ํฐํฐ(Root Entity)๋ผ๊ณ ๋ ํจ
- ํ๋์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ๋ํํ๋ ๋๋ฉ์ธ
( ํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์์ 1๊ฐ ์ด์์ ๋๋ฉ์ธ๋ค ์ค์ ๊ทธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ๋ํํ ์ ์๋ ๋๋ฉ์ธ )
Ex. ์ํํธ(์ ๊ทธ๋ฆฌ๊ฑฐํธ)์ 1,2,3๋์ ๋๋ํ๋ค (์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ)
- ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ด์ ๋๋ฉ์ธ๋ค ์ค, ๋ค๋ฅธ ๋ชจ๋ ๋๋ฉ์ธ๋ค๊ณผ ์ง๊ฐ์ ์ ์ผ๋ก ์ฐ๊ด์ด ๋์ด ์๋ ๋๋ฉ์ธ๋ค
Ex.
- ํ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ
โ ํ์ ์ ๋ณด๊ฐ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ
( ํ์ ์ ๋ณด๋ฅผ ์์์ผ ๋ค๋ฅธ ๋๋ฉ์ธ๋ค(ํ์ ํฌ์ธํธ, ํ์ ๋ฑ๊ธ ๋ฑ)์ ์ ์ ์์ )
โ - ์ฃผ๋ฌธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ
โ ์ฃผ๋ฌธ ์ ๋ณด๊ฐ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ
( ์ฃผ๋ฌธ ์ ๋ณผ๋ฅด ์์์ผ ๋ค๋ฅธ ๋๋ฉ์ธ๋ค(์ฃผ๋ฌธ์, ์ฃผ๋ฌธ ์์ ๋ฑ)์ ์ ์ ์์ )
โ
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ๊ด๊ณ๋ก ๋ณด๋ฉด,
ํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ - ๋ถ๋ชจ ํ ์ด๋ธ / ๋ค๋ฅธ ๋๋ฉ์ธ๋ค - ์์ ํ ์ด๋ธ
- ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ(Aggregate Root)์ ๊ธฐ๋ณธํค ์ ๋ณด๋ฅผ ๋ค๋ฅธ ๋๋ฉ์ธ๋ค์ด ์ธ๋ํค ํํ๋ก ๊ฐ์ง๊ณ ์์
( ๊ทธ๋์ผ ์ง๊ฐ์ ์ ์ผ๋ก ์ ๋ณด๋ฅผ ๋นผ์ ์ํ๋ ์ ๋ณด๋ฅผ ์ ์ ์์ผ๋๊น )
Ex. ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ A ํ ์ด๋ธ / B ํ ์ด๋ธ์ด ์์ ๋,
A ํ ์ด๋ธ์ ๊ธฐ๋ณธํค๋ฅผ B ํ ์ด๋ธ์ด ๊ฐ์ง๊ณ ์๋ค๋ฉด,
A = ๋ถ๋ชจ ํ ์ด๋ธ / B = ์์ ํ ์ด๋ธ
โ ์ฌ๊ธฐ์ ์์ ํ ์ด๋ธ(B)์ด ๊ฐ์ง๊ณ ์๋ A ํ ์ด๋ธ์ ๊ธฐ๋ณธํค = ์ธ๋ํค
๐ผ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๊ฐ ๊ด๊ณ ์์
ํ๋ก์ ํธ ์ค์ต์์ ํ์
/ ์ฃผ๋ฌธ
/ ์ปคํผ
์ ๊ทธ๋ฆฌ๊ฑฐํธ๊ฐ ์๊ณ , ๊ทธ ๊ฐ๊ฐ์ ํ์ ์ ๋ณด
(์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ), ์ฃผ๋ฌธ ์ ๋ณด
(์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ) / ์ฃผ๋ฌธ ์ปคํผ ์ ๋ณด
, ์ปคํผ ์ ๋ณด
(์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ)๊ฐ ์๋ค.
์ด๋ฅผ ์์๋ก ์๊ฐํด๋ณด๋ฉด,
โ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์์ ๊ฐ๊ฐ์ ๊ด๊ณ ( ์ธ๋ํค๋ฅผ ํตํด )
( ์์์ ํ์ํ ๊ฒ์ด ์ธ๋ํค(Foreign Key)๊ฐ ๋๋ ๊ฒ )
โ ํ ์ด๋ธ ์ด๋ฆ์ ๋๋ฌธ์๋ก ํ ๊ฒฝ์ฐ, ORDER๋ ์ฌ์ฉ ๋ถ๊ฐ
( ์ฟผ๋ฆฌ๋ฌธ์ ORDER BY ์์ฝ์ด์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ )
โ ORDERS ์ฌ์ฉํด์ผํจ
- ํ์ ์ ๋ณด (Member) - ์ฃผ๋ฌธ ์ ๋ณด (Orders)์ ๊ด๊ณ ๐ 1 ๋ N
( ํ ๋ช ์ ํ์์ ์ฌ๋ฌ ๋ฒ ์ฃผ๋ฌธ ๊ฐ๋ฅ ) - ์ฃผ๋ฌธ ์ ๋ณด (Orders) - ์ปคํผ ์ ๋ณด (Coffee)์ ๊ด๊ณ ๐ N ๋ N
โ ํ๋ช ์ด ์ฌ๋ฌ ์ข ๋ฅ์ ์ปคํผ ์ํค๊ธฐ ๊ฐ๋ฅ
( ํ๋์ ์ฃผ๋ฌธ์ด ์ฌ๋ฌ ์ข ๋ฅ์ ์ปคํผ ํฌํจ ๊ฐ๋ฅ )
โ ํ ์ปคํผ๋ฅผ ์ฌ๋ฌ๋ช ์ด ์ํค๊ธฐ ๊ฐ๋ฅ
( ํ๋์ ์ปคํผ๊ฐ ์ฌ๋ฌ ๊ฑด์ ์ฃผ๋ฌธ์ ํฌํจ ๊ฐ๋ฅ )
โ ์์ N ๋ N ๊ด๊ณ๋ ์กฐ์ธํ ์ด๋ธ(์ฃผ๋ฌธ ์ปคํผ ์ ๋ณด)์ ๋ฃ์ด ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํ ์ ์์ ! โฌ๏ธ
- ์ฃผ๋ฌธ ์ ๋ณด (Orders) - ์ฃผ๋ฌธ ์ปคํผ ์ ๋ณด (Order_Coffee) ๐ 1 ๋ N
- ์ฃผ๋ฌธ ์ปคํผ ์ ๋ณด (Order_Coffee) - ์ปคํผ ์ ๋ณด (Coffee) ๐ N ๋ 1
( ์ฃผ๋ฌธ ์ ๋ณด(1) - ์ฃผ๋ฌธ ์ปคํผ ์ ๋ณด(N) - ์ปคํผ ์ ๋ณด(1) )
โ๏ธ ํด๋์ค์์ ๊ฐ๊ฐ์ ๊ด๊ณ ( ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํตํด )
- ํ์(Member) ์ํฐํฐ ํด๋์ค
โ 1์ ํด๋น๋๋ Member ํด๋์ค๋ N์ ํด๋น๋๋ Order ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก List<Order>๋ฅผ ๋ฉค๋ฒ ๋ณ์๋ก ์ถ๊ฐ
๐ก ์ List๋ฅผ ์ถ๊ฐํ ๊น?
์นดํ์์ ์ปคํผ๋ฅผ ์ฌ๋ฌ๋ฒ ์ฃผ๋ฌธํ ์ ์๋ฏ์ด, Member ํด๋์ค ์ญ์๋ ์ฌ๋ฌ๊ฐ์ Order ํด๋์ค ๊ฐ์ฒด๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ !
- ์ฃผ๋ฌธ(Order) ์ํฐํฐ ํด๋์ค
โ Order ๊ณผ Coffee ํด๋์ค์ N:N ๊ด๊ณ๋ฅผ ๊ฐ๊ฐ 1:N ์ผ๋ก ๋ง๋ค์ฃผ์ด,
1์ ํด๋น๋๋ Order ํด๋์ค๋ N์ ํด๋น๋๋ OrderCoffee ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋๋กList<OrderCoffee>
๋ฅผ ๋ฉค๋ฒ ๋ณ์๋ก ์ถ๊ฐ - ์ปคํผ(Coffee) ์ํฐํฐ ํด๋์ค
โ Coffee ์ Order ํด๋์ค์ N:N ๊ด๊ณ๋ฅผ ๊ฐ๊ฐ 1:N ์ผ๋ก ๋ง๋ค์ด์ฃผ์ด,
1์ ํด๋น๋๋ Coffee ํด๋์ค๋ N์ ํด๋น๋๋ OrderCoffee ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋๋กList<OrderCoffee>
๋ฅผ ๋ฉค๋ฒ ๋ณ์๋ก ์ถ๊ฐ - ์ฃผ๋ฌธ_์ปคํผ(OrderCofee) ํด๋์ค
โ Order ๊ณผ Coffee ํด๋์ค์ N:N ๊ด๊ณ๋ฅผ ๊ฐ๊ฐ 1:N ์ผ๋ก ๋ง๋ค์ด์ฃผ๋ OrderCoffee ํด๋์ค ์ถ๊ฐ
โ ์ฃผ๋ฌธํ๋ ์ปคํผ๊ฐ 1์ ์ด์์ผ ์ ์๊ธฐ ๋๋ฌธ์ quantity(์ฃผ๋ฌธ ์๋) ๋ฉค๋ฒ ๋ณ์ ์ถ๊ฐ
โ Spring Data JDBC๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์์ ์ค๊ณํ ๋๋ฉ์ธ ์ํฐํฐ ํด๋์ค์ ๊ด๊ณ๋ฅผ DDD(Domain Driven Design)์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ(Aggregate) ๋งคํ ๊ท์น์ ๋ง๊ฒ ํ๋ฒ ๋ ๋ณ๊ฒฝํด์ผํจ
โ๏ธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๊ฐ์ฒด ๋งคํ ๊ท์น
โ๏ธ 1. ๋ชจ๋ ์ํฐํฐ ๊ฐ์ฒด์ ์ํ๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๋ฅผ ํตํด์๋ง ๋ณ๊ฒฝ ( ํต์ฌ ๊ท์น )
Ex. ํ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ
์์ ํ์ ์ ๋ณด
(์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ)์ ํ์ ํฌ์ธํธ
๊ฐ ์๋ค๊ณ ํ ๋,ํ์ ํฌ์ธํธ
๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ํ์ ์ ๋ณด
๋ผ๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๋ฅผ ํตํด ํ์ ํฌ์ธํธ
์ ์ ๊ทผํ ๋ค, ๊ทธ์ ์ํ๋ฅผ ๋ณ๊ฒฝํด์ผํจ
๐ก ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๋ฅผ ํตํด์ ๋๋จธ์ง ์ํฐํฐ์ ์ ๊ทผํ๋ค
โ ์ด๋ค ์์ผ๋ก๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๊ฐ ๋๋จธ์ง ๋ชจ๋ ์ํฐํฐ์ ๋ํ ๊ฐ์ฒด๋ฅผ ์ง๊ฐ์ ์ ์ผ๋ก ์ฐธ์กฐํ ์ ์๋ค๋ ์๋ฏธ
๐ก โ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๋ฅผ ํตํด์๋ง ๋๋จธ์ง ์ํฐํฐ์ ์ํ๋ฅผ ๋ณ๊ฒฝํด์ผํ๋ ์ด์
- ์ํฐํฐ์ ์ง์ ์ ๊ทผํด์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ,
์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์์ผํ๋ ์ํ์์๋ ๋ฌด์ํ๊ณ ๋ณ๊ฒฝํ๊ฒ ๋จ
โ ๋๋ฉ์ธ ๊ท์น์ ๋ํ ์ผ๊ด์ฑ์ด ๊นจ์ง
โ - ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๋ฅผ ๋จผ์ ๊ฑฐ์ณ์ ๋ณ๊ฒฝ๋ ์กฐ๊ฑด(๊ท์น)์ ๊ฒ์ฆํ ํ,
๊ทธ ๊ฒ์ฆ์ ํต๊ณผํ๋ฉด ์ํฐํฐ์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ํจ
โ ๋๋ฉ์ธ ๊ท์น์ ์ผ๊ด์ฑ์ ์ ์งํ๋๋ก
Ex. ์ฃผ๋ฌธ์ด๋ผ๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๊ฐ ์๋ค๊ณ ํ๋ฉด ์ฃผ๋ฌธ ์ ๋ณด(์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ), ๋ฐฐ๋ฌ ์ฃผ์ ์ ๋ณด ๋ฑ์ด ์์ ๊ฒ์
๋ฐฐ๋ฌ ์ค์ด๋ผ๊ณ ํ ๋, ๋ฐฐ๋ฌ ์ฃผ์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ฉด ์ง๊ธ์ด ์กฐ๋ฆฌ ์ค์ธ์ง / ๋ฐฐ๋ฌ ์ค์ธ์ง ๊ฒ์ฆํ ํ,
์กฐ๋ฆฌ ์ค์ด๋ฉด ๋ณ๊ฒฝ ๊ฐ๋ฅํ๊ณ , ๋ฐฐ๋ฌ ์ค์ด๋ฉด ๋ณ๊ฒฝํ ์ ์๋๋ก ์ด๋ฐ ๊ท์น์ ์ผ๊ด์ฑ์ ์ ์งํ๋๋ก ํด์ผํจ!
โ๏ธ 2. ๋์ผํ ํ๋์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ด์์๋ ์ํฐํฐ ๊ฐ์ ๊ฐ์ฒด๋ก ์ฐธ์กฐ
( ๋์ผํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ด์ ์ํฐํฐ๋ผ๋ฆฌ ์ฐธ์กฐํ ๊ฒฝ์ฐ๋ง ์ ์ฉ )
โ๏ธ 3. ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ ๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ ๊ฐ์ ์ํฐํฐ ๊ฐ์ฒด ์ฐธ์กฐ
- ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ ๊ฐ์ ์ฐธ์กฐ๋ (๊ฐ์ฒด ์ฐธ์กฐ ๋์ ์) ์ธ๋ํค ๋ฐฉ์์ฒ๋ผ ID๋ก ์ฐธ์กฐ
( ์ฐธ์กฐํ๊ณ ์ ํ๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ์ ID๋ฅผ ์ฐธ์กฐ๊ฐ์ผ๋ก ๋ฉค๋ฒ ๋ณ์์ ์ถ๊ฐํ๋ ๊ฒ ) - 1๋1 / 1๋N ๊ด๊ณ์ผ ๋๋ ํ ์ด๋ธ ๊ฐ์ ์ธ๋ํค ๋ฐฉ์๊ณผ ๋์ผ
- N๋N ๊ด๊ณ์ผ ๋๋ ์ธ๋ํค ๋ฐฉ์์ธ ID ์ฐธ์กฐ / ๊ฐ์ฒด ์ฐธ์กฐ ๋ฐฉ์์ด ํจ๊ป ์ฌ์ฉ
โ ์ฌ์ฉํ ์ ๋ํ ์ด์ / ์ธํฐํ์ด์ค๋ค
- โ๏ธ
@Id
โ ์๋ณ์๋ก ์ง์
Ex. Member ํด๋์ค์ memberId ๋ณ์์ ์ด ์ ๋ํ ์ด์ ์ ๋ถ์ด๋ฉด,
Member ํด๋์ค์ ์๋ณ์(Primary Key)๋ก ์ง์ ๋๊ณ ,
schema.sql์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์์ MEMBER ํ ์ด๋ธ๊ณผ ๋งคํ๋จ
- โ๏ธ
@Table
โ ํด๋์ค๋ช ๊ณผ ๋ณ๊ฐ์ ๋งคํ๋ ํ ์ด๋ธ๋ช ์ ์ ํ ์ ์์
Ex. Order ํด๋์ค์์ @Id ์ ๋ํ ์ด์ ์ ๋ถ์ด๋ฉด ์ด ํด๋์ค๋ ORDER ํ ์ด๋ธ๊ณผ ๋งคํ๋จ
But, ์ด ๊ฒฝ์ฐ ์ฟผ๋ฆฌ๋ฌธ์ ORDER BY ์์ฝ์ด๊ฐ ์๊ธฐ์ ๊ฒน์น์ง ์๊ฒ @Table("ORDERS")๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ORDER๊ฐ ์๋ ORDERS๋ผ๋ ํ ์ด๋ธ๋ช ๊ณผ ๋งคํ๋จ
- โ๏ธ
AggregateReference<T,ID>
โ 1:N ๊ด๊ณ์ผ ๋,
Id๋ฅผ ์ด ํด๋์ค๋ก ๊ฐ์ธ์ ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ ์๋ ID ์ฐธ์กฐํ ์ ์๊ฒ ๊ฐ์ธ์ค ์ ์์
( N:N ๊ด๊ณ์์๋ ์ฌ์ฉ X )
โ
โT
- ์ฐธ์กฐ๋ ์ง๊ณ ๋ฃจํธ์ ์ ํ
โID
- ์ฐธ์กฐ๋ ์ง๊ณ ๋ฃจํธ์ ID ์ ํ
( ์ฐธ์กฐ๋ ์ง๊ณ ๋ฃจํธ์ ID๋ง ๋ณด์ )
โ
[์ฐธ๊ณ ] https://docs.spring.io/spring-data/jdbc/docs/current/api/org/springframework/data/jdbc/core/mapping/AggregateReference.html
- โ๏ธ
@MappedCollection(idCloumn = "", keyColumn = "")
โ ์ํฐํฐ ํด๋์ค ๊ฐ์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ์ ๋ณด
( ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ List, Set๋๋ ์์ฑ์ ๋ํ ๋งคํ์ ๊ตฌ์ฑํ๊ธฐ ์ํ ์ฃผ์ )
โidColumn
- ์์ ํ ์ด๋ธ์ ์ถ๊ฐ๋๋ ์ธ๋ํค์ ํด๋น๋๋ ์ปฌ๋ผ๋ช ์ง์
โkeyColumn
- ์ธ๋ํค๋ฅผ ํฌํจํ๊ณ ์๋ ํ ์ด๋ธ์ ๊ธฐ๋ณธํค ์ปฌ๋ผ๋ช ์ง์
โ
โ List์ ๊ฒฝ์ฐ ๋ ์ ํธ๋ฆฌ๋ทฐํธ ๋ชจ๋ ์ ์ด์ผํ๊ณ , Set์ ๊ฒฝ์ฐ idColumn๋ง ์ ์ผ๋ฉด ๋จ !
- โ๏ธ
CrudRepository<Member, Long>
โ ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌํ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ์ ์ฅ, ์กฐํ, ์์ , ์ญ์ ํ ์ ์๋ ์ธํฐํ์ด์ค
โ ์ฟผ๋ฆฌ ๋ฉ์๋ (Query Method)
find + By + SQL ์ฟผ๋ฆฌ๋ฌธ์์ WHERE ์ ์ ์ปฌ๋ผ๋ช + (WHERE ์ ์ปฌ๋ผ์ ์กฐ๊ฑด์ด ๋๋ ๋ฐ์ดํฐ)
ํ์
โ findByxxxx์์ ์ปฌ๋ผ๋ช ์ ๋ด๋ถ์ ์ผ๋ก๋ ํ ์ด๋ธ์ ์ปฌ๋ผ๋ช ์ผ๋ก ๋ณ๊ฒฝ๋์ง๋ง,
Spring JDBC ์ ์ฅ์์๋ ์ํฐํฐ ํด๋์ค๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์์ ์ ํ๊ธฐ ๋๋ฌธ์
๋ฐ๋์ ์ํฐํฐ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์๋ช ์ ์ ์ด์ฃผ์ด์ผ ํจ
- ์ฟผ๋ฆฌ ๋ฉ์๋์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ํ
์ด๋ธ์์ ์กฐํํ์ฌ ๋ฆฌํด๋ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ํฐํฐ ํด๋์ค์ ๊ฐ์ฒด๋ก ์ง์
Ex. Optional< Member > findByEmail(String email);
๋ผ๋ ์ฟผ๋ฆฌ๋ฉ์๋๋ฅผ ์์ฑํ๋ฉด,
๋ด๋ถ์ ์ผ๋ก ์๋์ SQL ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ๋ณํ๋์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ MEMBER ํ
์ด๋ธ์ ์ง์ ๋ณด๋SELECT "MEMBER"."NAME" AS "NAME", "MEMBER"."PHONE" AS "PHONE", "MEMBER"."EMAIL" AS "EMAIL", "MEMBER"."MEMBER_ID" AS "MEMBER_ID" FROM "MEMBER" WHERE "MEMBER"."EMAIL" = ?
โ ์ด๋ฏธ ํ
์ด๋ธ์ ๋ฑ๋ก๋ ์ด๋ฉ์ผ ์ฃผ์๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํ ์ฉ๋
โ๏ธ @Query
- ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด์ ์ง์๋ฅผ ํ ์ ์๋๋ก ํด์ค
( ์ฟผ๋ฆฌ ๋ฉ์๋๋ช ์ ๊ธฐ์ค์ผ๋ก SQL ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ๋ ๊ฒ X ) - ๋ณต์กํ ์ฟผ๋ฆฌ๋ฌธ์ ๊ฒฝ์ฐ ์ฌ์ฉ
Ex. @Query("SELECT * FROM COFFEE WHERE COFFEE_ID = :coffeeId")
[์ฐธ๊ณ ] https://www.javaguides.net/2021/10/spring-boot-pagination-and-sorting-rest-api.html
โ๏ธ ํ์ด์ง๋ค์ด์
- โ๏ธ
PagingAndSortingRepository < T, ID >
โ Spring ์ง์ pagination API
โ extends CrudRepository < T, ID > ํ๋ ์ธํฐํ์ด์ค
์ ์ธํฐํ์ด์ค๋ฅผ Repository์ extends ํ์ฌ ํ์ด์ง๋ค์ด์ ๊ตฌํ ๊ฐ๋ฅ !
โ ํ์ด์ง๋ค์ด์ ์ฒ๋ฆฌ ๋ฐฉ์
1. ์คํ์ ๋ฐฉ์
- ์คํ๋ง์์ ์ง์ํ๋ ๋ฐฉ์
- ํ์ ์ฐพ์ ๊ฐ์๋งํผ ์์์๋ถํฐ ์นด์ดํ ํ์ฌ ์ฐพ์๊ฐ๋ ๋ฐฉ์
Ex. 10๋ง ๊ฑด์ ๋ฐ์ดํฐ์์ 10๋ง ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ผ๋ ค๋ฉด 1๋ฒ๋ถํฐ ์ญ ์ฐพ์๊ฐ์ผํจ
- ์๊ฐ์ด ์ข ๊ฑธ๋ฆด ์ ์์ง๋ง 100๋ง๊ฑด - 200๋ง๊ฑด์ผ๋ก ๊ทธ๋ ๊ฒ ๋๋ ค์ง์ง๋ ์์
- ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ๋ฐฉ์
2. ์ปค์ ๋ฐฉ์
- ์์์ ์คํฌ๋กค ์ญ ํด์ ํ์ด์ง์ ๋ง์ง๋ง ๋๋ฉด ๋ฐ์ ํ์ด์ง๊ฐ ์๋ก ๋ํ๋์ ํ์ํ๋ ๊ฒ
- ๋ง์ง๋ง ์กฐํํ ์์น๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํจ
- ์คํฌ๋กค ํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์
โ๏ธ n+1 ๋ฌธ์
- ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ SQL์ ํ ๋ฒ ์คํํ์ ๋ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ n ๊ฑด ๊ฐ์ ธ์ค๋๋ฐ ๊ทธ ๊ฒฐ๊ณผ ์ ๋งํผ SQL์ ์ถ๊ฐ๋ก ๋ ์คํ(N)ํ๋ ๋ฌธ์
Ex. N๊ฑด์ ์ฃผ๋ฌธ์ ์ฌ๋ฌ๊ฐ์ ์ปคํผ ์ ๋ณด
โ JOIN๋ฌธ์ ํ์ฉํ ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ์คํ ํ์๋ฅผ ์ค์
โ SQL IN ์ฐ์ฐ์ ์ญํ ์ ํ๋ findAllById(Iterable ids)๋ฅผ ์ด์ฉํด ์ฟผ๋ฆฌ ์ํ ํ์๋ฅผ ์ค์
๐ ์ค์ต
- projects ๋ด์ be-template-jdbc 2
๐ฌ ๊ถ๊ธํ๋ ์ !
๋ฉค๋ฒ-์ค๋์ ์ค๋-์ค๋์ปคํผ๋ ๋๊ฐ์ด 1:N ๊ด๊ณ์ธ๋ฐ
๋ฉค๋ฒ-์ค๋ ๊ด๊ณ์์๋ ์ค๋์์ ๋ฉค๋ฒ๋ฅผ ์ฐธ์กฐํ๋๋ฐ
์ ์ค๋-์ค๋์ปคํผ์์๋ ์ค๋์ปคํผ์์ ์ค๋๋ฅผ ์ฐธ์กฐํ๋๊ฒ ์๋๋ผ
์ค๋์์ ์ค๋์ปคํผ๋ฅผ ์ฐธ์กฐํ ๊น??
๐ฌ Answer )
JPA๊ฐ์ ๊ฒฝ์ฐ ๋ ๋ค ์ฐธ์กฐํ์ฌ ์ค์ ํ ์ ์๋๋ฐ, Spring Data JDBC ์์๋ DDD ์ถ๊ตฌํ๊ธฐ ๋๋ฌธ์ ๊ทธ ์ค ์์น์ธ ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ๋ฐฉํฅ ๊ด๊ณ ์ถ๊ตฌ
[GroupingBy ์ด์ฉ ์ฐธ๊ณ ]
https://gem1n1.tistory.com/159
[Java 8 Comparator Comparing Reverse Order ์ฐธ๊ณ ]
https://www.javaprogramto.com/2021/12/java-8-comparator-comparing-reverse.html
๐ ๋๋์
์ค์ต ์ฝ๋ ์์ด ์์ฃผ ๋ง์์ ํ๋ฃจํ๋ฃจ ๋ ๋ฐ์ ์์ฆ ใ
๋ญ๊ฐ ํ์ต ์๊ฐ์ ์ฝ๋ ์น๊ณ ์ดํดํ๊ธฐ๋ ๋น ๋ฏํ๋ฐ
์ฝ๋์ ์๋ฌ๊ฐ ๋์ ๊ทธ๊ฑฐ์ ์๊ฐ์ ์์ผ๋ฉด ์ ์ ๋ฐ๋ ค์ ๊ผฌ์ด๋ ๋๋์ด๋ค ๐ฅ
ํ์ง๋ง ๊ด์ฐฎ์.. ํ์ดํ
์ด๋ค !!
( ๋ณธ ๊ฒ์๋ฌผ์ 2022/11/02์ ์์ฑํ ๊ธ์ ์ฎ๊ธด ๊ธ์ ๋๋ค. ์๋ฌธ์ ์๊ธฐ์ ์์! )
'โข CodeStates BootCamp > Section 3' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ [Section3] 8. [ Spring MVC ] Spring Data JPA 2 (0) | 2023.04.11 |
---|---|
๐ [Section3] 7. [ Spring MVC ] Spring Data JPA 1 (1) | 2023.04.11 |
๐ [Section3] 5. [ Spring MVC ] Spring Data JDBC 1 (0) | 2023.04.10 |
๐ [Section3] 4. [ Spring MVC ] ์์ธ ์ฒ๋ฆฌ (0) | 2023.04.10 |
๐ [Section3] 3. [ Spring MVC ] ์๋น์ค ๊ณ์ธต (0) | 2023.04.10 |