๐ค ์ํฐํฐ(Entity)๋ Setter ์ฌ์ฉ์ ์ง์ํด์ผ ํ๋ค.
Setter๊ฐ ๋ชจ๋ ์ด๋ ค์๋ค๋ฉด, ๋ณ๊ฒฝ์ ํธ๋ฆฌํ ์ ์์ง๋ง ๋ณ๊ฒฝ ํฌ์ธํธ๊ฐ ๋๋ฌด ๋ง์ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค. ๋ณ๊ฒฝ์ด ํ์ํ๋ค๋ฉด Setter๋ฅผ ์ฌ์ฉํ๊ธฐ๋ณด๋ค ์์ฑ์๋ฅผ ํตํด ๊ฐ์ ์ฑ์ด ํ, ์ํ๋ ํ๋๋ฅผ ๋ณ๊ฒฝํ์ฌ ์์ฑํด์ผ ํฉ๋๋ค.
๐ค ๋ชจ๋ ์ฐ๊ด๊ด๊ณ๋ ์ง์ฐ๋ก๋ฉ์ผ๋ก ์ค์ ํ๋ค.
์ฆ์๋ก๋ฉ(Eager)๋ ์ด๋ ๋ถ๋ถ์์ SQL์ด ์คํ๋ ์ง ์์ธกํ๊ธฐ ์ด๋ ค์ฐ๋ฉฐ, ์ฐ๊ด๊ด๊ณ๊ฐ ๋งคํ๋ ๋ชจ๋ ์ํฐํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ๋ฉด์์ ์ข์ง ์์ต๋๋ค. ํนํ JPQL์ ์คํํ ๋ N+1 ๋ฌธ์ ๊ฐ ์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๋๋ค.
N+1 ๋ฌธ์ ๋ ์ง์ฐ๋ก๋ฉ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ fetch join, ์ํฐํฐ ๊ทธ๋ํ ๊ธฐ๋ฅ ๋ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. XxxToOne(OneToOn, ManyToOne) ๊ด๊ณ๋ ๊ธฐ๋ณธ๊ฐ์ด ์ฆ์๋ก๋ฉ์ด๊ธฐ ๋๋ฌธ์ ์ง์ ์ง์ฐ๋ก๋ฉ์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
๐ค ์ปฌ๋ ์ ์ ํ๋์์ ์ด๊ธฐํ
์ปฌ๋ ์ ์ ํ๋์์ ๋ฐ๋ก ์ด๊ธฐํํด์ฃผ๋ ๊ฒ์ด ์์ ํฉ๋๋ค. Hibernate๋ ์ํฐํฐ๋ฅผ ์์ํ ํ ๋, ์ปฌ๋ ์ ์ ๊ฐ์ธ Hibernate๊ฐ ์ ๊ณตํ๋ ๋ด์ฅ ์ปฌ๋ ์ ์ผ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค. ๋ง์ฝ getter ๋ฉ์๋๋ก ์ปฌ๋ ์ ์ ํธ์ถํ ๋ ์ปฌ๋ ์ ์ด ์๋ชป ์์ฑ๋ ๊ฒฝ์ฐ, Hibernate ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ๋ ๋ ๋ฒจ์์ ์ด๊ธฐํ๋ฅผ ํด์ฃผ๋ ๊ฒ์ด ์์ ํ๋ฉฐ, ์ฝ๋๋ ๊ฐ๊ฒฐํด์ง๋๋ค.
Member member = new Member(); // ๋น์์ ์ํฐํฐ
System.out.println(member.getOrders().getClass());
em.persist(member); // ์์ ์ํฐํฐ
System.out.println(member.getOrders().getClass());
class java.util.ArrayList
class org.hibernate.collection.internal.PersistentBag // Hibernate๊ฐ ์ ๊ณตํ๋ ๋ด์ฅ ์ปฌ๋ ์
์ผ๋ก ๋ณ๊ฒฝ
๐ค Controller์์ REST API๋ฅผ ์ฌ์ฉํ ๋ Entity๋ฅผ ์ง์ ๋ฐํํ๋ฉด ์๋๋ค.
1. ์คํ ๋ณ๊ฒฝ ๋ฌธ์
Entity๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ด๋ ๋ชจ๋ธ์ด๋ฏ๋ก ์คํค๋ง ๋ณ๊ฒฝ์ด๋ ๋น์ฆ๋์ค ๋ก์ง ๋ณ๊ฒฝ์ ์ํฅ์ ๋ฐ์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ๋ณ๊ฒฝ์ฌํญ์ด ์๊ธธ ๊ฒฝ์ฐ ํด๋น Entity๋ฅผ ์ง์ ๋ฐํํ๋ค๋ฉด API์ ์๋ต ํ์์ ๋ชจ๋ ๋ณ๊ฒฝํด์ผํ๋ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค.
2. ๋ถํ์ํ ์ ๋ณด ๋ ธ์ถ
Entity๋ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ํฌํจ๋ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ธ๋ถ์ ๋ ธ์ถ์ํฌ ๊ฒฝ์ฐ ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
3. ์ง์ฐ ๋ก๋ฉ ๋ฌธ์
์ค๋ฌด์์ Entity๋ ์ง์ฐ ๋ก๋ฉ์ ๊ธฐ๋ณธ์ผ๋ก ๊ฐ์ ธ๊ฐ๋๋ก ์ค๊ณํฉ๋๋ค. ์ด๋ ์ง์ฐ ๋ก๋ฉ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, Hibernate๋ JPA์์ ์์ธ๊ฐ ๋ฐ์๋ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ API ์๋ต์ ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ ๋ง๊ฒ ๊ตฌ์ฑ๋์ด์ผ ํ๋ฉฐ, ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ DTO๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ์ฌ ์๋ตํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
๐ค ์ฐ๊ด๊ด๊ณ๋ฅผ ๋จ๋ฐฉํฅ์ผ๋ก ๋จผ์ ์ค๊ณํด์ผ ํ๋ค.
1. ๊ฐ๋จ์ฑ๊ณผ ์ ์ฐ์ฑ
๋จ๋ฐฉํฅ ๊ด๊ณ๋ ์ค๊ณ๋ฅผ ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด์ค๋๋ค. ์๋ฐฉํฅ ๊ด๊ณ๋ ๋ Entity ์ฌ์ด์ ์ํธ ์์กด์ฑ์ ๋์ ํ๋ฉฐ, ์ด๋ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํต๋๋ค. ๋ฐ๋ผ์ ์ต์ด ์ค๊ณ๋ ๋จ๋ฐฉํฅ์ผ๋ก ์์ํ์ฌ, ํ์์ ๋ฐ๋ผ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋งบ๋ ๊ฒ์ด ์ข์ต๋๋ค.
2. ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฐฉ์ง
์๋ฅผ ๋ค์ด ์๋ฐฉํฅ ๊ด๊ณ๋ ํ ์ํฐํฐ A๊ฐ ์ํฐํฐ B๋ฅผ ์ฐธ์กฐํ๊ณ , ๋์์ ์ํฐํฐ B๊ฐ ๋ค์ ์ํฐํฐ A๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์๋ ์ ์์ต๋๋ค. ๋จ๋ฐฉํฅ ๊ด๊ณ๋ ์ด๋ฌํ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
3. ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง
์๋ฐฉํฅ ๊ด๊ณ๋ ๋ ์ํฐํฐ ์ฌ์ด์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ ๋ง์ ๊ด๋ฆฌ ์์ ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋จ๋ฐฉํฅ ๊ด๊ณ๋ ๋ ์ํฐํฐ๋ฅผ ๋ชจ๋ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
'Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
QueryDSL ๋ฌธ๋ฒ ์ ๋ฆฌ (0) | 2024.07.13 |
---|---|
N+1 ๋ฌธ์ (0) | 2024.04.28 |
์์์ฑ ์ ์ด(CASCADE)์ ๊ณ ์ ๊ฐ์ฒด(ORPHAN) (0) | 2024.04.28 |
์ฆ์ ๋ก๋ฉ(Eager)๊ณผ ์ง์ฐ ๋ก๋ฉ(Lazy) (0) | 2024.04.28 |
ํ๋ก์(Proxy) (0) | 2024.04.28 |