Home
>
Spring
>
๐[Spring] ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌด์์ด ์ข์๊น์?
Spring
Framework
๐[Spring] ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌด์์ด ์ข์๊น์?
- JPA์์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ ๊ฐ ๊ด๊ณ๋ฅผ ํํํ๊ณ , ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉฐ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- JPA ์ฐ๊ด๊ด๊ณ๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ํฐํฐ๋ค ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฐ์ฒด ๋ชจ๋ธ๋ก ๊ทธ๋๋ก ํํํ๋ฏ๋ก, SQL ์ค์ฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ๋ณด๋ค ์ง๊ด์ ์ด๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์ด ์ฝ๋ ์์ฑ์ ๋์ต๋๋ค.
1๏ธโฃ JPA ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ์ ๋์ ์ฅ์ .
1๏ธโฃ ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง.
- ์ฐ๊ด๊ด๊ณ๋ฅผ ํตํด ์ํฐํฐ๋ค์ด ์ค์ ๋น์ฆ๋์ค ๋๋ฉ์ธ์์์ ์ ์ฌํ๊ฒ ์ฐ๊ฒฐ๋์ด ํํ๋๋ฏ๋ก, ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ด ๊ฐ๋ฅํฉ๋๋ค.
- User์ Order์ ๊ด๊ณ์ฒ๋ผ ์ํฐํฐ๊ฐ ์๋ก ์ฐธ์กฐํ๋ฉฐ ๊ด๊ณ๋ฅผ ํํํ ์ ์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ๋น์ฆ๋์ค ๋ก์ง์ ์ฝ๋๋ก ๋ ์์ฐ์ค๋ฝ๊ฒ ํํํ ์ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ์ ๋ํ ๊ณ ๋ฏผ๋ณด๋ค ๋น์ฆ๋์ค ๋ก์ง์ ๋ ์ง์คํ ์ ์์ต๋๋ค.
2๏ธโฃ ์๋์ผ๋ก SQL์ ์์ฑํ์ฌ ๊ด๋ฆฌ ๋ถ๋ด ๊ฐ์.
- JPA๋ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ค์ ํ๋ฉด ํ์ํ SQL์ ์๋์ผ๋ก ์์ฑํ๊ณ ์คํํด์ฃผ๋ฏ๋ก, ์ฐ๊ด๊ด๊ณ๋ฅผ ์ง์ SQL๋ก ๊ด๋ฆฌํ๋ ๋ถ๋ด์ ๋์ด์ค๋๋ค.
- ์๋ฅผ ๋ค์ด, User์ Order ๊ฐ์ ๊ด๊ณ๊ฐ ์ค์ ๋์ด ์์ผ๋ฉด, User ๊ฐ์ฒด์์ Order ๊ฐ์ฒด๋ฅผ ์กฐํํ ๋ JPA๊ฐ ์๋์ผ๋ก SQL์ ์์ฑํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
3๏ธโฃ ์ผ๊ด์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ ์ ์ง.
- ์ฐ๊ด๊ด๊ณ์ Cascade ์ต์
, orphanRemoval ์ต์
์ ํตํด ๊ฐ์ฒด ๊ฐ ๊ด๊ณ๋ฅผ JPA๊ฐ ๊ด๋ฆฌํด ์ฃผ๋ฏ๋ก, ๋ถ๋ชจ์ ์์ ์ํฐํฐ ๊ฐ ์ผ๊ด์ฑ์ ์ฝ๊ฒ ์ ์งํ ์ ์์ต๋๋ค.
- ๋ถ๋ชจ ์ํฐํฐ๊ฐ ์ญ์ ๋๋ฉด ์์ ์ํฐํฐ๋ ์๋์ผ๋ก ์ญ์ ๋๊ฑฐ๋ ์ฐ๊ด๋ ์์ ์ํฐํฐ๊ฐ Orphan Object(๊ณ ์ ๊ฐ์ฒด)๋ก ๋จ์ง ์๋๋ก ๊ด๋ฆฌํ ์ ์์ด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ๋ฐ ์ ๋ฆฌํฉ๋๋ค.
4๏ธโฃ ์ฑ๋ฅ ์ต์ ํ ์ง์.
- JPA๋ ์ฐ๊ด๊ด๊ณ ์ค์ ์ ํตํด ์ง์ฐ ๋ก๋ฉ(Lazy Loading), ์ฆ์ ๋ก๋ฉ(Eager Loading), ํ์น ์กฐ์ธ(Fetch Join) ๋ฑ์ ์ฌ์ฉํ์ฌ ํ์ํ ๋๋ง ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, fetch = FetchType.LAZY๋ก ์ค์ ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๋ก๋ํ์ง ์๊ณ ์ค์ ๋ก ํ์ํ ๋ ์กฐํํ๊ฒ ๋์ด ์ฑ๋ฅ ์ต์ ํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
5๏ธโฃ ๋น์ฆ๋์ค ๋ก์ง์ ์์ง๋ ํฅ์.
- ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ฉ์ธ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฐ์ฒด์งํฅ์ ์ธ ๋ฐฉ์์ผ๋ก ์บก์ํํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์์ฑํ ์ ์์ด ์์ง๋๊ฐ ๋์์ง๋๋ค.
- ์๋ฅผ ๋ค์ด, Order ๊ฐ์ฒด์ addOrderItem() ๋ฉ์๋๋ฅผ ์ ์ํด OrderItem์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- Order ๊ฐ์ฒด์ ์ฐ๊ด๋ ๋ชจ๋ OrderItem์ด ์๋์ผ๋ก ๊ด๋ฆฌ๋๋ฏ๋ก, ๋น์ฆ๋์ค ๋ก์ง์ด ๋ณด๋ค ์ผ๊ด์ฑ ์๊ฒ ์ ์ง๋ฉ๋๋ค.
6๏ธโฃ ๋ณต์กํ ์ฟผ๋ฆฌ ์์ฑ ์ต์ํ.
- ์ฐ๊ด๊ด๊ณ๋ฅผ ํตํด ๊ฐ์ฒด ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ์ง์ ์กฐ์ธ์ ์์ฑํ๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
- ํนํ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ํตํด ์ํฐํฐ ๊ฐ ๊ด๊ณ๋ฅผ ์ฝ๊ฒ ํ์ํ ์ ์์ด ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ ๋ ์ฝ๋๊ฐ ๋จ์ํด์ง๋๋ค.
2๏ธโฃ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ ์์ ์ ์ฅ์ .
- ์๋ฅผ ๋ค์ด, Team๊ณผ Member๊ฐ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๋ ๊ฒฝ์ฐ, Team ๊ฐ์ฒด์์ Member ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ์กฐํํ ์ ์์ต๋๋ค.
Team team = entityManager.find(Team.class, teamId);
List<Member> members = team.getMembers();
- ์์ ๊ฐ์ด Team์์ Member๋ฅผ ์ฝ๊ฒ ์กฐํํ ์ ์์ผ๋ฉฐ, ๋ณต์กํ SQL์ ์์ฑํ ํ์ ์์ด JPA๊ฐ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
3๏ธโฃ ์์ฝ.
- JPA์์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ๋ฐ์ดํฐ ๋ชจ๋ธ์ ํํํ๊ณ , SQL์ ์๋์ผ๋ก ์์ฑํ๋ฉฐ, ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ผ๊ด์ฑ์ ์ฝ๊ฒ ์ ์งํ ์ ์์ต๋๋ค. ๋ํ, ์ง์ฐ ๋ก๋ฉ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ผ๋ก ์ฑ๋ฅ์ ์ต์ ํํ๊ณ , ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ๋ ์ง๊ด์ ์ด๊ณ ์์ง๋ ฅ ์๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ ํฉ๋๋ค.