์ถ์ฒ : ๋ด์ผ๋ฐฐ์์บ ํ
1. JPA ์ฐ๊ด๊ด๊ณ ์๋ฆฌ
1) JPA ์ ๋ฆฌ( ORM, Hibernate, JPA )
+ https://cdaosldk.tistory.com/167
JPA : ์๋ฐ ์ง์์ฑ(์์์ฑ) API, ์๋ฐ์์ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌํ ๊ธฐ๋กํ ์ ์๋(DB) ํ๊ฒฝ์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค ๋ชจ์
JPA ์ค ๋ํ์ ์ธ ํ๋ ์์ํฌ -> HIbernate
HIbernate ~ ๊ฐ์ฒด์งํฅ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋งคํํ๊ธฐ ์ํ ํ๋ ์์ํฌ
์์์ฑ : ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋์ด๋ ์ฌ๋ผ์ง์ง ์๋ ๋ฐ์ดํฐ์ ํน์ฑ, ์์์ฑ์ ๊ฐ์ง ์์ ๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ์๋ง ์กด์ฌํ๊ณ ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์ ๋ฐ์ดํฐ๋ ์๋ฉธํ๋ค. -> ํ์ผ์ด๋ DB์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด ์์์ฑ์ ๋ถ์ฌํ๋ค
*์์์ฑ์ 4๊ฐ์ง ์ํ : ๋น์์, ์์, ์ค์์, ์ญ์
๋น์์(new/transient) - ์ํฐํฐ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ ธ์ ์์ง ์ ์ฅ๋์ง ์์ ์ํ, ์์์ฑ ์ปจํ ์คํธ์ ์ ํ ๊ด๊ณ ์์
์์(managed) - ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์ด, ์์์ฑ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ ์ ์๋ ์ํ
์ค์์(detached) -
์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์ด ์๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ๋ก, ์์์ฑ ์ปจํ ์คํธ๊ฐ ๋ ์ด์ ๊ด๋ฆฌํ์ง ์๋ ์ํ
์ญ์ (removed) - ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ญ์
๊ฐ์ฒด์ ์์์ฑ ์ํ๋ Entity Manager์ ๋ฉ์๋๋ฅผ ํตํด ์ ํ๋๋ค.
ORM : ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋งคํ ๋๊ตฌ
ORM ์ฌ์ฉ์ด์
- OOP vs Relational Database
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํด๋์ค, RDB๋ ํ ์ด๋ธ
- ORM์ ์ด์ฉํด SQL์ ์๋ ์์ฑ, ์ํฐํฐ๋ฅผ ๊ฐ์ฒด๋ก ํํํ ์ ์๋ค
ORM ์ฅ์
- ๊ฐ์ฒด์งํฅ ์ ๊ทผ์ผ๋ก ์์ฐ์ฑ, ์ฝ๋ ๊ฐ๋ ์ฑ์ด ์ฆ๊ฐ
- ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ, ๋ ๋ฆฝ์ฑ ์ฆ๊ฐ๋ก ์ ์ง๋ณด์ ํธ๋ฆฌ
- DBMS์ ๋ํ ์ข ์์ฑ ์ ํ : DBMS๋ฅผ ๊ต์ฒดํด๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋๋ถ๋ถ ๋์ผํด์ ORM ์ฌ์ฉ์ ์ํฅ์ด ์๋ค
ORM ๋จ์
- ๊ตฌํ์ ๋์ด๋๊ฐ ์ฆ๊ฐ
JPA๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC ์ฌ์ด ๋์, JPA ๋ด๋ถ์์ JDBC API๋ฅผ ์ฌ์ฉํด SQL ํธ์ถํ์ฌ DB์ ํต์ ~ EntityManager ๋ฑ
JPA ํ๋ก์ธ์ค
1. ์ฐ๊ฒฐ์์ฒญ
2. ์ฐ๊ฒฐ ์ธ์ฆ ํ, ์ธ์ ์คํ
3. Connection ์ ์ง
4. ์ฟผ๋ฆฌ ์ ์ก
5. Data ์์ฑ(์์ )
6. ์์ฑ(์์ )๋ Data๋ฅผ Java ๊ฐ์ฒด๋ก ๋ณ๊ฒฝ
2) Spring Data JPA
Spring Data JPA๊ฐ JPA๋ฅผ ์ถ์ํํ๋ค ~ Spring Data JPA๋ฅผ ์ฌ์ฉํ์ฌ Repository ์ธํฐํ์ด์ค๋ก JPA๋ฅผ ํ์ฉํด ์ฟผ๋ฆฌ๋ฅผ ์งค ์ ์๋ค. = Repository๋ฅผ ๊ตฌํํ ๋ JPA๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค
- JPA์ ํต์ฌ์ EntityManagerFactory, EntityManager, EntityTransaction
- Hibernate์์๋ ๊ฐ๊ฐ SessionFactory, Session, Transaction์ผ๋ก ์์๋ฐ๊ณ ๊ฐ๊ฐ lmpl๋ก ๊ตฌํํ๊ณ ์๋ค
- ์ฌ์ฉ์๊ฐ Repository ์ธํฐํ์ด์ค์ ์ ํด์ง ๊ท์น๋๋ก ๋ฉ์๋๋ฅผ ์ ๋ ฅํ๋ฉด, Spring์ด ์์์ ๊ทธ ๋ฉ์๋์ด๋ฆ์ ์ ํฉํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๊ตฌํ์ฒด(Repository์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ)๋ฅผ Bean์ผ๋ก ๋ฑ๋กํด์ค๋ค ex) save, saveAndFlush
- Raw JPA) persist(), merge() -> ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋ ์ํ -> flush() -> DB์ ์ฟผ๋ฆฌ๊ฐ ์ ์ฅ๋ ์ํ -> commit() -> DB์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์๋ ์ํ
vs Spring Data JPA)
save() ๋ฉ์๋ : persist()๊น์ง ์ํ(์ ๋ฐ์ดํธ์ผ ๊ฒฝ์ฐ merge())
save() ๋ฉ์๋ ๋ด๋ถ @Transactional ์ด๋ ธํ ์ด์ ์ด ์ข ๋ฃ ์ flush(), commit()์ ๋ชจ๋ ์ํ
~ DB์ ์ฟผ๋ฆฌ๊ฐ ์ ์ฅ๋ ์ํ(flush()์ commit() ์ฌ์ด)๋ก ์ถ๊ฐ ๋์์ด ํ์ํ ๊ฒฝ์ฐ SimpleRepository ๋์ Repository๋ฅผ ๊ฐ๋ณ ๊ตฌํํ์ฌ saveAndFlush()๋ฅผ ๊ตฌํ, ๊ทธ๋ ์ง ์๋ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก save() ๋ฉ์๋๋ง ์ฌ์ฉ