์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ์ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
์ง์ฐ ๋ก๋ฉ(LAZY)์ ์ฌ์ฉํด์ ํ๋ก์๋ก ์กฐํ
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
..
..
}
@OneToMany, @ManyToMany ๋ ๊ธฐ๋ณธ์ด LAZY
LAZY (์ง์ฐ ๋ก๋ฉ)์ ์ฌ์ฉํ๋ฉด?
member๋ฅผ ์กฐํํด๋ team์ ์ง์ ์ฌ์ฉํ๊ธฐ ์ ๊น์ง ์กฐํํ์ง ์๋๋ค. (ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค๋ค)
Team team = member.getTeam(); // ์ด๋๋ ํ๋ก์ ๊ฐ์ฒด!!
team.getName(); // team์ ์ค์ ๋ก ์ฌ์ฉํ๋ ์์ ์ DB์กฐํ ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ๊ฒ ๋๋ค.
๊ฐ๊ธ์ ์ด๋ฉด ์ง์ฐ ๋ก๋ฉ๋ง ์ฌ์ฉ (์ค๋ฌด์์๋ ํนํ ๋!)
์ฆ์ ๋ก๋ฉ(EAGER)์ ์ฌ์ฉํด์ ํจ๊ป ์กฐํ
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team;
..
..
}
@ManyToOne, @OneToOne๋ ๊ธฐ๋ณธ์ด EAGER
EAGER (์ฆ์ ๋ก๋ฉ)์ ์ฌ์ฉํ๋ฉด?
member๋ฅผ ์กฐํํ๋ฉด team๊น์ง ๋ค ์กฐํํด ๋ฒ๋ฆฐ๋ค. team์๋ ์ค์ ์ํฐํฐ๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๊ณ , ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ํ๋ฐฉ์ ๋ค ๋ ๋ ค๋ฒ๋ฆฐ๋ค. (๋์ค์ ๋ฐฐ์ฐ๊ฒ ๋ ๊ฒ์ธ๋ฐ, JPQL์์ N+1 ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค! )
JPQL N+1 ๋ฌธ์ ๋ฅผ fetch join ์ผ๋ก ๋ถ๋ถ์ ์ผ๋ก ํด๊ฒฐ์ํฌ ์ ์๋ค.
fetch join์ ์ฌ์ฉํ๋ฉด ํ๋ฐฉ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค์, ์ดํ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด๋ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ง ์๋๋ค.
List<Member> list = em.createQuery("select m from Member m join fetch m.team", Member.class)
.getResultList();
์ง์ฐ ๋ก๋ฉ ํ์ฉ
- Member์ Team์ ์์ฃผ ํจ๊ป ์ฌ์ฉ ? ์ฆ์ ๋ก๋ฉ
- Member์ Order๋ ๊ฐ๋ ์ฌ์ฉ -> ์ง์ฐ ๋ก๋ฉ
- Order์ Product๋ ์์ฃผ ํจ๊ป ์ฌ์ฉ -> ์ฆ์ ๋ก๋ฉ
๋ง์ง๋ง์ผ๋ก..
- ๋ชจ๋ ์ฐ๊ด๊ด๊ณ์ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํด๋ผ.
- ์ค๋ฌด์์ ์ฆ์ ๋ก๋ฉ์ ์ฌ์ฉํ์ง ๋ง๋ผ. ( ์์๋ ๋ชปํ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ ์ด๋ ต๋ค.)
- JPQL fetch ์กฐ์ธ์ด๋, ์ํฐํฐ ๊ทธ๋ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํด๋ผ.