/api/board/{id}
) ์์ฒญ ์, ํด๋น ๊ฒ์๊ธ์ ์์ฑ์(member
)์ ๋๊ธ ๋ฆฌ์คํธ(comments
)๋ฅผ ํจ๊ป ์กฐํํด์ผ ํจ.Post
ย ์ํฐํฐ๋ฅผ ์กฐํํ ํ,ย comments
,ย member
ย ํ๋๋ฅผ ์ง์ฐ ๋ก๋ฉ(LAZY
)์ผ๋ก ์ค์ ํ๋๋, ๊ฐ ์ฐ๊ด๋ ์ํฐํฐ๋ง๋ค ๋ณ๋์ ์ฟผ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ์คํ๋์ดย N+1 ๋ฌธ์ ๊ฐ ๋ฐ์ํจ.JPA๋ ์ฐ๊ด ์ํฐํฐ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋กย ์ง์ฐ ๋ก๋ฉ(LAZY)ย ํ๋ฏ๋ก,ย post.getComments()
ย ํน์ย post.getMember()
๋ฅผ ํธ์ถํ ๋๋ง๋คย ๋ณ๋์ SELECT ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํจ.
์ด๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ํจํด์ด ๋ฐ์ํจ:
1๊ฐ์ ๊ฒ์๊ธ(Post) ์กฐํ โ ๋๊ธ(Comment) N๊ฐ ์กฐํ โ N๊ฐ์ SELECT ์ฟผ๋ฆฌ ์ถ๊ฐ ์คํ
๊ฒฐ๊ณผ์ ์ผ๋ก,ย 1 + N๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์ฌ ์ฑ๋ฅ ์ ํ ์ ๋ฐ.
@EntityGraph
ย ์ฌ์ฉ// PostRepository.java
@EntityGraph(attributePaths = {"comments", "member"})
Optional<Post> findById(@Nullable Long id);
@EntityGraph
๋ฅผ ํตํด JPA์๊ฒย ์ฐ๊ด๋ ์ํฐํฐ๋ ์ฆ์ ๋ก๋ฉ(EAGER)ํ๋๋ก ๋ช
์.select
p1_0.id,
p1_0.content,
p1_0.createdAt,
m1_0.id,
m1_0.createdAt,
m1_0.email,
m1_0.loginType,
m1_0.nickname,
m1_0.password,
m1_0.providerId,
m1_0.updatedAt,
m1_0.username,
p1_0.title,
p1_0.updatedAt,
p1_0.viewCount,
c1_0.post_id,
c1_0.id,
c1_0.content,
c1_0.createdAt,
c1_0.member_id,
c1_0.updatedAt
from
post p1_0
left join
member m1_0 on m1_0.id = p1_0.member_id
left join
comment c1_0 on p1_0.id = c1_0.post_id
where
p1_0.id = ?
Post
,ย Member
,ย Comment
ย ๋ฐ์ดํฐ๋ฅผย ๋จ์ผ ์ฟผ๋ฆฌ๋ก ๋ชจ๋ ์กฐํํจ.