[Spring] νΌλλλ JPA κ°λ μ 리 (Hibernate, Spring Data JPA)
π± μ΄ κΈμ μ°λ μ΄μ
μ·¨μ μ€λΉλ₯Ό νλ©° λ©΄μ μ 보λ€λ³΄λ©΄ JPA μ κ°λ μ λ§€λ² λμ¬λ§νΌ λ¨κ³¨ μ§λ¬Έμ΄λΌκ³ λ³Ό μ μμ΅λλ€. νμ§λ§, λ§€λ² Hibernate λ JPA μ ꡬν체μ λλ€! λΌλ λλ΅λ§ ν΄μκ³ , μμ§ν μ°¨μ΄λ₯Ό μ λλ‘ μ΄ν΄νκ³ μμ§ μλ€κ³ λκΌμ΅λλ€. κ·Έλμ μ΄λ² κΈ°νμ JPA, Hibernate, Spring Data JPA μ μ°¨μ΄μ λν΄ κ³΅λΆνκ³ μ 리ν΄λ³΄λ μκ°μ κ°μ Έλ³΄λ € ν©λλ€. π
π€ JPA λ?
JPA λ Java Persistence API μ μ½μλ‘, μλ° μ ν리μΌμ΄μ κ³Ό κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ μ¬μ΄μ λ°μ΄ν° μμμ±μ κ΄λ¦¬νκΈ° μν νμ€νλ μΈν°νμ΄μ€λ₯Ό μ 곡νλ κΈ°μ μ λλ€. JPA λ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°κ³Ό κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ κ°μ λΆμΌμΉλ₯Ό ν΄κ²°νκΈ° μν΄ κ°μ²΄μ λ°μ΄ν°λ² μ΄μ€λ₯Ό λ§€ννλ κΈ°λ₯μ μ 곡ν©λλ€. μ΄λ¬ν κΈ°μ μ ORM μ΄λΌκ³ ν©λλ€.
μ¬κΈ°μ JPA λ μΈν°νμ΄μ€λΌλ μ μ μ£Όμν΄μΌ ν©λλ€. μ΄ μΈν°νμ΄μ€λ javax.persistence
ν¨ν€μ§μ μ μλμ΄ μμΌλ©°, λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ©μ μν λ©μλλ€μ ν¬ν¨νκ³ μμ΅λλ€. κ·Έλ κΈ° λλ¬Έμ JPA μ λͺ
μΈλ κΈ°λ₯λ€μ μ€μ λ‘ λμνκ² νκΈ° μν΄μλ μ΄λ₯Ό ꡬνν ORM νλ μμν¬λ₯Ό μ¬μ©ν΄μΌ ν©λλ€. λνμ μΈ JPA ꡬνμ²΄λ‘ Hibernate, EclipseLink, OpenJPA λ±μ΄ μ‘΄μ¬ν©λλ€.
π€ ORM μ΄λ?
ORM μ Object-Relational Mapping μ μ½μλ‘, κ°μ²΄μ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ κ°μ λ§€νμ μλννλ κΈ°μ μ λλ€. ORM μ κ°λ°μκ° μ§μ SQL 쿼리λ₯Ό μμ±νμ§ μκ³ λ κ°μ²΄λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ₯νκ³ μ‘°νν μ μκ² ν΄μ€λλ€. JPA λ μ΄λ¬ν ORM κΈ°μ μ ν μ’ λ₯λ‘, κ°μ²΄μ λ°μ΄ν°λ² μ΄μ€ κ°μ λ§€νμ μν κΈ°λ₯μ μ 곡νλ μΈν°νμ΄μ€μ λλ€.
π€ Hibernate λ?
Hibernate λ μμμ μΈκΈνλ κ²μ²λΌ JPA μ ꡬν체 μ€ νλμ λλ€.
μ μ¬μ§μ Hibernate 곡μλ¬Έμμμ μ 곡νλ JPA μΈν°νμ΄μ€μ Hibernate ꡬν체 κ°μ μμ λ° κ΅¬ν κ΄κ³λ₯Ό λ€μ΄μ΄κ·Έλ¨μΌλ‘ λνλΈ λͺ¨μ΅μ
λλ€. λ€μ΄μ΄κ·Έλ¨μ μ΄ν΄λ³΄λ©΄ JPA μ μΈν°νμ΄μ€μΈ EntityManagerFactory
, EntityManager
, EntityTransaction
μ Hibernate ꡬν체μμ μμλ°μ ꡬννκ³ μλ κ²μ νμΈν μ μμ΅λλ€.
Hibernate λ JPA μ ꡬν체 μ€ νλμ΄κΈ° λλ¬Έμ, JPA λ₯Ό μ¬μ©νκΈ° μν΄μ λ°λμ Hibernate λ₯Ό μ¬μ©ν νμλ μμ΅λλ€. νλ‘μ νΈμ μꡬμ¬νκ³Ό μν©μ λ°λΌ EclipseLink, OpenJPA μ κ°μ λ€λ₯Έ ꡬν체λ₯Ό μ¬μ©ν μλ μκ³ , μ¬μ§μ΄λ μ§μ JPA μ ꡬν체λ₯Ό ꡬνν΄μ μ¬μ©ν μλ μμ΅λλ€. νμ§λ§, Hibernate κ° κ°μ₯ λ§μ΄ μ¬μ©λλ μ΄μ λ μ€λ κΈ°κ° λμ λ§μ κ°λ°μλ€μκ² μ¬μ©λλ©° μ±μν΄μ§ λΌμ΄λΈλ¬λ¦¬μ΄κΈ° λλ¬Έμ΄λΌλ κ²μ μ΄ν΄νλ©΄ μ’μ κ² κ°μ΅λλ€.
π€ Spring Data JPA λ?
Spring Data JPA λ Hibernate μ JPA λ₯Ό κΈ°λ°μΌλ‘ν λ°μ΄ν° μμΈμ€ κΈ°μ μ λ³΄λ€ κ°νΈνκ² μ¬μ©ν μ μλλ‘ μ§μνλ Spring Framework μ νλ‘μ νΈ μ€ νλμ λλ€.
Spring Data JPA μμλ JPA λ₯Ό νλ¨κ³ λ μΆμνμν¨ Repository
λΌλ μΈν°νμ΄μ€λ₯Ό μ 곡ν΄μ κ°λ°μκ° JPA λ₯Ό λ μ½κ³ κ°νΈνκ² μ¬μ©ν μ μλλ‘ λμμ£Όκ³ μμ΅λλ€. Repository
μΈν°νμ΄μ€μ κΈ°λ³Έ ꡬνμ²΄μΈ SimpleJpaRepository
μ μ½λλ₯Ό 보면 λ΄λΆμ μΌλ‘ JPA μ μΈν°νμ΄μ€ μ€ νλμΈ EntityManager
λ₯Ό μ¬μ©νκ³ μλ κ²μ νμΈν μ μμ΅λλ€.
package org.springframework.data.jpa.repository.support;
import ...
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
...
private final EntityManager em;
...
@Override
public Optional<T> findById(ID id) {
...
}
// Other methods
}