JPA (Java Persistence API)
์๋ฐ ์ง์์์ ๋ง๋ ORM ๊ธฐ์ ํ์ค
์ฌ์ฉํ๋ ์ด์
์ํํธ์จ์ด ๊ฐ๋ฐ์๊ฐ SQL ์ ์์กดํ๋ ๊ฐ๋ฐ์ ํผํ ์ ์๋ค.
๊ฐ๋ฐ์ ์
์ฅ์์ ์ฟผ๋ฆฌ๋ฌธ์ ๋ค๋ฃจ์ง ์๊ณ ๊ฐ์ฒด์งํฅ ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ์ ํ ์ ์๋๋ก ๋์ด์๊ธฐ์, ์์ฐ์ฑ ๋ฐ ์ ์ง๋ณด์์ ํจ์จ์
๊ฐ์ฒด์ ๊ด๊ณํ DB์ ์ฐจ์ด๋ฅผ ์ค๊ฐ์์ ํด๊ฒฐํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ต์ฒดํ๋๋ผ๋ ์ ์ง๋ณด์ ์ํฅ๋๊ฐ ํฌ์ง ์์.
→ mysql,, oracle ๋ฐ๊ฟ ์ฌ์ฉํ๋๋ผ๋ ์ฟผ๋ฆฌ ๋ณ๊ฒฝ์์ด ์ฌ์ฉ ๊ฐ๋ฅ
JPA ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ
โฃ ์ํฐํฐ ์ ํ
์ด๋ธ์ ๋งคํํ๋ ์ค๊ณ ๋ถ๋ถ
โฃ ๋งคํํ ์ํฐํฐ๋ฅผ ์ค์ ์ฌ์ฉํ๋ ๋ถ๋ถ.
โข ์ํฐํฐ ?
์ ๋ณด๋ฅผ ํํํ๋ ๋จ์์ด๊ธฐ๋ํ๋ฉฐ
JPA ์์๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ํ ํด์ผํ ์๋ฐ ๊ฐ์ฒด (๋ฐ์ดํฐ ๋ฒ ์ด์ค ํ ์ด๋ธ๋ก ํํ)๋ฅผ ๋ํ๋.
์์์ฑ ๊ด๋ฆฌ
ํ๋ก์ธ์ค๊ฐ ์์ฑ์ด ๋์์ง๋ง, ๋ณ๊ฐ๋ก ์ ์ง๋๋ ์ํ์ ํน์ง์ค ํ๋.
์ด๋ฅผ ๋ณ๋์ ๊ธฐ์ต์ฅ์น์ ๋ณด์กด ๋ฐ ๊ด๋ฆฌํ๋๊ฒ.
์ํฐํฐ ๋งค๋์ ๋ ํธ๋์ญ์ ์ด ์คํ๋ ๋ ์ปค๋ฅ์ ์ ์ป์
์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌEntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
โฃ JPA ์ ์ฌ์ฉํ ์ ์๊ฒํจ.
โฃ JPA ๋์ ์ํด ๊ธฐ๋ฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ปค๋ฅ์
ํ์ ์์ฑํจ → ๋น์ฉ์ด ํฌ๋ค.
โฃ ์ดํ๋ฆฌ์ผ์ด์
์์ ๋ฑ ํ๋ฒ ์์ฑ ํ ๊ณต์ ํด์ ์ฌ์ฉํด์ผ ํจ.
์ํฐํฐ ๋งค๋์ EntityManager em = emf.createEntityManager();
โฃ JPA ๊ธฐ๋ฅ์ ์ ๊ณต. ์ด๋ฅผ ์ด์ฉํ์ฌ CRUD๊ฐ ๊ฐ๋ฅํจ.
โฃ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํด์ฃผ๋ ์ญํ ์ ํจ. (๊ด๋ฆฌ์)
โฃ ํธ๋์ญ์
์ ์ปค๋ฐํ๊ธฐ ์ง์ ๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํฐํฐ๋ฅผ ์ ์ฅํ์ง ์๊ณ ๋ด๋ถ ์ฟผ๋ฆฌ ์ ์ฅ์(์ฐ๊ธฐ์ง์ฐ SQL ์ ์ฅ์)์ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ์๋๋๋ก ํจ.
→ ํธ๋์ญ์
์ปค๋ฐ์ ๋ชจ์๋ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณด๋=ํ๋ฌ์ (์ฐ๊ธฐ์ง์ฐ)
→ ํธ๋์ญ์
์ปค๋ฐ๊น์ง ๋์ด์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ๋ด์ฉ ๋ฐ์์ด ๋จ
โฃ ๋ด๋ถ์ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ ์งํ๋ฉด์ (์ปค๋ฅ์
์ ์ง) ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํจ.
โฃ ๊ฐ๋ฐ์ ์
์ฅ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์๊ฐํ ์ ์์.
โฃ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
๊ณผ ๋ฐ์ ํ ๊ด๊ณ๊ฐ ์์ผ๋ฏ๋ก ์ค๋ ๋๊ฐ์ ๊ณต์ ํ๊ฑฐ๋ ์ฌ์ฌ์ฉํ๋ฉด ์๋จ. (๋์์ฑ ๋ฌธ์ )
โฃ ์์ฑ ๋น์ฉ์ด ํฌ์ง ์์.
โฃ ์ํฐํฐ๋งค๋์ ๋ฅผ ์ฌ์ฉํ ๋ ๋ง๋ค ์ค์ ๋ก ์์์ฑ ์ปจํ
์คํธ์ ์ํธ ์์ฉ์ ํจ.
์์์ฑ ์ปจํ ์คํธ (persistence context)
โฃ ์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ
โฃ ์ํฐํฐ ๋งค๋์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅ
โฃ ์ํฐํฐ ๋งค๋์ ๋ก ์ํฐํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์กฐํํ๋ฉด ์ํฐํฐ๋งค๋์ ๋ ์์์ฑ ์ปจํ
์คํธ์ ์ํฐํฐ๋ฅผ ๋ณด๊ดํ๊ณ ๊ด๋ฆฌ (์ํฐํฐ ๋งค๋์ ์ ์๋ช
์ฃผ๊ธฐ ๊ด๋ฆฌ)
โฃ 1์ฐจ์บ์, ๋์ผ์ฑ๋ณด์ฅ(identity), ์ฐ๊ธฐ์ง์ฐ, ๋ณ๊ฒฝ๊ฐ์ง(Dirty Checking), ์ง์ฐ๋ก๋ฉ(Lazy Loading) ๋จ
โข 1์ฐจ ์บ์ ?
์์์ฑ ์ปจํ ์คํธ ๋ด ์บ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ.
์์์ํ์ ์ํฐํฐ๋ ๋ชจ๋ ์ด๊ณณ์ ์ ์ฅ๋จ.
Map ํํ์ด๊ณ [key: @Id๋ก ๋งคํํ ์๋ณ์, value: ์ํฐํฐ ์ธ์คํด์ค] ์ด๋ค
์ํฐํฐ ์๋ช ์ฃผ๊ธฐ
โฃ ๋น์์ (new/transient): ์์์ฑ ์ปจํ
์คํธ์ ์ ํ ๊ด๊ณ๊ฐ ์๋ ์ํ
→ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํ์ง ์์ ์ํ.
→ ๊ฐ์ฒด๋ง ์์ฑํ ์ํ
โฃ ์์ (managed): ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅ๋ ์ํ (์์์ํ)
โฃ ์ค์์ (detached): ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅ ๋์๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ
→ ์์์ฑ ์ปจํ
์คํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
→ 1์ฐจ ์บ์์์ ์ฌ๋ผ์ง..
→ ์ง์ฐ๋ก๋ฉ(LAZY LOADING) ํ ์ ์๋ค.
→ ์์์ฑ ์ปจํ
์คํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
→ ์๋ณ์๊ฐ์ ๊ฐ์ง๊ณ ์๊ณ ๊ฑฐ์ ๋น์์ ์ํ์.
→ ๋ค์ ์์ ์ํ๋ก ๋ง๋๋ ค๋ฉด merge() ํ๋ฉด ๋จ. (์ค์์ ์ํ์ ์ํฐํฐ๋ฅผ ๋ฐ์ ๋ค์ ์์ ์ํ๋ก ๋ง๋ฌ)
โฃ ์ญ์ (removed): ์ญ์
์ํฐํฐ ์ ์ฅ (insert)
โฃ ์ฐ๊ธฐ์ง์ฐ(transactional write-behind)
→ ํธ๋์ญ์
์ปค๋ฐ ์ง์ ๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํฐํฐ๋ฅผ ์ ์ฅํ์ง ์๊ณ ,
๋ด๋ถ ์ฟผ๋ฆฌ ์ ์ฅ์์ INSERT ์ฟผ๋ฆฌ๋ฅผ ๋ชจ์๋๊ณ ์ปค๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณด๋ด๋ ์ํ (๋ณด๋ด๋ ์์
=flush)
์ํฐํฐ ์กฐํ (read)
โฃ ๋์ผ์ฑ์ด ๋ณด์ฅ๋๋ค!
๋ณ๊ฒฝ ๊ฐ์ง (dirty checking) - ์์
โฃ ์ํฐํฐ์ ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋์ผ๋ก ๋ฐ์ํ๋ ๊ธฐ๋ฅ
โฃ ์ํฐํฐ๋ฅผ ์กฐํํ์ฌ ๋ณ๊ฒฝ๋ถ๋ถ ํ์
ํ ์
๋ฐ์ดํธ
โฃ ์์์ฑ ์ปจํ
์คํธ๊ฐ ๊ด๋ฆฌํ๋ ์์ ์ํ์ ์ํฐํฐ์๋ง ์ ์ฉ
โ ๋ณ๊ฒฝ ๊ฐ์ง ๊ด๋ จ ์ํฉ (๋งํฌ)
ํ๋ฌ์ (flush)
โฃ ์์์ฑ ์ปจํ
์คํธ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํํ๋ ์์
.
→ ์ง์ ํธ์ถ: em.flush() ์ง์ ํธ์ถ
→ ํธ๋์ญ์
์ปค๋ฐ ์ ํ๋ฌ์ ์๋ ํธ์ถ: ๊ธฐ๋ณธ์ค์ ..
→ JPQL ์ฟผ๋ฆฌ ์คํ์ ํ๋ฌ์ ์๋ ํธ์ถ
์ฐธ๊ณ
- ์ฑ : http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330
- ๋งํฌ: https://ko.wikipedia.org/wiki/%EC%A7%80%EC%86%8D%EC%84%B1
- ๋งํฌ: https://www.baeldung.com/jpa-entities
- ๋งํฌ: https://cupping.tistory.com/2
- ๋งํฌ: https://openjpa.apache.org/builds/1.2.3/apache-openjpa/docs/jpa_overview_emfactory_perscontext.html
- ๋งํฌ: https://www.baeldung.com/jpa-hibernate-persistence-context
- ๊ฐ์: https://www.youtube.com/playlist?list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U
'๊ฐ๋ฐ > jpa' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๊ฐ์ฒด์งํฅ ์ธ์ด - JPQL (0) | 2022.03.02 |
---|---|
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ & ํ๋ก์ (0) | 2022.02.21 |
[JPA] ๋ณ๊ฒฝ๊ฐ์ง (save() ์ ํ์ง ์์๋๋ฐ db์ ์ ์ฅ?) (0) | 2022.02.20 |