์ฐ๊ด๋ ์ํฐํฐ์ ๋ํด ์ง์ฐ๋ก๋ฉ์ผ๋ก ์ค์ ์ ํด์ฃผ๋ฉด ์ผ๋ฐ์ ์ธ ์กฐํ ์ฟผ๋ฆฌ์์๋ ์ฐ๊ด๋ ์ํฐํฐ๊น์ง ์กฐํํด์ค์ง ์๊ณ ์ฐ๊ด๋ ์ํฐํฐ๋ ๊ฐ์ง ํ๋ก์ ๊ฐ์ฒด๋ก ์ค์ ์ด ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ฐ๊ด๋ ์ํฐํฐ์ ๊ฐ์ ์ ๊ทผํด์ผํ ๋ ๋ฐ์ดํฐ๋ง๋ค ์ฟผ๋ฆฌ๊ฐ ํ๋ฒ์ฉ ๋ ์คํ๋์ด N+1 ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ฒ์ด Fetch Join ์ด๋ค. ์ฐ๊ด๋ ๊ฒ๋ค์ ํ๋ฒ์ ๋ค ๊ฐ์ ธ์ค๋ ๊ฒ์ผ๋ก ๊ฐ์ง ํ๋ก์ ๊ฐ์ฒด๊ฐ ์๋๋ผ ์ฐ๊ด๋ ์ํฐํฐ๊น์ง ์ค์ ๊ฐ์ผ๋ก ์ ๋ถ ์ฑ์์ค๋ค. (์ฆ, ์กฐ์ธ๋ง ํ๋ ๊ฒ์ด ์๋๋ผ select ์ ์ ์๋ ๊ฐ๋ค๋ ์ ๋ถ ๋ฃ์ด์ฃผ๋ ๊ฒ)
EntityGraph
- data jpa๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ fetch join ์ jpql ์์ด ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
JpaRepository๋ฅผ ์์๋ฐ๋ repository๊ฐ ์์ ๋
@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();
์ด๋ ๊ฒ ํด์ค ๊ฒฝ์ฐ findAll์ ํ ๋ ์ฐ๊ด๋ ์ํฐํฐ์ธ team์ ์ ๋ณด๋ฅผ fetch joinํด์ ์ ๋ถ ๊ฐ์ ธ์จ๋ค.
@EntityGraph(attributePaths = {"team"})
@Query("select m from Member m")
List<Member> findMemberEntityGraph();
์์ ๊ฐ์ด jpql์ fetch join์ ์ถ๊ฐํด์ค ์๋ ์๋ค.
@EntityGraph(attributePaths = {"team"})
List<Member> findByUsername(String username)
๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆด ๋๋ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
'BACKEND > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Securirty 6 ์ด์ ๋ฒ์ ์์ h2-console 403 ์๋ฌ ๋๋ ๋ฌธ์ (2) | 2023.01.23 |
---|---|
Kotlin Kotest @beforeSpec @beforeContainer @beforeTest @beforeEach ์ฐจ์ด (2) | 2022.09.19 |
Spring Mockito when().thenReturn ๊ณผ doReturn.when()์ ์ฐจ์ด (0) | 2022.08.01 |
[Spring] detached entity passed to persist ์๋ฌ (0) | 2022.05.26 |
์ธ์ ๊ณผ JWT์ ์ฐจ์ด (0) | 2022.05.23 |