JPA #2 ๋ณธ๊ฒฉ์ ์ผ๋ก ์์๋ณด์.
by JiwonDevํด๋น ๊ธ์ https://www.inflearn.com/course/ORM-JPA-Basic ์ ๊ณต๋ถํ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๐ Java Persistenec API
์ค์ฌ์ JPA, ํ๋์ ์๋ฐ ์ง์์ ORM ๊ธฐ์ ํ์ค.
์ฐธ๊ณ ๋ก ์ด์ ์๋ EJB(์ํฐ๋ ๋น)์ ํ์ค์ผ๋ก ์ ๊ณตํ์๋๋ฐ, ์ด๊ฒ ์ฑ๋ฅ๋ ๊ตฌ๋ฆฌ๊ณ ์ฌ์ฉ๋ฒ๋ ๊ตฌ๋ ค์ ์๋ฌด๋ ์ฐ์ง ์์๋ค. ๊ทธ๋์ ์ด๋ค ๊ฐ๋ฐ์๊ฐ ๋นก์ณ์ ๋ง๋ ๊ฒ์ด 'ํ์ด๋ฒ๋ค์ดํธ' ์๊ณ ์ด ์คํ์์ค ๊ฐ๋ฐ์๋ฅผ ์๋ฐ ์ง์์์ ๋ฉ์น(?)ํด์ ํ์ค์ผ๋ก ๋ค๋ฌ์ด ์๋ก ๋ง๋ ๊ฒ์ด JPA ์ด๋ค.
๐ JPA๋ ์ธํฐํ์ด์ค์ด๋ค.
Java Persistence API. ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด JPA๋ ๊ตฌํ์ฒด๋ฅผ ํฌํจํ์ง ์๋๋ค. ๋ง ๊ทธ๋๋ก ์ธํฐํ์ด์ค๋ง ์ ํ์์ผ๋ฉฐ ํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฒค๋(๊ตฌํ์ฒด)๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ณดํต์ JPA์ ์์ด์ธ Hibernate๋ฅผ ๊ตฌํ์ฒด๋ก ๋ง์ด ์ฌ์ฉํ๋ค.
๐ ORM
Object-Realtional mapping, ๊ฐ์ฒด - ๊ด๊ณํ DB ๋งคํ ๊ธฐ์ ์ด๋ค. ๊ฐ์ฒด๋ ๊ฐ์ฒด๋๋ก, DB๋ DB๋๋ก ์ค๊ณํ์ฌ ORM์ ์ด์ฉํ์ฌ ์ค๊ฐ์์ ๋งคํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Java๋ JDBC API๋ฅผ ์ด์ฉํด์ DB๋ฅผ ์ฌ์ฉํ๋ค. ์ฆ JPA๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋์ํ๋ค.
๐ JPA์ CRUD
์ ๋ง ์ฝ๋ค. ๊ทธ๋ฅ ์๋ฐ ์ปฌ๋ ์ ์ด๋ผ๊ณ ์๊ฐํ๊ณ DB๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
// Create
jpa.persist(member)
// Read
Member member = jpa.find(memberId)
// Write
member.setName("๋ณ๊ฒฝํ ์ด๋ฆ")
// Delete
jpa.remove(member)
๋ค์๊ณผ ๊ฐ์ด ์๋ก์ด ํ๋๊ฐ ์ถ๊ฐ๋๋๋ผ๋ ๋ณ๋ค๋ฅธ ์์ ์์ด ์์ CRUD ์ฝ๋๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
// ํ๋ ์ถ๊ฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
// SQL ์ฟผ๋ฆฌ๋ฅผ ์์ ํ ํ์๊ฐ ์์ต๋๋ค.
Public class Member {
private String newTitle;
}
๊ธฐ์กด JDBC๋ฅผ ์ฌ์ฉํด๋ดค๋ค๋ฉด, ์ด๊ฒ ์ผ๋ง๋ ๋๋ผ์ด ์ผ์ธ์ง ์ ์ ์์ ๊ฒ์ด๋ค.
์๋ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฐ์ฒด๋ก ์ ์ฅ๋๋๊ฒ ์๋๋ผ ํ ์ด๋ธ๋ก ์ ์ฅ๋๊ธฐ๋๋ฌธ์, ์ด๋ ๊ฒ ๊ฐ์ฒด ์ปฌ๋ ์ ์ฒ๋ผ ์ฌ์ฉํ๋ฉด ์ค๊ฐ์ ์ ๋ง ๋ง์ ์ค๋ฅ๋ค์ด ์๊ธฐ๊ณ , ์ ์ง ๋ณด์ํ๊ธฐ๋ ๋งค์ฐ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ค์ ๋ก ๊ธฐ์กด์ JDBC๋ฅผ ์ฌ์ฉํ ๋์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๊ฐ์ฒด๋ก ์ ํํ๋๊ฒ ์ด๋ ค์ ๊ทธ๋ฅ SuperDTO ๊ฐ์๊ฑธ ๋ง๋ค์ด์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค ํ๋ฒ์ ๊ฐ์ ธ์ค๊ณ ํ๋์ฉ ๊ฐ์ฒด์ ๋ฃ๋ ๋ฐฉ๋ฒ์ ๋ ๋ง์ด ์ฌ์ฉํ๊ณค ํ์๋ค.
๐ JPA๋ ์ฑ๊ณผ JDBC ์ค๊ฐ์์ ๋์ํ๋ค.
JPA์ ์์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ๋ ๋ง๋ฒ์ ๋๊ตฌ๊ฐ ์๋๋ค. ๊ฐ๋ฐ์๊ฐ ์์ฑํ ๊ฐ์ฒด์งํฅ ์ฝ๋๋ฅผ ํ ๋๋ก SQL๋ฌธ์ ์์ฑํ๊ณ JDBC์ ์ฐ๊ฒฐํ๋ค. JPA์ ํต์ฌ์ ORM ๊ธฐ์ ์ ์ด์ฉํ์ฌ ๊ฐ์ฒด์ RDB์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํด์ฃผ๋ ๊ฒ์ด๋ค.
๐ ๊ทธ๋ผ JPA๋ฅผ ์ฐ๋ฉด ์ฑ๋ฅ์ด ๋จ์ด์ง๋๊ฑฐ ์๋๊ฐ์?
JPA๋ก ์ธํด ๊ณ์ธต์ด ํ๋ ๋ ์๊ธฐ๋ฉฐ ๋๋ ค์ง๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง, ์ฑ๋ฅ์ ์ต์ ํ์ ๊ธฐ๋ฅ๋ค์ด ๊ฐ๋ ฅํด์ '์ ์ฌ์ฉํ๋ค๋ฉด' ๊ธฐ์กด์ JDBC ์ฝ๋๋ณด๋ค ์ฑ๋ฅ์ด ๋ ์ข์์ง ์ ์๋ค. ์ด๋ JPA๋ฅผ ๊น๊ฒ ๊ณต๋ถํ๋ฉด ๋ฌด์จ ๋ง์ธ์ง ์์ฐ์ค๋ฝ๊ฒ ์ดํด๋ ๊ฒ์ด๋ค.
- 1์ฐจ ์บ์์ ๋์ผ์ฑ(identity)๋ณด์ฅ
- ๊ฐ์ ํธ๋์ญ์ ์์์๋ ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ฐํํ๋ค.
- DB Isolation Level์ ํ ๋จ๊ณ ๋ฎ์ถฐ๋(Read Commit) JPA๋ฅผ ์ฌ์ฉํ๋ ์ฑ์์ Repetable Read๋ฅผ ๋ณด์ฅํ๋ค. - ํธ๋์ญ์
์ ์ง์ํ๋ Lazy ์ฐ๊ธฐ ์ง์(transcational write-behind)
- ํธ๋์ญ์ ์ ์ปค๋ฐํ ๋๊น์ง INSERT SQL๋ฌธ์ ๋ชจ์๋ค.
- JDBC Batch SQL์ ์ด์ฉํ์ฌ ์ฌ๋ฌ ์์ฒญ๋ฌธ์ ๋คํธ์ํฌ์์ ํ ์์ฒญ์ผ๋ก ๋ณด๋ผ ์ ์๋ค.
- JPA์์๋ ๊ฐ๋จํ ์ต์ ์ค์ ์ ํตํด ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค. - ์ฆ์ ๋ก๋ฉ๊ณผ ์ง์ ๋ก๋ฉ(Lazy Loading)์ ์ค์ ํ๋๋ก ๊ฐ๋จํ๊ฒ ํ๋ ๊ฐ๋ฅ.
- ์ฆ์ ๋ก๋ฉ : Join๋ฌธ์ผ๋ก ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ค ๊ฐ์ ธ์ด
- ์ง์ฐ ๋ก๋ฉ : ๊ฐ์ฒด๊ฐ ์ค์ ์ฌ์ฉ๋ ๋ ๋ก๋ฉํจ. ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค๋ ๊ฒ ์๋
๐ JPA์ DB SQL๋ฅผ ๋ ๋ค ์ ์์์ผ ํ๋ค.
JPA๋ฅผ ์ฌ์ฉํ ๋ ํด๋น ๋ฌธ์ฅ์ด ์ด๋ ํ SQL์ ๋ง๋ค์ด๋ด๋์ง ์ ์ถ๊ฐ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
๊ทธ๊ฒ ์๋๋ค๋ฉด ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ ์ถ์ํ๋ JPA ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ ์์ธ์ ์ ๋ ์ฐพ์ ์ ์์ต๋๋ค. ์ฐจ๋ผ๋ฆฌ JDBC๋ก ์ฐ๋๊ฒ ๋ ํธํ ๊ฑฐ์์.
๊ฒฐ๊ตญ JPA๋ ๋ด๋ถ์ ์ผ๋ก๋ JDBC๋ก ๋์ํ๋ค. ์ฌ๋ฌ ๊ฐ์ง ์ํฉ์ ๋์ฒํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด์๋ ๊ด๊ณํ DB์ ๋ํ ๊ณต๋ถ๋ ํ์์ ์ด๋ค. ์ต๊ทผ ๋ค์ด JPA๊ฐ ๋์ธ๊ฐ ๋๋ฉฐ 'JPA๋ ์ธ ์ค ์๋๋ฐ, SQL๋ฌธ์ ์ ๋ชจ๋ฅด๊ฒ ์ด์'๋ผ๊ณ ํ๋ ์ฌ๋๋ค์ด ์ข ์ข ๋ณด์ด๋๋ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ดํด ์์ด ๋จ์ํ ๊ฐ์ฒด์ฒ๋ผ ์๊ฐํ๋ค๊ฐ๋ ๋์ค์ ํฐ ๋ฌธ์ ๋ฅผ ๋ง๋ค ์ ์๋ค.
์ถ์ํ๋ JPA ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฌธ์ ๋ฅผ ์ฐพ๋๊ฑด ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ํด๋น JPA๊ฐ ์ด๋ ํ SQL์ ๋ง๋ค์ด๋ด๋์ง ์ ๋๋ ์ ์ถ๊ฐ ๊ฐ๋ฅํด์ผ ํ๋ค.
SQL๊ณผ JPA, ๋ ๋ค ํ ์ค ์์์ผ ํ๋ค.
'๐ฑBackend > JDBC & JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA #6 ๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ (1:N, N:1, N:N) (0) | 2021.11.09 |
---|---|
JPA #5 ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ์ ๋ฌธ์ ์ , ์ฐ๊ด ๊ด๊ณ ๋งคํ (0) | 2021.11.09 |
JPA #4 ์ํฐํฐ ๋งคํ (๊ฐ์ฒด-ํ ์ด๋ธ ๋งคํ) (0) | 2021.11.08 |
JPA #3 ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ, ์์์ฑ ์ปจํ ์คํธ (0) | 2021.11.07 |
JPA #1 ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ก ์ ์ฅํ๋ ๋ฐฉ๋ฒ (0) | 2021.11.07 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev