์ผ๋ฐ JPA์ Spring Data JPA์ ์ฐจ์ด์ ์ด ๋ฌด์์ธ๊ฐ์?
๊ธฐ์กด JPA๋ EntityManager๋ฅผ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ์ง๋ง, Spring Data JPA๋ JPA๋ฅผ ํ๋จ๊ณ ๋ ์ถ์ํ ์ํจ Repository ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฆ JPA๋ฅผ Spring Data JPA์ Repository์ ๊ตฌํ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
Hibernate๊ฐ ๋ฌด์์ธ์ง ์ค๋ช ํด์ฃผ์ธ์.
JPA์ ๊ตฌํ์ฒด์ค ํ๋๋ก SQL์ ์ง์ ์ฌ์ฉํ์ง ์๊ณ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์ ์์ต๋๋ค.
ํ์ง๋ง Hibernate๊ฐ SQL์ ์ง์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํด์ JDBC API๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์๋๋ฉฐ, ๋ฉ์๋ ๋ด๋ถ์์ JDBC API๊ฐ ๋์ํ๊ณ ์์ต๋๋ค.
JPA ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ๊ฐ์ง(Dirty Checking)์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
๋ณ๊ฒฝ ๊ฐ์ง๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ DB์ ๋ณด๋ด๊ธฐ ์ ์์์ฑ ์ปจํ ์คํธ์ ๋ณํ๊ฐ ์์๋์ง ํ์ธ ํ ํ ๋ณํ๊ฐ ์์๋ค๋ฉด ์์ ์ ํ ํ DB์ ๋ณด๋ด๋ ์์ ์ ๋๋ค.
transaction.commit ์ด ๋ฐ์ํ๋ฉด ์๋์ผ๋ก em.flush ๊ฐ ์๋๋๋ฉฐ 1์ฐจ ์บ์์ ์ ์ฅ๋์๋ ์์์ฑ ์ปจํ
์คํธ๊ฐ DB๋ก ๋ค์ด๊ฐ๊ฒ ๋๋๋ฐ, ๋ค์ด๊ฐ๊ธฐ์ ์ 1์ฐจ ์บ์ ์ ์ํฐํฐ์ ์ค๋
์ท(๋งจ ์ฒ์์ ์์์ฑ ์ปจํ
์คํธ์ ๋ค์ด์จ ๊ฐ์ฒด ์ํ)๋ฅผ ๋น๊ตํฉ๋๋ค. ๋ง์ฝ ์ด ๋์ด ๋ค๋ฅด๋ค๋ฉด SQL ์ ์ฅ์์ update ์ฟผ๋ฆฌ๋ฌธ์ ์ถ๊ฐํ๊ณ commit์ ํฉ๋๋ค.
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
๋์์ ํธ๋์ญ์ ์์ ์ด ์ด๋ฃจ์ด์ง ๋, A ํธ๋์ญ์ ์์ B ํธ๋์ญ์ ์ ์กฐํ์ค์ด๊ฑฐ๋ ๋ณ๊ฒฝ์ค์ธ ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ์ ํ์ฉํ ์ง ๋ง์ง์ ๋ํ ์์ค์ ๊ฒฐ์ ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
Read-Uncommited, Read-Committed, Repatable-Read, Serializable ๋ค๊ฐ์ง ์์ค์ด ์กด์ฌํฉ๋๋ค.
- Read-Uncommited: ๋ค๋ฅธ Transaction์์ ์ ๋ฐ์ดํธ๊ฐ ์ปค๋ฐ๋์ง ์์๋๋ผ๋ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค.
- Read-Commited: ํธ๋์ญ์ ์ด ์์๋๊ธฐ ์ ์ ์ปค๋ฐ๋ ๋ด์ฉ๋ง ๋ฐ์๋ ๋ฐ์ดํฐ์ ๋ํด์๋ง ์กฐํํ ์ ์๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค.
- Repatable-Read: ํธ๋์ญ์ ๋ด์์ ์กฐํํ๋ ๋ฐ์ดํฐ์ ๋ํด ๊ณต์ ๋ฝ์ ๊ฑธ์ด ์ ๊ธ๋ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ์ด ๋ณด์ฅ๋๋ค.
- Serializable: ๊ฐ์ฅ ๋จ์ํ๋ฉด์ ๊ฐ์ฅ ์๊ฒฉํ ๊ด๋ฆฌ ์์ค์ด๋ค. ****ํธ๋์ญ์ ๋ด์์์ Select๋ ์์๋ค์ ๊ณต์ ์ ๊ธ๋๋ค
N+1 ๋ฌธ์ ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
์ฐ๊ด ๊ด๊ณ๊ฐ ์ค์ ๋ ์ํฐํฐ๋ฅผ ์กฐํํ ๊ฒฝ์ฐ์ ์กฐํ๋ ๋ฐ์ดํฐ ๊ฐฏ์(n) ๋งํผ ์ฐ๊ด๊ด๊ณ์ ์กฐํ ์ฟผ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ๋ฐ์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ํ์์ผ๋ก,1๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ธ์ ๋ ์๋ํ์ง ์์ N๋ฒ์ ์ฟผ๋ฆฌ๊ฐ ์ถ๊ฐ์ ์ผ๋ก ์คํ๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
EAGER(์ฆ์ ๋ก๋ฉ)์ธ ๊ฒฝ์ฐ
1. JPQL์์ ๋ง๋ SQL์ ํตํด๋ฐ์ดํฐ(1)๋ฅผ ์กฐํ
2. ์ดํ JPA์์ EAGER ์ ๋ต์ ๊ฐ์ง๊ณ ํด๋น ๋ฐ์ดํฐ์ ์ฐ๊ด ๊ด๊ณ์ธํ์ ์ํฐํฐ๋ค(N)์ ์ถ๊ฐ ์กฐํ
3. 2๋ฒ ๊ณผ์ ์ผ๋ก N + 1 ๋ฌธ์ ๋ฐ์
LAZY(์ง์ฐ ๋ก๋ฉ)์ธ ๊ฒฝ์ฐ
1. JPQL์์ ๋ง๋ SQL์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์กฐํ
2. JPA์์ Fetch ์ ๋ต์ ๊ฐ์ง์ง๋ง, ์ง์ฐ ๋ก๋ฉ์ด๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ ์กฐํ๋ ํ์ง ์์
3. ํ์ง๋ง, ํ์ ์ํฐํฐ๋ฅผ ๊ฐ์ง๊ณ ์์
ํ๊ฒ ๋๋ฉด ์ถ๊ฐ ์กฐํ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ N + 1 ๋ฌธ์ ๋ฐ์
์ง์ฐ ๋ก๋ฉ๊ณผ ์ฆ์ ๋ก๋ฉ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
์ง์ฐ๋ก๋ฉ ์ ์ฉ ์ DB๊ฐ ์๋ ํ๋ก์์์ ๊ฐ์ ธ์จ๋ค. ์ง์ฐ๋ก๋ฉ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด Member์ Team์ด ๊ฐ๊ฐ ๋ถ๋ฆฌ๋์ด Member๋ DB๋ฅผ ์กฐํํ๊ณ , Team์ ํ๋ก์๋ฅผ ์กฐํํ๋ค.
์ฆ์๋ก๋ฉ์ ์ค์ DB์์ ํ ๋ฐฉ์ ์กฐํ fetch = FetchType.EAGER๋ก ๋ฌถ์ฌ์์ ๊ฒฝ์ฐ Member๋ง ์กฐํ๋ฅผ ํ์๋ก ํ์ผ๋, Team ์ ๋ณด๋ ๊ฐ์ด ๋์ค๊ธฐ ๋๋ฌธ ์ด๋ฌธ์ ๊ฐ n + 1๋ก ๋ฐ์ํ ์ ์๋ค.