์๋ฆผ ๋ชฉ๋ก ์กฐํ ์ฑ๋ฅ์ ๊ณ ๋ คํ Fetch ์ ๋ต ์๋ฆฝ (@EntityGraph)
์๋ฆผ ์์คํ
(Notification)์ ๊ธฐํํ๋ฉด์ ๊ฐ์ฅ ์ฐ๋ ค๋์๋ ๋ถ๋ถ์ โ์ฌ์ฉ์๊ฐ ์๋ฆผ ๋ชฉ๋ก์ ์กฐํํ ๋ ๋ฐ์ํ DB ๋ถํโ ์์ต๋๋ค. ์๋ฆผ์ ๋จ์ ํ
์คํธ ์ ๋ณด๋ฟ๋ง ์๋๋ผ, โ๋๊ฐ(Sender)โ ๋ณด๋๋์ง์ ๋ํ ์ ๋ณด๊ฐ ํ์์ ์ผ๋ก ํจ๊ป ๋
ธ์ถ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
1. ๊ธฐํ ๋จ๊ณ์์์ ๊ณ ๋ ค์ฌํญ: N+1 ๋ฌธ์ ์ ์ ์ ์ ๋ฐฉ์ด
JPA๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ด ๊ด๊ณ(ManyToOne)๋ฅผ ๋งบ์ ๋, ๊ธฐ๋ณธ ์ ๋ต์ธ Lazy Loading(์ง์ฐ ๋ก๋ฉ)์ ๊ทธ๋๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค๊ฐ ์์๋์์ต๋๋ค.
-
์๋ฆผ ๋ชฉ๋ก ์กฐํ ์์ฒญ: ์ฌ์ฉ์๊ฐ ์๋ฆผํจ์ ๋ค์ด์ต๋๋ค.
-
์๋ฆผ ๋ฐ์ดํฐ ๋ก๋: DB์์ ์ต๊ทผ ์๋ฆผ 20๊ฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. (
SELECT * FROM notification ...) -
๋ฐ์ ์ ์ ๋ณด ๋ก๋: 20๊ฐ์ ์๋ฆผ์ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ ์ํด, ๊ฐ ์๋ฆผ๋ง๋ค ์ฐ๊ฒฐ๋
Sender(User)์ ๋ณด๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ 20๋ฒ ์ถ๊ฐ๋ก ๋ฐ์ํฉ๋๋ค.
์ด๋ ์กฐํ ํ ๋ฒ์ ์ด 21๋ฒ(1+N)์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋ ๋นํจ์จ์ ์ธ ๊ตฌ์กฐ์ด๋ฉฐ, ์ฌ์ฉ์๊ฐ ๋ชฐ๋ฆด ๊ฒฝ์ฐ DB ์ปค๋ฅ์ ํ์ ๋น ๋ฅด๊ฒ ๊ณ ๊ฐ์ํฌ ์ํ์ด ์์ต๋๋ค.
2. ๊ตฌํ ์ ๋ต: @EntityGraph๋ฅผ ํตํ Eager Fetching
์ฐ๋ฆฌ๋ ์๋ฆผ ์กฐํ ์ Sender ์ ๋ณด๊ฐ โ์ ํ์ โ ์ด ์๋๋ผ โํ์์ โ ์ผ๋ก ํ์ํ๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ต๋๋ค. ๋ฐ๋ผ์ ์ฟผ๋ฆฌ ์คํ ์์ ์ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๊ฐ์ ธ์ค๋ Fetch Join ์ ๋ต์ ์ฑํํ์ต๋๋ค.
๐ Implementation Code (NotificationRepository.java)
public interface NotificationRepository extends JpaRepository<NotificationEntity, Long> {
// [Strategy] ์๋ฆผ ์กฐํ ์ Sender ์ ๋ณด๋ ํ์์ด๋ฏ๋ก Fetch Join์ผ๋ก ํ ๋ฒ์ ์กฐํ
// JPQL์ ์ง์ ์ง๋ ๊ฒ๋ณด๋ค ๊ฐ๋
์ฑ์ด ์ข์ @EntityGraph ์ฌ์ฉ
@EntityGraph(attributePaths = {"sender"})
Slice<NotificationEntity> findAllByReceiverUserIdOrderByCreatedAtDesc(Long receiverId, Pageable pageable);
}๐ก ์ค๊ณ ์๋ ๋ฐ ํจ๊ณผ
-
์ฟผ๋ฆฌ ๋น์ฉ ์ต์ํ:
@EntityGraph๋ ๋ด๋ถ์ ์ผ๋กLEFT OUTER JOIN์ ์ํํฉ๋๋ค. N๋ฒ์ ๋คํธ์ํฌ ์๋ณต ๋น์ฉ์ ๋จ 1๋ฒ์ผ๋ก ์ค์ฌ ์๋ต ์๋๋ฅผ ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ํ์ต๋๋ค. -
์ ์ง๋ณด์์ฑ: JPQL๋ก
SELECT n FROM NotificationEntity n JOIN FETCH n.sender ...๋ผ๊ณ ๊ธธ๊ฒ ์์ฑํ๋ ๋์ , ์ด๋ ธํ ์ด์ ํ๋๋ก **โ์ด ์ฟผ๋ฆฌ๋ Sender ๋ฐ์ดํฐ๋ ์ฆ์ ํ์ํ๋คโ**๋ ์๋๋ฅผ ๋ช ํํ ๋๋ฌ๋์ต๋๋ค.
โ๏ธ ๋น์ : ๋ฐฐ๋ฌ ๊ธฐ์ฌ์ ํจ์จ์ ๋์
์ํฉ: ์ํํธ 101ํธ๋ถํฐ 120ํธ๊น์ง ํ๋ฐฐ(์๋ฆผ)๋ฅผ ๋ฐฐ๋ฌํด์ผ ํฉ๋๋ค.
๊ธฐ๋ณธ ์ ๋ต(Lazy): ๋ฐฐ๋ฌ ๊ธฐ์ฌ๊ฐ 101ํธ์ ๋ฌผ๊ฑด์ ์ฃผ๊ณ , ๋ค์ ๋ฌผ๋ฅ์ผํฐ(DB)๋ก ๋์๊ฐ์ 102ํธ ๋ฌผ๊ฑด์ ๊ฐ์ ธ์ค๋ ์์ ๋๋ค. (์ด 21๋ฒ ์๋ณต)
์ฑํํ ์ ๋ต(EntityGraph): ์ถ๋ฐํ ๋ ์ปค๋ค๋ ์นดํธ์ 101ํธ~120ํธ ๋ฌผ๊ฑด๊ณผ ์์ทจ์ธ ์ ๋ณด(Sender)๋ฅผ ํ ๋ฒ์ ์ค์ด์(Join) ์ํํธ๋ก ์ต๋๋ค. (๋จ 1๋ฒ ์ด๋)
์ด๋ฌํ ์ค๊ณ๋ฅผ ํตํด ํธ๋ํฝ์ด ์ฆ๊ฐํด๋ DB ๋ถํ๋ฅผ ์ผ์ ์์ค์ผ๋ก ์ ์งํ ์ ์๋ ์์ ์ฑ์ ํ๋ณดํ์ต๋๋ค.