JPA์ ์์์ฑ ์ปจํ ์คํธ์ ๋ํด ์์๋ณด์
Spring Boot์์ JPA๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์์ํ๋ฉด ๊ฐ์ฅ ์์ฃผ ๋ฃ๋ ๊ฐ๋
์ค ํ๋๊ฐ ๋ฐ๋ก ์์์ฑ ์ปจํ
์คํธ๋ค.
์ฒ์์๋ ๊ทธ๋ฅ Entity๋ฅผ ์ ์ฅํด๋๋ ๊ณต๊ฐ ์ ๋๋ก๋ง ์๊ฐํ๋๋ฐ, ์ ๋ฆฌํด๋ณด๋ JPA์ ํต์ฌ ๋์ ๋๋ถ๋ถ์ด ์ด ์์์ฑ ์ปจํ
์คํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฃจ์ด์ง๊ณ ์์๋ค.
์ด๋ฒ ๊ธ์์๋ JPA๊ฐ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ์ค์ํ์ง๋ฅผ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
JPA๋ Java Persistence API์ ์ฝ์๋ค.
์๋ฐ์์ ORM ๊ธฐ์ ์ ์ฌ์ฉํ๊ธฐ ์ํ ํ์ค ๋ช
์ธ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ORM์ ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋งคํํ๋ ๊ธฐ์ ์ด๋ค.
์ฆ, ์๋ฐ ๊ฐ์ฒด๋ฅผ ํ ์ด๋ธ๊ณผ ์ฐ๊ฒฐํด์ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ฐฉ์์ด๋ค.
์์ ์ฒ๋ผ JDBC๋ฅผ ์ฌ์ฉํ ๋๋ ๋ค์ ๊ณผ์ ์ ๋ฐ๋ณตํด์ผ ํ๋ค.
๋ฐ๋ฉด JPA๋ฅผ ์ฌ์ฉํ๋ฉด Entity์ ํ ์ด๋ธ์ ๋งคํํด๋๊ณ , ๊ฐ์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
์ฐธ๊ณ ๋ก JPA๋ ๊ตฌํ์ฒด๊ฐ ์๋๋ผ ๋ช
์ธ์ด๊ธฐ ๋๋ฌธ์, ์ค์ ๋ก๋ Hibernate ๊ฐ์ ๊ตฌํ์ฒด๊ฐ JPA๋ฅผ ๋์ํ๊ฒ ํด์ค๋ค.
hibernate๊ฐ ์ฌ์ค์ ํ์ค์ด๋ค.
์์์ฑ ์ปจํ ์คํธ๋ Entity ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ๊ณต๊ฐ์ด๋ค.
JPA๋ DB์ ๋ฐ๋ก SQL์ ๋ ๋ฆฌ๋ ๋ฐฉ์์ด ์๋๋ผ, ์ค๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋๊ณ Entity๋ฅผ ๊ด๋ฆฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ค๋ฃจ๋ ๊ฐ์ฒด๊ฐ ๋ฐ๋ก EntityManager๋ค.
์ฒ์์ ๊ทธ๋ฅ DB์ ๋ฐ๋ก ์ ์ฅํ๋ฉด ๋๋ ๊ฑฐ ์๋๊ฐ? ์ถ์๋๋ฐ, ์์์ฑ ์ปจํ ์คํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ JPA๋ ๋จ์ CRUD๋ฅผ ๋์ด์ ์ฌ๋ฌ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์๋ค.
์์์ฑ ์ปจํ ์คํธ ๋ด๋ถ์๋ 1์ฐจ ์บ์๊ฐ ์๋ค.
Entity๋ฅผ ์กฐํํ๋ฉด ์ด ์บ์์ ์ ์ฅ๋๊ณ , ๊ฐ์ ํธ๋์ญ์ ์์์ ๊ฐ์ Entity๋ฅผ ๋ค์ ์กฐํํ ๋๋ DB๋ฅผ ๋ค์ ์กฐํํ์ง ์๊ณ ์บ์์์ ๊ฐ์ ธ์จ๋ค.
์ฒ์ ์กฐํํ ๋๋ DB ์ ๊ทผ, ๊ฐ์ ํธ๋์ญ์ ์์์ ๋ค์ ์กฐํํ ๋๋ ์บ์์์ ๋ฐํ
์ด ๊ธฐ๋ฅ์ ์ฅ์ ์ ๋จ์ํ ์กฐํ ์ฑ๋ฅ๋ง์ด ์๋๋ค.
๊ฐ์ ํธ๋์ญ์
์์์๋ ๊ฐ์ Entity๋ฅผ ๋ค์ ์กฐํํ์ ๋ ๊ฐ์ฒด ๋์ผ์ฑ๋ ๋ณด์ฅ๋๋ค.
์ฆ, ๊ฐ๋ง ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋๋ผ ์ ๋ง ๊ฐ์ ๊ฐ์ฒด๋ก ๊ด๋ฆฌ๋๋ค๋ ์ ์ด ์ค์ํ๋ค.
JPA๋ persist()๋ฅผ ํธ์ถํ๋ค๊ณ ํด์ ๋ฐ๋ก INSERT SQL์ ์คํํ์ง ์๋๋ค.
์ผ๋จ ์์์ฑ ์ปจํ ์คํธ์ Entity๋ฅผ ์ ์ฅํ๊ณ , ์คํํ SQL์ ๋ด๋ถ์ ๋ชจ์๋๋ค. ๊ทธ๋ฆฌ๊ณ flush() ๋๋ ํธ๋์ญ์ commit ์์ ์ ํ ๋ฒ์ DB๋ก ๋ณด๋ธ๋ค.
ใด> ์ด๊ฑธ ์ฐ๊ธฐ ์ง์ฐ์ด๋ผ๊ณ ํ๋ค.
์ฒ์์๋ ์ ์ฅ ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ฐ ์ DB์ ๋ฐ๋ก ๋ฐ์๋์ง ์๋์ง ํท๊ฐ๋ฆด ์ ์๋ค. ํ์ง๋ง ์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํธ๋์ญ์ ๋จ์๋ก SQL์ ๋ชจ์์ ์ฒ๋ฆฌํ ์ ์๊ณ , ์ค๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ํ ๋ฒ์ rollback ํ ์ ์๋ค.
์ฆ, ์ ํฉ์ฑ์ ์ ์งํ๋ฉด์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐฉ์์ด๋ค.
JPA์์ ์ ๋ง ์ ๊ธฐํ๋ ๋ถ๋ถ์ด ๋ฐ๋ก ๋ณ๊ฒฝ ๊ฐ์ง๋ค.
JPA๋ ์์ ์ํ์ Entity๋ฅผ ์กฐํํ ๋, ์ฒ์ ์ํ๋ฅผ ์ค๋ ์ท์ฒ๋ผ ์ ์ฅํด๋๋ค. ๊ทธ๋ฆฌ๊ณ ํธ๋์ญ์ commit ์์ ์ ํ์ฌ ์ํ์ ๋น๊ตํด์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ด ์์ผ๋ฉด UPDATE SQL์ ์๋์ผ๋ก ๋ง๋ค์ด์ค๋ค.
-> ์ง์ update() ๊ฐ์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์๋ ๋๋ค.
User user = em.find(User.class, 1L);
user.setName("๋ณ๊ฒฝ๋ ์ด๋ฆ");
์ด๋ ๊ฒ ๊ฐ๋ง ๋ฐ๊ฟ๋, ํธ๋์ญ์
์ด commit ๋ ๋ JPA๊ฐ ๋ณ๊ฒฝ์ ๊ฐ์งํด์ UPDATE SQL์ ์คํํ๋ค.
-> ์์์ฑ ์ปจํ
์คํธ๊ฐ Entity๋ฅผ ๊ณ์ ๊ด๋ฆฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
JPA์์ Entity๋ ์์์ฑ ์ปจํ ์คํธ์์ ๊ด๊ณ์ ๋ฐ๋ผ ์ํ๊ฐ ๋๋๋ค.
new ์ฐ์ฐ์๋ฅผ ํตํด ์ธ์คํด์คํ๋ Entity ๊ฐ์ฒด.
์์ง ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅ๋์ง ์์ ์ํ๋ผ JPA์ ๊ด๋ฆฌ๋ฅผ ๋ฐ์ง ์์.
์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์ด JPA๊ฐ ๊ด๋ฆฌํ๋ ์ํ
์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์ด ๊ด๋ฆฌ๋๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ. ๋์ด์ ๋ณ๊ฒฝ ๊ฐ์ง x
merge()๋ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ค์ ๊ด๋ฆฌํ๋ ๊ฒ ์๋๋ผ, ์ํ๋ฅผ ๋ณต์ฌํ ์๋ก์ด ์์ ๊ฐ์ฒด๋ฅผ ๋ฐํํจ.
์ญ์ ํ๊ธฐ๋ก ํ์๋ ์ํ. ํธ๋์ญ์ ์ปค๋ฐ ์ DELETE SQL ์คํ๋จ.
Entity ์ํ๋ฅผ ๋ณด๋ฉด ๊ฒฐ๊ตญ ํต์ฌ์ ํ๋๋ค.
์์ ์ํ์ผ ๋๋ง JPA๊ฐ Entity๋ฅผ ๊ด๋ฆฌํ๋ค๋ ์ ์ด๋ค.
์ฆ,1์ฐจ ์บ์, ์ฐ๊ธฐ ์ง์ฐ, ๋ณ๊ฒฝ ๊ฐ์ง ๋ชจ๋ ์์ ์ํ์ Entity๋ฅผ ๊ธฐ์ค์ผ๋ก ๋์ํ๋ค.
Spring Boot์์๋ JPA ์ฌ์ฉ์ ํ์ํ ์ค์ ์ ๋ง์ด ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค๋ค.
application.properties ๋๋ application.yml์ DB ์ ๋ณด๋ฅผ ์ค์ ํ๋ฉด JPA ํ๊ฒฝ์ด ๊ตฌ์ฑ๋จ.@PersistenceContext๋ฅผ ์ฌ์ฉํ๋ฉด EntityManager๋ฅผ ์ฃผ์
๋ฐ์ ์ฌ์ฉํ ์ ์์@PersistenceContext
private EntityManager em;
๊ทธ๋ฆฌ๊ณ Spring์์๋ @Transactional์ ์ฌ์ฉํด์ ํธ๋์ญ์
๋ฒ์๋ฅผ ์ง์ ํ ์ ์๋ค. ์ ์ ์ข
๋ฃ ์ commit, ์์ธ ๋ฐ์ ์ rollback ๋๋ ๊ตฌ์กฐ๋ค.
@Transactional
public void save() {}
๋ณดํต ์คํ๋ง ์ปจํ ์ด๋ ํ๊ฒฝ์์๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ํธ๋์ญ์ ๋ฒ์ ์์์ ํจ๊ป ๋์ํ๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค.
ํธ๋์ญ์
์์ โ ์์์ฑ ์ปจํ
์คํธ ์ฌ์ฉ โ ํธ๋์ญ์
์ข
๋ฃ
์ด ํ๋ฆ์ผ๋ก ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค.
๊ทธ๋์ ๋ณ๊ฒฝ ๊ฐ์ง๋ ๊ฒฐ๊ตญ ํธ๋์ญ์ ์ด ๋๋๋ ์์ ๊ณผ ์ฐ๊ฒฐ๋๊ณ , ์ฐ๊ธฐ ์ง์ฐ๋ commit ์์ ๊ณผ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐ๋๋ค.
์ด๋ฒ์ JPA๋ฅผ ์ ๋ฆฌํ๋ฉด์ ๋๋ ๊ฑด, JPA๋ ๋จ์ํ SQL์ ๋์ ์จ์ฃผ๋ ๊ธฐ์ ์ด ์๋๋ผ๋ ์ ์ด๋ค.
ํต์ฌ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํตํด Entity๋ฅผ ๊ด๋ฆฌํ๋ค๋ ๊ฒ์ด๊ณ , ๊ทธ ๋๋ถ์ ๊ฐ์ Entity๋ฅผ ์บ์๋ก ๊ด๋ฆฌํ๊ณ SQL ์คํ์ ์ง์ฐ์ํฌ ์ ์๊ณ ๊ฐ์ฒด ๊ฐ ๋ณ๊ฒฝ๋ง์ผ๋ก UPDATE๋ฅผ ๋ฐ์ํ ์ ์๋ค
์ฆ, JPA์ ํธ๋ฆฌํจ์ ๊ฒฐ๊ตญ ์์์ฑ ์ปจํ ์คํธ๊ฐ Entity๋ฅผ ๊ด๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๊ธฐ๋ฅ๋ค์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
์์ผ๋ก JPA๋ฅผ ์ฌ์ฉํ ๋๋ ๋จ์ํ save()๋ find() ๊ฐ์ ๋ฉ์๋๋ง ๋ณด๋ ๊ฒ ์๋๋ผ, ์ง๊ธ ์ด Entity๊ฐ ์ด๋ค ์ํ์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์์์ฑ ์ปจํ ์คํธ ์์์ ๊ด๋ฆฌ๋๊ณ ์๋์ง๋ฅผ ๊ฐ์ด ์๊ฐํด์ผ๊ฒ ๋ค๊ณ ๋๊ผ๋ค.