์ฆ์ ๋ก๋ฉ (EAGER)
- ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ํจ๊ป ๋ฐ๋ก ์กฐํ
- ์กฐํ ์์ ์ ์กฐ์ธ์ด ๋ฐ์ํ๊ฑฐ๋ ์ถ๊ฐ ์ฟผ๋ฆฌ๊ฐ ์คํ
@ManyToOne(fetch = FetchType.EAGER)
์ง์ฐ ๋ก๋ฉ (LAZY)
- ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ ๋ ์กฐํ
- ์ฒ์์๋ ํ๋ก์ ๊ฐ์ฒด์๋ง ๋ฃ์ด๋๊ณ ํ๋ ์ ๊ทผ ์์ ์ DB ์กฐํ
@ManyToOne(fetch = FetchType.LAZY)
์ค์ SQL ์ฐจ์ด
- ์์
- OAuthAccount -> Member (ManyToOne)
- EAGER
- ๋ฌด์กฐ๊ฑด Member๊น์ง ๊ฐ์ด ์กฐํ
OAuthAccount account = repository.findById(1L);
SELECT oa.*, u.*
FROM oauth_accounts oa
LEFT JOIN users u ON oa.user_id = u.id
WHERE oa.id = 1;
- LAZY
- Member๋ ์์ง ์กฐํ ์ ๋จ
OAuthAccount account = repository.findById(1L);
SELECT * FROM oauth_accounts WHERE id = 1;
- Member๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ ๋
account.getMember().getEmail();
SELECT * FROM users WHERE id = ?;
ํ๋ก์(Proxy)
- JPA๋ ์ค์ Member ๋์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋จผ์ ๋ฃ์ด๋
- ์ด ๊ฐ์ง ๊ฐ์ฒด๋
- id ๊ฐ์ ์๊ณ ์์
- ์ค์ ํ๋ ์ ๊ทผ ์ DB ์กฐํ
LAZY๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ ์ด์
- ๋ถํ์ํ ์กฐ์ธ ๋ฐฉ์ง
- ๋ชจ๋ ์ฐ๊ด ์ํฐํฐ๋ฅผ ๋ค ๊ฐ์ ธ์ค๋ฉด ์ฑ๋ฅ ๋ญ๋น
- N+1 ๋ฌธ์ ์๋ฐฉ
- EAGER๊ฐ ๋ง์์ง๋ฉด ์ฐ์์ ์ผ๋ก ์กฐ์ธ์ด ๋ฐ์ํ๊ฑฐ๋ ์์ ๋ชปํ ์ถ๊ฐ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์
- ์ค๊ณ ์ ์ฐ์ฑ
- ์ค์ ๋ก ํ์ํ ๋ฐ์ดํฐ๋ง ์กฐํํ๋๋ก JPQL์ด๋ fetch join์ผ๋ก ์ ์ด ๊ฐ๋ฅ
N+1 ๋ฌธ์ ๋
- ์๋ฅผ ๋ค์ด ํ์ 10๋ช
์ ์กฐํํ๊ณ ๊ฐ ํ์์ ๊ฒ์๊ธ์ ์ ๊ทผํ๋ฉด
- 1+10 = 11 ๋ฒ ์ฟผ๋ฆฌ --> ์ด๊ฒ N+1 ๋ฌธ์
SELECT * FROM member;
SELECT * FROM post WHERE member_id = 1;
SELECT * FROM post WHERE member_id = 2;
...