๐[Spring] ์ฐ๊ด๊ด๊ณ ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํ ์ฌํญ๋ค์ ๋ฌด์์ด ์์๊น์?
- JPA์์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ ๋๋ ์ฌ๋ฌ ๊ฐ์ง ์ธก๋ฉด์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ์ฐ๊ด๊ด๊ณ๋ฅผ ์ ์ ํ ์ค์ ํ์ง ์์ผ๋ฉด ์ฑ๋ฅ ์ ํ, ๋ณต์กํ ํธ๋์ญ์ ๊ด๋ฆฌ, ์ ์ง๋ณด์์ฑ ์ ํ ๋ฑ์ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
1๏ธโฃ ์ฐ๊ด๊ด๊ณ ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํ ํญ๋ชฉ๋ค.
1๏ธโฃ ์ฐ๊ด๊ด๊ณ์ ๋ฐฉํฅ(๋จ๋ฐฉํฅ vs ์๋ฐฉํฅ)
1๏ธโฃ ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ.
- ํ์ชฝ ์ํฐํฐ๋ง ๋ค๋ฅธ ์ํฐํฐ๋ฅผ ์ฐธ์กฐํ๋ ๊ด๊ณ์ ๋๋ค.
- ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ ์ค๊ณ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋จํ๊ณ ์ฑ๋ฅ ์ต์ ํ์๋ ์ ๋ฆฌํฉ๋๋ค.
2๏ธโฃ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ.
- ์๋ก ์ฐธ์กฐํ๋ ๊ด๊ณ๋ก, ๋ ์ํฐํฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ช
ํํ ํ๊ณ ๊ฐ์ฒด ๊ทธ๋ํ ํ์์ด ๋ ์ฌ์์ง๋๋ค.
- ํ์ง๋ง ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ ์๋ก ์ฐธ์กฐํ๋ฉด์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๊ณ , ๋ฐ์ดํฐ ์ง๋ ฌํ ๊ณผ์ ์์ ๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๐โโ๏ธ ๋ฐ์ดํฐ ์ง๋ ฌํ(Serialization)
๋ฐ์ดํฐ ์ง๋ ฌํ(Serialization)๋ ๊ฐ์ฒด ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์ ์กํ ์ ์๋ ํ์์ผ๋ก ๋ณํํ๋ ๊ณผ์ ์ ์๋ฏธํฉ๋๋ค.
์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ฒด๋ก ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ผ๋ก ์ ์ฅํ๊ฑฐ๋ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ค๋ฅธ ์์คํ ์ผ๋ก ์ ์กํ ์ ์์ต๋๋ค.
๋ฐ๋๋ก, ์ญ์ง๋ ฌํ(Deserialization)๋ ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์๋์ ๊ฐ์ฒด๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ณต์ํ๋ ๊ณผ์ ์ ๋๋ค.
3๏ธโฃ ์ ํ ๊ธฐ์ค.
- ๊ฐ๋ฅํ๋ฉด ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฐ์ ์ผ๋ก ์ค๊ณํ๊ณ , ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๊ฐ ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
2๏ธโฃ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ(Owning Side)
- ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์์๋ ์ธ๋ ํค(Foreign Key)๋ฅผ ๊ด๋ฆฌํ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๋ช ํํ ์ง์ ํด์ผ ํฉ๋๋ค.
- ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ค์ ์ธ๋ ํค(Foreign Key)๋ฅผ ์ ์ฅํ๋ ์ํฐํฐ๋ก, ์ฃผ์ธ์ด ์๋ ์ํฐํฐ์์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ค์ ํด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
- ์ฃผ์ธ์ ์ ํํ๊ฒ ์ค์ ํ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถํ์ํ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
3๏ธโฃ ์ง์ฐ ๋ก๋ฉ(Lazy Loading)๊ณผ ์ฆ์ ๋ก๋ฉ(Eager Loading)
1๏ธโฃ ์ง์ฐ ๋ก๋ฉ(Lazy Loading).
- ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋ฐฉ์์ ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๊ด ๊ด๊ณ๋ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ์ ๋ฆฌํ๋ฉฐ, ํ์ํ ์๊ฐ์๋ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
2๏ธโฃ ์ฆ์ ๋ก๋ฉ(Eager Loading).
- ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ์ฐ๊ด๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๋ก๋ํ๋ ๋ฐฉ์์ผ๋ก, ํ์ ์ด์์ผ๋ก ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ N+1 ๋ฌธ์ ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
3๏ธโฃ ์ ํ ๊ธฐ์ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ง์ฐ ๋ก๋ฉ(Lazy Loading)์ ๊ธฐ๋ณธ์ผ๋ก ํ๊ณ , ์ฑ๋ฅ์ ํฐ ์ํฅ์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ฆ์ ๋ก๋ฉ(Eager Loading)์ ์ฌ์ฉํฉ๋๋ค.
- ์ฆ์ ๋ก๋ฉ(Eager Loading)์ ์ฌ์ฉํ๋ฉด ์ฐ๊ด๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๊ฐ์ ธ์ค๋ฏ๋ก, ํน์ ์กฐํ ์ ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ก ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.
4๏ธโฃ ํ์น ์กฐ์ธ(Fetch Join)
1๏ธโฃ ์ง์ฐ ๋ก๋ฉ(Lazy Loading)์์์ ํ์น ์กฐ์ธ(Fetch Join)
- ์ง์ฐ ๋ก๋ฉ(Lazy Loading)์์ N+1 ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ณ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ํ์น ์กฐ์ธ(Fetch Join)์ ์ฌ์ฉํฉ๋๋ค.
2๏ธโฃ JPQL ์ฟผ๋ฆฌ์์ ํ์น ์กฐ์ธ(Fetch Join)
- ํ์น ์กฐ์ธ(Fetch Join)์ JPQL ์ฟผ๋ฆฌ์์ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ธํ์ฌ ํจ๊ป ๋ก๋ํ๋ ๋ฐฉ์์ผ๋ก, ์ฑ๋ฅ ์ต์ ํ์ ์ ์ฉํฉ๋๋ค.
-
3๏ธโฃ ์ ํ ๊ธฐ์ค.
- ํ์น ์กฐ์ธ(Fetch Join)์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๋ฉฐ, ์ฟผ๋ฆฌ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํค๋ฏ๋ก ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
5๏ธโฃ Cascade ์ต์ ๊ณผ orphanRemoval
1๏ธโฃ Cascade ์ต์ .
- ๋ถ๋ชจ ์ํฐํฐ์์ ์์ ์ํฐํฐ๋ฅผ ํจ๊ป ๊ด๋ฆฌํ ์ ์๋๋ก CascadeType.PERSIST, CascadeType.REMOVE ๋ฑ์ ์ต์
์ ์ค์ ํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์ ์ฅํ ๋ ์์ ์ํฐํฐ๋ ์๋์ผ๋ก ์ ์ฅ๋๊ฑฐ๋ ์ญ์ ํ ๋ ์์ ์ํฐํฐ๋ ํจ๊ป ์ญ์ ๋ ์ ์์ต๋๋ค.
2๏ธโฃ orphanRemoval ์ต์ .
- ๋ถ๋ชจ์์ ๊ด๊ณ๊ฐ ๋๊ธด ์์ ์ํฐํฐ๋ฅผ ์๋์ผ๋ก ์ญ์ ํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋ถ๋ชจ ์ํฐํฐ์์ ์์ ์ํฐํฐ ๋ฆฌ์คํธ์์ ์ ๊ฑฐ๋๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
3๏ธโฃ ์ ํ ๊ธฐ์ค.
- Cascade์ orphanRemoval์ ๋ถ๋ชจ์ ์์ ๊ฐ ์๋ช
์ฃผ๊ธฐ๊ฐ ์์ ํ ์ผ์นํ ๋๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋์น ์์ ๋ฐ์ดํฐ ์ญ์ ๋ ์์์ฑ ์ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๐โโ๏ธ ์์์ฑ ์ ํ(Persistence Propagation)
JPA์์ ํ๋์ ์ํฐํฐ์ ์ํํ ์์์ฑ ์์ ์ด ์ฐ๊ด๋ ๋ค๋ฅธ ์ํฐํฐ์ ์๋์ผ๋ก ์ ํ๋๋ ๊ธฐ๋ฅ์ ์๋ฏธํฉ๋๋ค.
์ด๋ฅผ ํตํด ๋ถ๋ชจ ์ํฐํฐ๊ฐ ํน์ ์์์ฑ ์ํ(์: ์ ์ฅ, ์ญ์ , ๋ณํฉ ๋ฑ)๋ก ๋ณ๊ฒฝ๋ ๋, ์์ ์ํฐํฐ๋ ๋์ผํ ์ํ๋ก ์ ์ด๋ ์ ์๋๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.JPA์์๋ ์ด๋ฅผ ์ํค Cascade ์ต์ ์ ์ ๊ณตํ๋ฉฐ, ์ฃผ๋ก ์ฐ๊ด๋ ์ฌ๋ฌ ์ํฐํฐ๊ฐ ํ๋์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์ฆ, ๋ถ๋ชจ์ ์์ ๊ด๊ณ๋ฅผ ๊ฐ์ง ์ํฐํฐ๊ฐ ์์ ๋, ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์์ ์ํ๋ก ๋ง๋ค๊ฑฐ๋ ์ญ์ ํ๋ฉด, ์์ ์ํฐํฐ๋ ๊ฐ์ ์์ ์ด ์๋์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
6๏ธโฃ ๋ฐ์ดํฐ ์กฐํ ์ ์ต์ ํ.
- ์ฐ๊ด๊ด๊ณ๋ฅผ ํตํด ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํ ๋ ๋ถํ์ํ ๋ฐ์ดํฐ๊ฐ ๊ณผ๋ํ๊ฒ ์กฐํ๋์ง ์๋๋ก JPQL, ๋ค์ดํฐ๋ธ SQL, DTO ๋ฑ์ ํ์ฉํด ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
1๏ธโฃ DTO๋ฅผ ์ฌ์ฉํ ๋ฐ์ดํฐ ์ ์ก.
- ์ํฐํฐ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ ๋์ , ํ์ํ ์ ๋ณด๋ง ๋ด์ DTO(Data Transfer Object)๋ฅผ ํตํด ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
7๏ธโฃ ์ฐ๊ด๊ด๊ณ ์ค์ ์ด ๋ฐ๋์ ํ์ํ์ง ๊ฒํ .
- ๋ชจ๋ ๊ด๊ณ๋ฅผ ์ฐ๊ด๊ด๊ณ๋ก ์ค์ ํ ํ์๋ ์์ต๋๋ค.
- ๋จ์ํ ID๋ง ํ์ํ๊ฑฐ๋ ๋ค๋ฅธ ํ ์ด๋ธ์์ ํน์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋๋ง๋ค ์ฌ์ฉ๋๋ ๊ด๊ณ๋ผ๋ฉด, ๊ตณ์ด ์ฐ๊ด๊ด๊ณ๋ฅผ ์ค์ ํ์ง ์๊ณ ID๋ฅผ ์ฌ์ฉํ์ฌ ์กฐํํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ์ ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๊ณ๋ฅผ ๋ชจ๋ ์ํฐํฐ ๊ฐ ์ฐ๊ด๊ด๊ณ๋ก ์ค์ ํ๋ฉด ์คํ๋ ค ์ค๊ณ๊ฐ ๋ณต์กํด์ง๊ณ ์ฑ๋ฅ์ ํด์น ์ ์์ต๋๋ค.
8๏ธโฃ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ฐ ๋ฌด๊ฒฐ์ฑ ๊ด๋ฆฌ.
- ์ฐ๊ด๊ด๊ณ๋ฅผ ํตํด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋๋ก, ํธ๋์ญ์ ๊ด๋ฆฌ์ ์ฐ๊ด ๊ด๊ณ ์ค์ ์ ์ ์คํ๊ฒ ํด์ผ ํฉ๋๋ค.
- ์์ ์ํฐํฐ๊ฐ ๋ถ๋ชจ ์ํฐํฐ์ ๊ฐํ๊ฒ ์ข ์๋ ๊ฒฝ์ฐ(์: ์ฃผ๋ฌธ๊ณผ ์ฃผ๋ฌธ ํญ๋ชฉ)์๋ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋๋ก ์ฐ๊ด๊ด๊ณ๋ฅผ ์ ์ ํ๊ฒ ์ค์ ํ๊ณ , Cascade ์ต์ ์ ํตํด ์๋ช ์ฃผ๊ธฐ๋ฅผ ํจ๊ป ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
9๏ธโฃ ์์ฝ.
- ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ ๋ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋จ๋ฐฉํฅ๊ณผ ์๋ฐฉํฅ ์ค ํ์ํ ๋ฐฉ์์ ์ ํํ๊ณ , ์๋ฐฉํฅ ๊ด๊ณ์ ๊ฒฝ์ฐ ๋ฐ๋์ ์ฃผ์ธ์ ๋ช ํํ ์ค์ ํฉ๋๋ค.
- ์ง์ฐ ๋ก๋ฉ(Lazy Loading)์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ฉฐ ํ์ํ ๋๋ง ์ฆ์ ๋ก๋ฉ(Eager Loding)์ด๋ ํ์น ์กฐ์ธ(Fetch Join)์ ์ฌ์ฉํฉ๋๋ค.
- Cascade ์ต์ ๊ณผ orphanRemoval์ ์ ์คํ๊ฒ ์ค์ ํ์ฌ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๊ณ , ์๋ํ์ง ์์ ๋ฐ์ดํฐ ์ญ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ์ฑ๋ฅ์ ๊ณ ๋ คํ์ฌ ๋ฐ์ดํฐ ์กฐํ ์ ์ต์ ํํ๊ณ , ํ์ํ์ง ์์ ๊ด๊ณ๋ ์ฐ๊ด๊ด๊ณ๋ ์ค์ ํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.