[Spring] ORM, JPA, Spring Data JPA
๐ORM (Object Relational Mapping)
ORM(Object Relational Mapping, ๊ฐ์ฒด ๊ด๊ณ ๋งคํ)์ ๊ฐ์ฒด์ DB์ ํ
์ด๋ธ์ ๋งคํํด์ฃผ๋ ๊ธฐ์
์ฆ, ๊ฐ์ฒด๊ฐ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ํ
์ด๋ธ์ด ๋๋๋ก ๋งคํ ์์ผ์ค๋ค. (@Entity๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ํ
์ด๋ธ ์์ฑ)
- ORM์ ์ด์ฉํ๋ฉด SQL Query๊ฐ ์๋ ๋ฉ์๋๋ก DB์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ ๊ฐ๋ฅ
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐ(๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ = ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ)
์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ถ์ํํ๊ณ , ์ด๋ฅผ ๋ฉ์๋์ ์์ฑ์ ํฌํจํ๋ ๊ฐ์ฒด๋ก ํํํฉ๋๋ค. ๋ฐ๋ฉด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ ์ด๋ธ๊ณผ ๋ก์ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉฐ, ์ด๋ฅผ ๊ด๊ณ์ ์กฐ์ธ์ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌํฉ๋๋ค. ORM์ ์ด๋ฌํ ๊ฐ์ฒด ์งํฅ ๋ชจ๋ธ๊ณผ ๊ด๊ณํ ๋ชจ๋ธ ๊ฐ์ ๋งคํ์ ์ฒ๋ฆฌํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ ์์ฉ์ ๋จ์ํํฉ๋๋ค.
์ฅ์
- ๊ฐ์ฒด-ํ ์ด๋ธ ๋งคํ(Object-Relational Mapping): ORM์ Java๋ ๋ค๋ฅธ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ ํด๋์ค์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ ๊ฐ์ ๋งคํ์ ์ง์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ ์ฝ๋๋ก, ํด๋์ค ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๊ณ๋ก ํฌ์ํ ์ ์์ต๋๋ค.
- CRUD ์์ ์ ๋จ์ํ: ORM์ ๊ฐ์ฒด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์์ฑ(Create), ์ฝ๊ธฐ(Read), ๊ฐฑ์ (Update), ์ญ์ (Delete)์ ๊ฐ์ ์์ ์ ๊ฐ์ํํฉ๋๋ค. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ฉ์๋์ ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- ๊ฐ์ฒด ์งํฅ์ ์ธ ํ๋ก๊ทธ๋๋ฐ: ORM์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ค์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃฐ ์ ์์ต๋๋ค. ์ด๋ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฆฝ์ฑ: ORM์ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข ์๋์ง ์๋๋ก ์ค๊ณ๋์ด ์์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์์๋ ์ฝ๋ ์์ ์ ์ต์ํํ ์ ์์ต๋๋ค. ORM์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ค๊ฐ ๊ณ์ธต์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข ์์ฑ์ ๋ฎ์ถ ์ ์์ต๋๋ค.
๐JPA(Java Persistence API)
Java์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ธฐ ์ํ Java ORM(Object-Relational Mapping) ํ๋ ์์ํฌ
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ฅ์ ์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐ์ํ ์ ์๋ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ฏ์ด ๊ฐ๋จํ ์ฝ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐ์ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ฐฉ์์ JPA๋ฅผ ๊ตฌํํ ํ์ฌ๋ง๋ค ๋ค๋ฅด๋ฉฐ ๋ฐ๋ผ์ ๊ฐ ๊ตฌํ์ฒด๋ง๋ค ํน์ ํ์ฌ์ ์ด๋ฆ์ผ๋ก ๋ถ๋ฆฐ๋ค.
ex) Hibernate, TopLink, Eclipselink
JPA๋ ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ๊ฐ๋ ๊ณผ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค:
- Entity(์ํฐํฐ): ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ๋งคํ๋๋ ์๋ฐ ๊ฐ์ฒด์ ๋๋ค. @Entity ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ํน์ ํด๋์ค๋ฅผ ์ํฐํฐ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
- EntityManager(์ํฐํฐ ๋งค๋์ ): JPA์์ ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํ๋ ์ธํฐํ์ด์ค์ ๋๋ค. ์ํฐํฐ ๋งค๋์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ํฐํฐ์ CRUD(Create, Read, Update, Delete) ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- Persistence Unit(์์์ฑ ์ ๋): ์ํฐํฐ๋ค์ ๋ฉํ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์๋ ๋ ผ๋ฆฌ์ ์ธ ๋จ์์ ๋๋ค. persistence.xml ํ์ผ์ ์ฌ์ฉํ์ฌ ์ค์ ํ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด๋ ์ํฐํฐ ํด๋์ค ์ ๋ณด ๋ฑ์ ์ ์ํฉ๋๋ค.
- JPQL(Java Persistence Query Language): SQL๊ณผ ๋น์ทํ ๋ฌธ๋ฒ์ ๊ฐ์ง ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ ์ธ์ด์ ๋๋ค. ์ํฐํฐ๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข ์์ฑ์ ์ค์ฌ์ค๋๋ค.
JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํด๋ ์์ค ์ฝ๋๋ฅผ ๋ง์ด ์์ ํ์ง ์๊ณ ์ ์ง๋ณด์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ด์ ์ผ๋ก ์ธํด JPA๋ Java ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ๋ณด๋ค ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ค๋๋ค.
๐ Spring Data JPA
์คํ๋ง ๋ถํธ๋ JPA ์ค์์ Hibernate๋ผ๋ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉ
Spring Data JPA๋ ์ด๋ฐ Hibernate๋ฅผ ์ข ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ ์ถ๊ฐ์ ์ธ API๋ค์ ์ ๊ณต
Spring Data JPA๊ฐ DB์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ณผ์
Spring Data JPA <-> Hibernate <-> JDBC <-> DB