๐๏ธ [Medium] JPA vs Hibernate vs DataJPA
Java์์ ๋ฐ์ดํฐ ์ง์์ฑ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ง์ ๊ด์ฌ์ ๋ฐ์์ผ๋ฉฐ, ๋์ ๋๋ ๋ฐ์ ์ ์ด๋ค์์ต๋๋ค. ์ฒ์์๋ JDBC API๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์์ ์์ํ์ฌ, ์ ์ ๋ ์ถ์ํ๋๊ณ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ํ์คํ๋ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋ฐ์ ํด์์ต๋๋ค. ย ์ด๋ฌํ ์งํ ๊ณผ์ ์์ ๋ง์ ์ง์์ฑ ๊ธฐ์ ์ด ๊ฐ๋ฐ๋์์ผ๋ฉฐ, ์ด๋ค ๊ฐ์ ์ฐจ์ด๋ ์ข ์ข ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ ํผ๋์ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ์ ๋ก๋ Hibernate, JPA, Spring Data JPA๊ฐ ์์ต๋๋ค. ย ๊ฐ๋ฐํ ๋ ์ด ์ค ํ๋๋ฅผ ์ ํํด์ผ ํ ๊น์? ์๋๋ฉด ์ด๋ค ๋ชจ๋๋ฅผ ๋์์ ์ฌ์ฉํ ์ ์์๊น์? Hibernate Hibernate๋ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ Java ORM(Object Relational Mapping) ํ๋ ์์ํฌ ์ค ํ๋๋ก, Java ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ํธ์์ฉ์ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํ๋ ์์ํฌ๋ Java ํด๋์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์๋ฐฉํฅ์ผ๋ก ๋งคํํ ์ ์์ผ๋ฉฐ, ๊ฐ์ฒด/๊ด๊ณ ๋ถ์ผ์น ๋ฌธ์ ์ ๋ํ ์์ ํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. Hibernate๋ ์ฃผ์(annotations)์ ์ฌ์ฉํ์ฌ ๋งคํ์ด ์ด๋ฃจ์ด์ง๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค. ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ฃผ์ ์ค ์ผ๋ถ๋ ์๋์ ๋์ ์์ต๋๋ค. @Entity @Table(name = "CAR") public class Car { @Id @Column(name = "CAR_ID") private Long cardId; @Column(name = "COLOR") private String color; @ManyToOne() @JoinColumn(name = "OWNER_ID") private Owner owner; } Hibernate๊ฐ Java์์ ๋งค์ฐ ์ธ๊ธฐ๊ฐ ์๋ ์ด์ ๋ ๋ช ๊ฐ์ง ์ฅ์ ๋๋ฌธ์ ๋๋ค: ย * ์์ฐ์ฑ: ๋๋ถ๋ถ์ ๊ตฌํ์ด ๊ฐ๋ฐ์์๊ฒ ์จ๊ฒจ์ ธ ์์ด ๋น์ฆ๋์ค ๋ฌธ์ ์ ๋ํ ์ต์ ์ ํด๊ฒฐ์ฑ ์ ์ง์คํ๊ธฐ๊ฐ ํจ์ฌ ์ฌ์์ง๋๋ค. * ์ฑ๋ฅ: Hibernate๋ ์บ์ฑ(caching) ๋ฐ ๋ฐฐ์นญ(batching)๊ณผ ๊ฐ์ ์ฌ๋ฌ ์ต์ ํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. * ์ง๊ด์ฑ: ๋๋ถ๋ถ์ ์์ ์ ์ ๋ ธํ ์ด์ ์ ํตํด ์ํํ๋ฏ๋ก ์ฝ๊ฒ ์ดํดํ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. Hibernate๋ ์๊ฐ์ด ์ง๋๋ฉด์ JPA ํ์ค์ ์ค์ํ๊ณ ๊ทธ ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ฒ ๋์์ต๋๋ค. ๋ํ, Hibernate๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๊ณ ์ผ๋ถ ๊ณ ์ ํ ๊ธฐ๋ฅ์ ๊ณ์ ์ฌ์ฉํ๊ธฐ ์ํด ์์ฒด์ ์ธ ๊ตฌํ๋ ์ ์งํ๊ณ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฌ๊ธฐ์ ๋งํ๋ JPA๋ ๋ฌด์์ผ๊น์? JPA JPA(Java Persistence API)๋ ๊ท๊ฒฉ์ด์, Java์์ ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ์ ์ฅํ๋ ํ์คํ๋ ๋ฉ์ปค๋์ฆ์ ์ผ๋ถ๊ฐ ๋๊ณ ์ ํ๋ ORM ํ๋ ์์ํฌ๊ฐ ๊ตฌํํด์ผ ํ๋ ์ผ๋ จ์ ๊ท์น์ ๋๋ค. ย JPA๋ Hibernate์ ๊ฐ์ ํ๋ ์์ํฌ๊ฐ ์๋๋ผ, ORM ํ๋ ์์ํฌ๊ฐ ๊ตฌํํด์ผ ํ๋ ์ธํฐํ์ด์ค์ ๋ถ๊ณผํฉ๋๋ค. ย JPA๋ ์ง์์ฑ ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด EntityManager์ EntityManagerFactory์ ์์กดํฉ๋๋ค. EntityManager๋ ์ํฐํฐ์ ์ํ ๋ณํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ด๋ฅผ SQL ์ฟผ๋ฆฌ๋ก ๋ณํํ๋ Persistence Context๋ก ์๋ํฉ๋๋ค. JPA์ ์ฃผ์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: * ์ํธ ์ด์ฉ์ฑ(Interportability): ๋ ํ๋ ์์ํฌ๊ฐ JPA๋ฅผ ์ค์ํ๋ ๊ฒฝ์ฐ, ํ ORM ํ๋ ์์ํฌ์์ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ์ด๋ํ๋ ๊ณผ์ ์ด ํจ์ฌ ์ฌ์์ง๋๋ค. * ์ฌ์ฉ ํธ์์ฑ(Usability): JPQL์ด ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ ๋ ์ํฐํฐ ํด๋์ค์ ๊ทธ ํ๋๋ฅผ ์ธ์ํ ์ ์๊ธฐ ๋๋ฌธ์ SQL ์ฟผ๋ฆฌ ์์ฑ์ด ๋์ฑ ์ฌ์์ง๋๋ค. Spring Data JPA Hibernate์ JPA๊ฐ ๋ชจ๋ Java ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์๋ ๋ฐ๋ฉด, Spring Data JPA๋ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ๋ก ์ฌ์ฉ๋ฉ๋๋ค. Spring Data JPA๋ Spring Data ํ๋ก์ ํธ์ ์ผ๋ถ๋ก, ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐ ํ์ํ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ฌ์ค์ผ๋ก์จ Spring ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ๋ณต์ก์ฑ์ ์ค์ด๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ด๋ JPA ์์ ์ ๋์ฑ ์์ฐ์ ์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ์ถ๊ฐ์ ์ธ ์ถ์ํ ์์ค์ ์ ๊ณตํฉ๋๋ค. Spring Data JPA์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ค ํ๋๋ Spring์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ, SimpleJpaRepository์ ๋์์ผ๋ก ๋ฆฌํฌ์งํ ๋ฆฌ์ ๊ตฌํ์ด ๋ฐํ์์ ์๋์ผ๋ก ์ด๋ฃจ์ด์ง๋ค๋ ์ ์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์์์ฑ ๋ฐ์ดํฐ์ ์ก์ธ์คํ๊ธฐ ์ํด ์๋ก์ด ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ ํ ๋, JpaRepository๋ฅผ ํ์ฅํ๋ ์ธํฐํ์ด์ค๋ง ์์ฑํ๋ฉด ๋ชจ๋ ๋ฉ์๋๊ฐ ์๋์ผ๋ก ๊ตฌํ๋ฉ๋๋ค. ์ ๋ง ํธ๋ฆฌํ์ฃ ! ๊ฒฐ๋ก ๊ธ์ ์ด๋ฐ์ ์ ๊ธฐ๋ ์ง๋ฌธ์ ๋ํ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: ย ๋ค, Hibernate, JPA ๋ฐ Spring Data JPA๋ ๊ฐ์๊ฐ ๊ฐ๋ฐ ๋จ๊ณ์์ ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๋ฏ๋ก, ๊ทธ ์ ์ฌ์ฑ์๋ ๋ถ๊ตฌํ๊ณ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฒ์ญ: [https://ducktopia.tistory.com/131] ์๋ฌธ: