[Spring] JPA์ ์์์ฑ ์ปจํ ์คํธ์ ์๋ช ์ฃผ๊ธฐ
Spring Framework๋ฅผ ์ด์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ์ฌ์ฉํ๋ DB ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค. ๋ณดํต JDBC ๋๋ผ์ด๋ฒ๋ฅผ ์ด์ฉํ์ฌ DB Connection์ ์ํํ๊ณ , ์ฌ๋ฌ ๊ฐ์ ์ปค๋ฅ์ ์ด ์ฐ๊ฒฐํ๊ณ ๋์ด์ง๊ธฐ๋ฅผ ๋ฐ๋ณตํ๊ธฐ ์ํด ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํ๋ Connection Pool(DBCP, HikariCP), ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋๋ฉ์ธ์ ๋ํ CRUD๋ฅผ ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ ํ ์ ์๋๋ก ํ๋ ORM์ด ์์ต๋๋ค.
JPA๋ ์ฌ๊ธฐ์ Java ์ธ์ด์ ํ์ค ORM์ ์ํฉ๋๋ค. Spring boot๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์์ฆ์๋ Spring ํ๋ ์์ํฌ์ ๋ง์ถฐ์ ธ ์๋ Spring Data JPA๋ฅผ ์ฌ์ฉํ๋๋ฐ์. ๊ทธ๋ฐ๋ฐ, Spring Data JPA๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ฐ์ฒด์ ์๋ ๋ฐ์ดํฐ๋ค์ด ์ค์ค๋ก ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ , ๊ฐ์ฒด์ ๋ฐ์ดํฐ๊ฐ ์๋์ผ๋ก ๋ณํ๊ณ , ์์ฑ, ์ญ์ ๊ฐ ์ด๋ฃจ์ด์ง๋๋ฐ, ๋๋์ฒด ์ด๊ฒ ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์๊ธธ๋ ๊ฐ๋ฅํ ๊ฒ์ผ๊น์?
์ด๋ฒ ํฌ์คํธ๋ ์ด๋ฌํ ์ฌ๋ฐ๋ ๊ถ๊ธ์ฆ์ ์ด๋ฐ๋ถ๋ก ์์ํ์ฌ, JPA์ ์๋ช ์ฃผ๊ธฐ์ ์์์ฑ ์ปจํ ์คํธ๋ ๋ฌด์์ธ์ง์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๋ค๋ค๋ณด๊ณ ์ ํฉ๋๋ค.
2020/05/23 - [Programming/Spring] - [Spring boot] Hibernate, JPA ๊ทธ๋ฆฌ๊ณ Spring Data JPA
ํน์ JPA๋ Spring Data JPA, Hibernate๊ฐ ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด์๊ฒ ๋ค๋ฉด, ์์ ๊ธ์ ์ฝ์ด๋ณด์ ํ, ์งํํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
์์์ฑ ์ปจํ ์คํธ
์์์ฑ ์ปจํ ์คํธ๋, Entity๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ๋ ํ๊ฒฝ์ ๋งํฉ๋๋ค. Spring์ผ๋ก ํ ๋ฒ ์ฏค JDBC๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋ฐํด๋ณด์ ๋ถ๋ค์ด ๊ณ์ ๋ค๋ฉด DB์ ์๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ค์์ผ๋ก ์ฝํ๊ณ ์ฐ๋ ๊ฑด์ง๋ฅผ ์ดํดํ์ค ๊ฒ๋๋ค. ๊ฐ๋จํ๊ฒ ์์ฝํ์๋ฉด, ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
* ์ปค๋ฅ์ ์์ฑ -> ์ปค๋ฅ์ ์ฐ๊ฒฐ -> Statement ์์ฑ -> Statement ์คํ -> Transcation ์ปค๋ฐ -> ์ปค๋ฅ์ ์ฐ๊ฒฐ ๋๊ธฐ
๊ทธ๋ ๋ค๋ฉด ORM์์๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๊น์? SQL ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค๊ณ ์๊ฐํด๋ณธ๋ค๋ฉด, ๋จผ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ทธ ๋ค์ DB ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค. ๊ทธ๋ ์ต๋๋ค. ์์์ฑ ์ปจํ ์คํธ๋ DB ์ฒ๋ฆฌ๊ฐ ๋๊ธฐ ์ด์ , ๊ฐ์ฒด๋ฅผ ๋จผ์ ์์ฑํ๋ ๋จ๊ณ ์ฆ, ๊ทธ ์ดํ์ ๋จ๊ณ ์ฒ๋ฆฌ๋ฅผ ์ํด ์กด์ฌํ๋ ์ปจํ ์คํธ์ ๋๋ค. ๋ ผ๋ฆฌ์ ์ธ ๊ฐ๋ ์ ์ํ๋ฉฐ Spring์์๋ EntityManager๋ผ๋ ๊ฐ์ฒด๋ฅผ ํตํด ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ, ์์์ฑ ์ปจํ ์คํธ๋ Java์์ ๋ญ ์ฌ์ฉํ๋์ ๋ฐ๋ผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ์ ํ๋์ด ์์ต๋๋ค. J2SE์ ๊ฒฝ์ฐ EntityManager์ ์์์ฑ ์ปจํ ์คํธ๊ฐ 1:1 ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ง, Spring๊ณผ ๊ฐ์ J2EE์ ๊ฒฝ์ฐ ๊ฐ์ ํธ๋ ์ญ์ ๋ฒ์์ ์๋ EntityManager๋ ๋์ผํ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฆ, Spring์ IoC ์ปจํ ์ด๋์ ๊ธฐ๋ฅ์ธ ์์กด์ฑ ์ฃผ์ ์ฒ๋ผ ์ฌํ์ฉํ๋ค๋ ์ด์ผ๊ธฐ์ธ ๊ฒ์ด์ฃ .
Entity์ Lifecycle
๊ทธ๋ ๋ค๋ฉด ๊ฐ Entity๋ค์ด ์ด๋จ ๋, ์์์ฑ ์ปจํ ์คํธ์ ๋ค์ด๊ฐ๊ณ , DB์ ๋ฐ์์ด ๋ ๊น์? ๋จผ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ๋ถํฐ ์์ํ์ฌ ์ด๋ค์์ผ๋ก DB์ ๋ค์ด๊ฐ๋์ง ์์ผ๋ก ์๋ช ์ฃผ๊ธฐ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
- ๋น์์(new/transient)
- ์์์ฑ ์ปจํ ์คํธ์ ๋ค์ด๊ฐ๊ธฐ ์ ์ํ์ ๋๋ค.
// ๊ฐ์ฒด๋ฅผ ์์ฑ๋ง ํ ์ํ
Cafe cafe = new Cafe();
cafe.setName("Americano");
cafe.setPrice(3000);
์ด ๋๋ DB์ ์๋ฌด๋ฐ ์ํฅ์ด ๊ฐ์ง ์์ต๋๋ค. ๋จ์ง ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๊ฐ์ฒด ์งํฅ ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ํ๋ผ๊ณ ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
- ์์ (managed)
- ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋ ์ํ
- Entity๊ฐ ์์์ฑ ์ปจํ ์คํธ์ ์ํด ๊ด๋ฆฌ๋์ง๋ง DB์๋ ์ญ์ ์๋ฌด๋ฐ ์ํฅ์ด ์์
- ์ปจํ ์คํธ์ ๋ฏธ๋ฆฌ ๊ฐ์ฒด์ ๋ํ ์ ๋ณด๋ฅผ DB ํํ๋ก ์ ์ฅ
- Transaction๊ณผ ๊ด๋ จ๋ commit ๋ฉ์๋๊ฐ ํธ์ถ๋์์ ๋ DB์ ์ ์ฉ
// ๊ฐ์ฒด๋ฅผ ์์ฑ๋ง ํ ์ํ
Cafe cafe = new Cafe();
cafe.setName("Americano");
cafe.setPrice(3000);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ํ
em.persist(cafe);
JPA์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์บ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. DB์์ ๋ฐ๋๋ก ๊ฐ์ฒด๋ก ๊ฐ์ ธ์ฌ ๋๋ ์บ์์ ์ ์ฅ๋๋ฉฐ ์ฐจํ ๋ค์ ํธ์ถ๋ ๋ 1์ฐจ ์บ์์ ์ด๋ฏธ ๋ถ๋ฌ์๋ ๋ด์ฉ์ด ์๋ค๋ฉด, ์บ์๋ฅผ ์ฌ์ฉํด์ ๋ถ๋ฌ์ค๊ฒ ๋ฉ๋๋ค. ์ด ๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉฐ DB์ ์ ์ฅํ ๋ ์ญ์ ์ปค๋ฐ ๋ฉ์๋๊ฐ ํธ์ถ๋๊ธฐ ์ ๊น์ง๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ๊ทธ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ๋ง ์๋ ์ํ๊ฐ ๋ฉ๋๋ค.
- ์ค์์ (detached)
- ์์์ฑ ์ปจํ ์คํธ์์ ๋ถ๋ฆฌ๋ ์ํ
// ์นดํ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์์ ๋ถ๋ฆฌ, ์ค์์ ์ํ
em.detach(cafe);
๋ ์ด์ ํด๋น ๊ฐ์ฒด์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๊ฒฝ์ฐ์๋ EntityManager์์ ์ค์์ ์ํ๋ก ๋๋ ค์ผ ํฉ๋๋ค.
- ์ญ์ (Removed)
- DB์์ ์ญ์ ๋ ์ํ
// ๊ฐ์ฒด๋ฅผ ์ญ์
em.remove(cafe);
์ญ์ ๋ DB์์๋ ๋ฐ์์ด ๋๊ฒ ๋ฉ๋๋ค. ๋ฌผ๋ก remove ์ดํ์ ๋ค์ ์์ ํ, commit์ ์ฌ๋ฆฌ๋ฉด ๊ทธ ์ ๋ณด๊ฐ ๋ค์ ๋์์ต๋๋ค๋ง ์ค์์์ด๋ ๊ด๊ณ ์์ด ์ญ์ ๋ฅผ ํ๊ฒ ๋๋ฉด DB์ ๋ฐ์๋๋ฏ๋ก ์ฌ์ฉ์ ์ ์ํด์ผ ํฉ๋๋ค.
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง JPA์ ์์์ฑ ์ปจํ ์คํธ์ ์๋ช ์ฃผ๊ธฐ์ ๋ํด ๊ฐ๋จํ ์์๋ดค์ต๋๋ค. JPA๊ฐ ํ์ค ORM์ผ๋ก์จ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ํตํด SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ๋ง๋ค์ง ์๊ณ ๋ ๊ฐ์ฒด ์์ฑ์ ํตํด DB ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค๊ณ ๋ ํ์ง๋ง ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค์์ผ๋ก ๋์ํ๋์ง์ ๋ํด ์๋ ๊ฒ๋ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ๋ค๋ฃจ๋ ๊ฐ๋ฐ์๋ก์จ ์์์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ค์ ํฌ์คํธ์์๋ ์์์ฑ ์ปจํ ์คํธ์ ๊ตฌ์กฐ์ ์ด์ ์ ๋ํด ์ข ๋ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] JPA์ ํ๋ฌ์(flush) (0) | 2020.07.02 |
---|---|
[Spring] JPA ์์์ฑ ์ปจํ ์คํธ ๊ตฌ์กฐ๋ก ๋ณด๋ ์ด์ (2) | 2020.06.24 |
[Spring boot] ์ ํ๋ฆฌ์ผ์ด์ ์ Docker ์ด๋ฏธ์ง๋ก ๋ง๋ค๊ธฐ Old & New (0) | 2020.06.04 |
[Spring boot] DAO์ DTO (6) | 2020.05.27 |
[Spring Data] Hibernate, JPA ๊ทธ๋ฆฌ๊ณ Spring Data JPA (0) | 2020.05.23 |