[Spring Data] Hibernate, JPA ๊ทธ๋ฆฌ๊ณ Spring Data JPA
์ง๋ ํฌ์คํธ์์ ๋ค๋ค ๋ณธ JDBC์ Spring JDBC๋ ์๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํ ์ต์ด ์ธํฐํ์ด์ค์๊ณ , ์ด๋ค ์ฝ๋๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฆฌํฉํ ๋งํ๋ ์์ ๋ค, ์ฐ๊ฒฐ ์ธ์ , ๊ทธ๋ฆฌ๊ณ ๊ด์ฌ์ ์ ๋ถ๋ฆฌ ๋ฑ ๋ค์ํ ๋ฐ์ ๋ ๋ชจ์ต์ ๋ณด์๋๋ฐ์.
์ด๋ฒ ํฌ์คํธ์์๋ ๊ทธ์ ์ด์ด์ Hibernate, JPA, Spring Data JPA์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
JPA
JPA๋ Java Persistence API์ ์ฝ์๋ก ์๋ฐ์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์์์ ์ ์ํ ์ธํฐํ์ด์ค์ ๋๋ค. ๋ง๊ทธ๋๋ก ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ฝ๋๊ฐ ๊ตฌํ๋์ด ์๋ ๊ฒ์ ์๋๋๋ค. ๋จ์ง, Java ๋ผ๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ค๊ณํ๊ธฐ ์ํ Best Practice๋ฅผ JPA๋ผ๊ณ ํ๋ ๊ฒ์ ๋๋ค.
์ฆ, ์๋ฐ ์ง์์์ ORM ๊ธฐ์ ํ์ค์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC ์ฌ์ด์์ ๋์ํ๋ ๋ ์์ ๋๋ค. ์ฌ๊ธฐ์ ORM์ด๋, Object RelationShip Mapper์ ์ฝ์๋ก JDBC๋ Spring JDBC, iBatis์์๋ DB ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ก์ง์ ๋ณ๋๋ก ์์ฑํ๊ณ , ์ด๋ฅผ SQL ์ฟผ๋ฆฌ๋ก ์ง์ํ์๋๋ฐ, ORM์ SQL ์ฝ๋๋ฅผ ๊ตฌํํ์ง ์๊ณ , ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก DB๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋ํ์ ์ธ ํ๋ ์์ํฌ๋ก Hibernate๊ฐ ์์ต๋๋ค.
Hibernate
Hibernate๋ JPA์ ๊ตฌํ์ฒด์ ๋๋ค. ์ค์ ๋ก JPA์ ํต์ฌ์ฒด์ธ EntityManagerFactory, EntityManager, EntityTransaction์ Hibernate์์๋ SessionFactory, Session, Transaction์ผ๋ก ์์๋ฐ๊ณ ๊ฐ๊ฐ Impl๋ก ๊ตฌํํ๊ณ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
์ ์ฌ์ง์์ ์ธํฐํ์ด์ค๋ก ๊ทธ๋ ค์ ธ ์๋ ๊ฒ์ JPA, ํด๋์ค๋ก ๊ทธ๋ ค์ ธ ์๋ ๊ฒ์ Hibernate์ ํด๋์ค์ ๋๋ค.
์ค๊ฐ์ ORM์ด JDBC API๋ฅผ ์ง์ ์ฌ์ฉํ์ฌ DB์ ์ ๊ทผํ๋ ๋ฐฉ์์ ๋๋ค.
์ด๋ ํ ์ ์ด ์ข์๊น?
์ฐ๋ฆฌ๊ฐ iBatis, JDBC๋ฅผ ์ฌ์ฉํ์ ๋ ๋ถํธํ๋ ๊ฒ์ ์ปค๋ฅ์ , ์ธ์ ๋ฑ ์ ๋ง์ ์ธ์คํด์ค๊ฐ ์์ฌ ์๋ ์ฝ๋๋ค์ DB์ ์ ๊ทผํ ๋๋ง๋ค ์ฌ์ฉํ์ฌ ์ค๋ณต๋ ์ฝ๋๊ฐ ๋ฐ์ํ๊ณ , ๊ด์ฌ์ ๋ถ๋ฆฌ๊ฐ ์ด๋ ค์ ๋ ์ ์ด ์์์ต๋๋ค. ์ด ๋ฌธ์ ๋ค์ iBatis๋ฅผ ํตํด์ ์ด๋ ์ ๋ ํด๊ฒฐ์ด ๋์์ง๋ง ๋ ๋ค๋ฅธ ๋ฌธ์ ์ ์ด ์์์ต๋๋ค.
๋ฐ๋ก ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋งคํํ๋ ์์ ์ธ๋ฐ์. ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ๊ฐ ์ํฐํฐ๋ค์ ๊ด๊ณํด์ผ ํ ๋๊ฐ ์๊ธฐ๊ฒ ๋ฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๊ฐ๋ฐํ๋ ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฉ์ธ ๋ชจ๋ธ๋ค์ ๊ด๊ณํ์ผ๋ก ๋ฌถ๊ธฐ ์ํจ์ธ๋ฐ, ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์ค์ ์ด๋ฌํ ์์ ์ ๋๋งก์ํ๋ ๊ฒ์ ์ฌ์ด ์ผ์ด ์๋๋๋ค.
๊ทธ๋์ ๊ฐ๋ฅํ ๊ฐ๋ฐ์๊ฐ ์ด๋ฐ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ ์ค์ด๊ณ , ์์์ ๊ด๊ณ๋ฅผ ๋งคํํด์ฃผ๋ ์ ์ ์์ฃผ ํฐ ๋ฉ๋ฆฌํธ๋ผ๊ณ ํ ์ ์์ฃ .
๊ทธ ์ธ์๋ ๋ค๋ฅธ ์ข์ ์ ๋ค์ด ์์ต๋๋ค.
- ์์ฐ์ฑ ํฅ์: ๋ฐ๋ณต์ ์ธ SQL ์ฝ๋ ๊ตฌํ, CRUD ์์ ์ ์์์ ํด์ค
- ์ ์ง๋ณด์: ๊ฐ์ฒด ์์ ์ ๋ฐ๋ฅธ SQL ์ฝ๋ ์์ ์์ ์ด ํ์ ์์
- ๋ฐ์ดํฐ ๊ด๊ณ ๋งคํ: ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฅผ ๋งคํํ๋ ๊ณผ์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํจ
- ์ฑ๋ฅ: ์บ์ฑ์ ์ง์ํ์ฌ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒ ๋์ถ
- ๋ฐ์ดํฐ ์ ๊ทผ ์ถ์ํ ๋ฐ ๋ฒค๋ ๋ ๋ฆฝ: ๋ฐ์ดํฐ์ ๊ด๊ณ๋ฅผ ๋งคํํ๋ ๊ณผ์ ์ DB๋ง๋ค ๋ค๋ฅธ๋ฐ, ์ด๋ฌํ ์์ ์ ๋ฒ๊ฑฐ๋ก์์ด ์์
ํ์ง๋ง ๋ค ์ข์ ๊ฒ์ ์๋๋ค
ORM์ด ๊ธฐ์กด์ ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ , ๊ฐ๋ฐ์๊ฐ SQL ์ฝ๋๋ฅผ ๊ฐ๋ฅํ ๊ฑด๋๋ฆฌ์ง ์๋๋ค๋ ๊ฒ์ ๋ชฉํ๋ก ํ ํ๋ ์์ํฌ์ง๋ง ์ด๊ฒ์ด ๋ชจ๋ ์ข์ง๋ง์ ์์ต๋๋ค. SQL ์ฝ๋๋ฅผ ํ ๋ฒ ์ฏค ์ง๋ดค๋ค๋ฉด ์ดํดํ์๋ ๋ถ๋ถ์ด์ง๋ง SQL ์ฝ๋๋ ์ด๋ป๊ฒ ์ง๊ธฐ์ ๋ฐ๋ผ์๋ ์ฑ๋ฅ์ด ์ข์ ์ฝ๋๊ฐ ๋ ์ ์๊ณ , ๊ทธ๋ ์ง ์์ ์ฝ๋๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ง๋ง ORM์ ํธํ๋งํผ ์ค์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋นํด ์ฑ๋ฅ์ ์ข์ง ์์ต๋๋ค. ๊ทธ๋์ ๊ฐ๋ฒผ์ด ํ๋ก์ ํธ๋ ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์๋ ์ ๋ฆฌํ์ง๋ง, ์๋น์ค์ ์๊ตฌ ์ฌํญ์ด ์ปค์ง๊ฑฐ๋ ๋ฐ์ดํฐ์ ์์ด ์ปค์ง๊ธฐ ์์ํ๋ฉด ํ๊ณ์น์ ๋๋ฌํ์ฃ . ๋ ๋ด๋ถ ๋ก์ง์ ์ ํํ ๋์์ ์ ์ ์๋ ์ํ์์ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ด ํ๋ก์ ํธ๋ผ๋ฉด ๋๋์ฑ ํ๋ค ๊ฒ์ ๋๋ค. ๊ทธ๋์ JPA์์ JPQL์ ์ง์ํ์ฌ ์์ฒด์ ์ผ๋ก Query๋ฅผ ์ ์ํ ์ ์๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ORM๊ณผ MyBatis๋ฅผ ํผ์ฉํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋๊ฐํ๋ฉด, QueryDSL ์กฐํฉ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ฃ .
๊ทธ๋ฆฌ๊ณ JPA๋ฅผ ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ฌด์๋ณด๋ค ์ ์๊ณ ์ฌ์ฉํด์ผํ๋ค๋ ์ ๋ ํ ๋ชซํฉ๋๋ค. JPA๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด Entity์ ์๋ช ์ฃผ๊ธฐ, ์บ์, ์ฐ๊ธฐ ์ง์ฐ, ์์ ์ ๋ต, ์ปฌ๋ ์ ๋งคํผ ๋ฑ DB๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ต์ ๋ค์ด ์กด์ฌํ๋๋ฐ, ์ด๋ฅผ ์ด๋ป๊ฒ ์ฐ๋๋์ ๋ฐ๋ผ์ ์ฑ๋ฅ์ด ๋ง์ด ๋ฌ๋ผ์ง๊ณ , ์ค๋ฅ์ ๋ฐ์ ์ํฅ ๋ฑ์ด ๊ฐ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ด๋ป๊ฒ ๋ณด๋ฉด SQL ์ฝ๋๋ฅผ ์์จ๋ ๋๋ค๋ ์ฅ์ ํ๋์ ๋ฌ๋ ์ปค๋ธ๊ฐ ๋ฎ์๋ณด์ผ ์ ์์ง๋ง, ์์ ๊ฐ์ ์ํฉ์ ๊ณ ๋ คํ๋ค๋ฉด, ๊ฒฐ์ฝ ๋ฌ๋ ์ปค๋ธ๊ฐ ๋ฎ์ ๋ํ๋์๋ ์๋๋ผ๋ ์ ์ด ์์ต๋๋ค.
Spring Data JPA
Spring Data JPA๋ JPA๋ฅผ Spring Framework์์ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด๋์ ๋ชจ๋์ ๋๋ค. ์ฌํ๊น์ง REST API ๊ฐ๋ฐํ์ ๋, ์ฐ๋ฆฌ๋ @Entity ์ด๋ ธํ ์ด์ , @Column ์ด๋ ธํ ์ด์ ๋ฑ ๊ฐ๋จํ ์ด๋ ธํ ์ด์ ๋ง์ ๊ฐ์ง๊ณ , ์ํฐํฐ๋ฅผ ์ ์ํ๊ณ DDL์ ์ํํ๋ ๋ฑ์ ์์ ์ ํ์์ฃ . ์ด๊ฒ์ด ๋ฐ๋ก Spring Data JPA์ ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์์ JpaRepository๋ฅผ ์ฌ์ฉํ์ฌ JPA์ ๊ตฌํ์ฒด์ธ Hibernate๋ก ์์ฒญ์ ์ ๋ฌํ๊ณ , Hibernate๋ ์ด์ ๋ง๊ฒ JDBC API๋ฅผ ์ฌ์ฉํ์ฌ DB์ ์ ๊ทผํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ ค์ฃผ๋ ๋ฐฉ์์ ๋๋ค.
์์ฒ๋ผ User๋ผ๋ ํ ์ด๋ธ์ ๋ง๋ค๊ณ ์ถ์ ๋, ๊ฐ๋จํ ์ด๋ ธํ ์ด์ ์ ์ด์ฉํ๊ณ , ํธ๋์ญ์ ๊ฐ์ฒด ๋ฑ์ ์ด์ฉํ์ง ์๋ ์ ์ ๊ต์ฅํ ํธ๋ฆฌํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ, ๋ง์ฝ ์ด๊ฑด ์ด๋จ๊น์? ์์์ฒ๋ผ ์ฌ์ฉ์์ ๊ถํ์ ์ ์ํ๊ธฐ ์ํ ์ํฐํฐ๋ฅผ ๊ตฌ์ฑํ์์ต๋๋ค. Role ์ํฐํฐ์์ ํด๋น ์ญํ ์ด ์ด๋ค ์ญํ ์ธ์ง๋ฅผ ์ ์ฅํ๋ ํ ์ด๋ธ์ด๊ณ , Role_Permisssion์ ํด๋น ์ญํ ์ด ์ด๋ค ๊ถํ์ ๊ฐ์ง๊ณ ์๋์ง ๊ถํ์ ์ ์ฅํ๋ ํ ์ด๋ธ์ด ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ ์ญํ ์ ์ฌ๋ฌ ๊ฐ์ ๊ถํ์ ๊ฐ์ง ์ ์๋ค๊ณ ๊ฐ์ ํ์ ๋, ๋ ๋ฐ์ดํฐ์ ๊ด๊ณ๋ 1:N์ด์ด์ผ ํฉ๋๋ค. ๋ง์ฝ Batis, JDBC๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ฅผ SQL ์ฝ๋๋ก ์ง์ ๋ชจ๋ ๊ฑธ ์ ์ํด์ผ ํ์ง๋ง, JPA์์๋ ์์ ๊ฐ์ด ์ด๋ ธํ ์ด์ ์ผ๋ก ์ ์ํด์ฃผ๊ณ ์์ฃ .
ํ์ง๋ง ๋ณด๋ค์ํผ ์ด ๋ถ๋ถ๋ ์ฝ์ง๋ ์์ต๋๋ค. SQL ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ ๋ฟ, Fetch๋ Cascade ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ๋ผ์ ๋ก๋ฉ ๊ธฐ๋ฒ์ด๋ ์ํฐํฐ ๋ณ๊ฒฝ ์ ๋ต์ ์ก์์ค์ผ ํ๊ณ , ๋๋ฒ๊น ๋ชจ๋๋ฅผ ํตํด SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ๋ด์ผ๋ก์จ ์ด๋ฅผ ํ๋จํ๊ณ , ์์ ํ ์ ์๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ๋ํ๋์๊ฐ ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ์ ์ค์ SQL ์ฝ๋๊ฐ ๋ฐ๋ ์๋ ์๋ ๋ถ๋ถ์ ๋จ์ ์ผ ์๋ ์๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ์ด๋ฌํ ์์ ์ด ๋ถํ์คํ๋ค๊ณ ๋๊ปด์ง๋ค๋ฉด, JPA๋ ๊ทธ๋ค์ง ์ข์ ๊ฒ๋ง์ ์๋์ง์.
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง ๊ฐ๋จํ๊ฒ JPA์ Hibernate, Spring Data JPA๋ฅผ ์ดํด๋ดค์ต๋๋ค. ์ด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ DB๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์ธ์ ๋ ์ง ์๊ธธ ์ ์๊ณ , ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ๊ธฐ ์ํด ์ด๋ค ๋ํ๋์๋ฅผ ์ฌ์ฉํด์ผ ํ๋์ง์ ๋ํ ๊ณ ๋ฏผ, ์ ์ ํ ์ ํ์ ๊ฐ๋ฐ์์ ๋ชซ์ ๋๋ค.
๋ฐ๋ผ์ ์ข์ ์ ํ๋ฆฌ์ผ์ด์ , ์ํํ ๋์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ํ๋์์ ํน์ง์ ์ ์๊ณ ์ฐ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ ๋๋ชฉ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์ ๋ JPA๋ฅผ ์ด๋ ๊ฒ ๋ณด๊ณ ์์ต๋๋ค.
JPA๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฝ๊ฒ ์ง๊ธฐ ์ํ ๊ตฌ์กฐ์ผ ๋ฟ์ด๋ค.
๋ด๋ถ์์๋ JDBC API๊ฐ ์ค์ ๋ก ๋์ํ๊ณ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์ง์ SQL ์ฝ๋๋ง ์์ฑํ์ง ์์ ๋ฟ์ด์ง, ๋์ํ๋ ๋ด๋ถ๋ ๋๊ฐ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ฑ๋ฅ์ ๋ํ ์ด์, ์ฝ๋์ ๊ฐ๋ ์ฑ ๋ฑ ์ฅ๋จ์ ์ด ์กด์ฌํ ์ ์๋ค๋ ์ . ๋ฐ๋์ ์ด ํ๋ ์์ํฌ๋ฅผ ์ฐ๋ ๊ฒ ์ ๋ต์ด ์๋๋ผ๋ ์ ์ ์๋ ค๋๋ฆฌ๊ณ ์ถ๋ค์.
์ต๊ทผ ์คํ๋ง ํ๋ก์ ํธ์์ JPA๊ฐ ๋ฌ๋ ์ปค๋ธ๊ฐ ๋๊ณ , ์คํ๋ ค SQL ์ฝ๋๋ฅผ ์ง์ ์ฐ๋ ํ๋ก์ ํธ๊ฐ ๋ง์์ง๋ฉด์ Spring Data JDBC๋ผ๋ ํ๋ก์ ํธ๊ฐ ์งํ๋๊ณ ์๋๋ฐ์. ์ด๋ป๊ฒ ๋์ฌ์ง ๊ธฐ๋๋ฉ๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring boot] ์ ํ๋ฆฌ์ผ์ด์ ์ Docker ์ด๋ฏธ์ง๋ก ๋ง๋ค๊ธฐ Old & New (0) | 2020.06.04 |
---|---|
[Spring boot] DAO์ DTO (6) | 2020.05.27 |
[Spring boot] JDBC์ Spring JDBC ๊ทธ๋ฆฌ๊ณ MyBatis (0) | 2020.05.22 |
[Spring boot] Spring Data Rest๋ฅผ ์ด์ฉํ REST API ๊ฐ๋ฐ 2 (1) | 2020.05.20 |
[Spring boot] Spring Data Rest๋ฅผ ์ด์ฉํ REST API ๊ฐ๋ฐ 1 (0) | 2020.05.20 |