FetchType์ด๋?
FetchType ๐ค ?
์๋ฐ์์ DB์์ ์ํธ ์์ฉ์ ์ํด ์๋ฐ ํผ์์คํด์ค API(JPA)๋ฅผ ์ฌ์ฉํ ๋, FetchType
์ ์ํฐํฐ ๊ฐ์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ค.
- ์ํฐํฐ ๊ฐ์ ์ฐ๊ด๊ด๊ณ ๋งคํ์ด ๋์ด ์์ผ๋ฉด(FK) ๊ทธ ํ ์ํฐํฐ๋ฅผ ์กฐํ์ ๋ค๋ฅธ ์ํฐํฐ๋ฅผ ์กฐํํ๊ฒ ๋๋๋ฐ, ์ด๋ ๋ค๋ฅธ ์ํฐํฐ๋ฅผ ์ด๋ป๊ฒ ๋ถ๋ฌ์ฌ ๊ฒ์ธ๊ฐ๋ฅผ ์ค์
- JPA์์๋ ๋ ๊ฐ์ง
FetchType
์ด ์๋ค. EAGER OR LAZY - EAGER : ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ฆ์ ๋ก๋ฉ. ๋ฐ๋ผ์ ํด๋น ์ํฐํฐ๊ฐ ๋ก๋๋๋ ์์ ์ ์ฐ๊ด๋ ์ํฐํฐ๋ ํจ๊ป ๋ก๋
์๋ฅผ ๋ค์ด, ๊ฒ์ํ ํ๋ก์ ํธ์์ ๊ฒ์๋ฌผ(Board)์ ๋๊ธ(Reply)๊ฐ ์ฐ๊ด๊ด๊ณ๊ฐ ์๋ค๊ณ ํ ๋ ํ ๊ฒ์๋ฌผ ์์ธ๋ณด๊ธฐํ๋ฉด์์ ๊ฒ์๋ฌผ๊ณผ ๋๊ธ ๋ชจ๋ ํ๊บผ๋ฒ์ ๋ณด์ฌ์ง ๋ ์ฌ์ฉ๊ฐ๋ฅ
-
LAZY : ์ฐ๊ด๋ ์ํฐํฐ๋ ์ค์ ๋ก ์ฌ์ฉ๋ ๋๊น์ง ๋ก๋ฉ๋์ง ์์. ๋ฐ๋ผ์ ์ฐ๊ด๋ ์ํฐํฐ๊ฐ ํ์ํ ์์ ์ ๋ก๋ฉ๋์ด ์ฑ๋ฅ์ ์ต์ ํํจ.
์๋ฅผ ๋ค์ด, ๊ฒ์ํ ํ๋ก์ ํธ์์ ๊ฒ์๋ฌผ(Board)์ ๋๊ธ(Reply)๊ฐ ์ฐ๊ด๊ด๊ณ๊ฐ ์๋ค๊ณ ํ ๋ ํ ๊ฒ์๋ฌผ ์์ธ๋ณด๊ธฐํ๋ฉด์์ ๊ฒ์๋ฌผ์ ๋จผ์ ๋ถ๋ฌ์์ง๊ณ ๋๊ธ์ ํผ์ณ๋ณด๊ธฐ ๊ธฐ๋ฅ์ ์ด์ฉํด์ ๋ฐ๋ก ๋ณด์ฌ์ง ํ์๊ฐ ์์ ๋ ์ฌ์ฉ๊ฐ๋ฅ
- JPA FetchType default๊ฐ์
@xxToOne : EAGER
,@xxToMany : LAZY
1. EAGER (์ฆ์๋ก๋ฉ)
๋ค์๊ณผ ๊ฐ์ด Member ์ํฐํฐ์ Team ์ํฐํฐ๊ฐ N:1 ๋งคํ์ผ๋ก ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๋ค.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
@ManyToOne(fetch = FetchType.EAGER) //Team์ ์กฐํํ ๋ ์ฆ์๋ก๋ฉ์ ์ฌ์ฉํ๊ณ๋ค!
@JoinColumn(name = "team_id")
Team team;
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String teamname;
}
JPQL๋ก Member 1๊ฑด ์กฐํ
Member findMember = em.createQuery("select m from Member m", Member.class).getSingleResult();
์ค์ SQL ์ฝ๋
//๋ฉค๋ฒ๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ
select
member0_.id as id1_0_,
member0_.team_id as team_id3_0_,
member0_.username as username2_0_
from
Member member0_
//ํ์ ์กฐํํ๋ ์ฟผ๋ฆฌ
select
team0_.id as id1_3_0_,
team0_.name as name2_3_0_
from
Team team0_
where
team0_.id=?
๋ค์๊ณผ ๊ฐ์ด ์ฆ์ ๋ก๋ฉ(EAGER) ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด Member๋ฅผ ์กฐํํ๋ ์์ ์ ๋ฐ๋ก Team๊น์ง ๋ถ๋ฌ์ค๋ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค ํ๊บผ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
2. EAGER (์ฆ์๋ก๋ฉ)
์๋์ ๊ฐ์ด ์ง์ฐ ๋ก๋ฉ์ผ๋ก ์ค์ ํ๊ณ Member๋ฅผ ์กฐํํด๋ณด๋ฉด ์ฆ์ ๋ก๋ฉ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ Team์ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋์ง ์๊ณ Member๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ง ๋๊ฐ๊ณ , ์ค์ ๋ก ํ์ ์ฌ์ฉํ๋ ์์ ์ Team์ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋ค.
@ManyToOne(fetch = FetchType.LAZY) //Team์ ์กฐํํ ๋ ์ง์ฐ๋ก๋ฉ์ ์ฌ์ฉํ๊ณ๋ค!
@JoinColumn(name = "team_id")
Team team;
JPQL๋ก Member์กฐํ
Member findMember = em.createQuery("select m from Member m", Member.class).getSingleResult();
์ค์ SQL ์ฝ๋
//Team์ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ง ์์!
select
member0_.id as id1_0_,
member0_.team_id as team_id3_0_,
member0_.username as username2_0_
from
Member member0_
์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ๋ฉด Member๋ฅผ ์กฐํํ๋ ์์ ์ด ์๋ ์ค์ Team์ ์ฌ์ฉํ๋ ์์ ์ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋๋ก ํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
์ ์์ ์ ์ฆ์ ๋ก๋ฉ์์๋ Member์ ์ฐ๊ด๋ Team์ด 1๊ฐ์ฌ์ Team์ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ 1๊ฐ ๋๊ฐ์ง๋ง, ๋ง์ฝ Member๋ฅผ ์กฐํํ๋ JPQL์ ๋ ๋ ธ๋๋ฐ ์ฐ๊ด๋ Team์ด 1000๊ฐ๋ผ๋ฉด? Member๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ํ๋ ๋ ๋ ธ์ ๋ฟ์ธ๋ฐ Team์ ์กฐํํ๋ SQL ์ฟผ๋ฆฌ 1000๊ฐ๊ฐ ์ถ๊ฐ๋ก ๋๊ฐ๊ฒ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ๊ธ์ ์ด๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ