๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ณ๋ฅผ ์ํ ๋๋ฉ์ธ ์์ฃผ์ ์ค๊ณ ๊ธฐ๋ฒ
๋ชจ๋ ๊ธฐ๋ฅ์ ๋๋ฉ์ธ ๋ชจ๋ธ ์์ฃผ๋ก ๋์๊ฐ๊ฒ ์ค๊ณํ๋ ๊ธฐ๋ฒ
โ๏ธ ๋๋ฉ์ธ (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 ํด๋์ค์ ๊ธฐ๋ฅ์ด ๋ง์ด ๋ค์ด์์
๋น์ทํ ๋ฒ์ฃผ์ ์ฐ๊ด๋ ์
๋ฌด๋ค์ ํ๋๋ก ๊ทธ๋ฃนํ ํด๋์ ๋ฌถ์
(๋น์ทํ ์
๋ฌด ๋๋ฉ์ธ๋ค์ ๋ฌถ์)
DDD(Domain-Driven Design)์ ํจํด
โ
Ex. ๋ฐฐ๋ฌ ์ฃผ๋ฌธ ์ฑ์์ - ํ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ / ์ฃผ๋ฌธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ / ์์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ / ๊ฒฐ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฑ
( ํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์์๋ 1๊ฐ ์ด์์ ๋๋ฉ์ธ(ํ์ ์์ค ๋๋ฉ์ธ)๋ค์ด ์กด์ฌ )
๋ฃจํธ ์ํฐํฐ(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>
โ ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌํ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ์ ์ ์ฅ, ์กฐํ, ์์ , ์ญ์ ํ ์ ์๋ ์ธํฐํ์ด์ค
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 >
์ ์ธํฐํ์ด์ค๋ฅผ Repository์ extends ํ์ฌ ํ์ด์ง๋ค์ด์ ๊ตฌํ ๊ฐ๋ฅ !
1. ์คํ์ ๋ฐฉ์
์คํ๋ง์์ ์ง์ํ๋ ๋ฐฉ์
ํ์ ์ฐพ์ ๊ฐ์๋งํผ ์์์๋ถํฐ ์นด์ดํ
ํ์ฌ ์ฐพ์๊ฐ๋ ๋ฐฉ์
Ex. 10๋ง ๊ฑด์ ๋ฐ์ดํฐ์์ 10๋ง ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ผ๋ ค๋ฉด 1๋ฒ๋ถํฐ ์ญ ์ฐพ์๊ฐ์ผํจ
์๊ฐ์ด ์ข ๊ฑธ๋ฆด ์ ์์ง๋ง 100๋ง๊ฑด - 200๋ง๊ฑด์ผ๋ก ๊ทธ๋ ๊ฒ ๋๋ ค์ง์ง๋ ์์
๊ฐ์ฅ ๋ง์ด ์ฐ๋ ๋ฐฉ์
2. ์ปค์ ๋ฐฉ์
์์์ ์คํฌ๋กค ์ญ ํด์ ํ์ด์ง์ ๋ง์ง๋ง ๋๋ฉด ๋ฐ์ ํ์ด์ง๊ฐ ์๋ก ๋ํ๋์ ํ์ํ๋ ๊ฒ
๋ง์ง๋ง ์กฐํํ ์์น๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํจ
์คํฌ๋กค ํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์
โ JOIN๋ฌธ์ ํ์ฉํ ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ์คํ ํ์๋ฅผ ์ค์
โ SQL IN ์ฐ์ฐ์ ์ญํ ์ ํ๋ findAllById(Iterable ids)๋ฅผ ์ด์ฉํด ์ฟผ๋ฆฌ ์ํ ํ์๋ฅผ ์ค์
๐ฌ ๊ถ๊ธํ๋ ์ !
๋ฉค๋ฒ-์ค๋์ ์ค๋-์ค๋์ปคํผ๋ ๋๊ฐ์ด 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
์ค์ต ์ฝ๋ ์์ด ์์ฃผ ๋ง์์ ํ๋ฃจํ๋ฃจ ๋ ๋ฐ์ ์์ฆ ใ
๋ญ๊ฐ ํ์ต ์๊ฐ์ ์ฝ๋ ์น๊ณ ์ดํดํ๊ธฐ๋ ๋น ๋ฏํ๋ฐ
์ฝ๋์ ์๋ฌ๊ฐ ๋์ ๊ทธ๊ฑฐ์ ์๊ฐ์ ์์ผ๋ฉด ์ ์ ๋ฐ๋ ค์ ๊ผฌ์ด๋ ๋๋์ด๋ค ๐ฅ
ํ์ง๋ง ๊ด์ฐฎ์.. ํ์ดํ
์ด๋ค !!