개요
김영한님의 스프링, JPA 강의를 듣다가 야생형으로 프로젝트를 만들어봐야한다고해서 쓰던 애매한 개념을 갖고 Spring Data JPA의 Repository를 만지작 거리다가 그렇게 깊지않은 지식인데도 헷갈리는것 같아 글을 썼다.
JPA? Hibernate?
JPA: Java Persistence API의 약자로 데이터베이스와 객체 사이의 개념을 좁히기 위한 Interface이다.
Hibernate: JPA에서 정의한 인터페이스를 구현한 구현체이다.
DB의 테이블과 매칭되는 Entity를 영속성 컨텍스트를 이용해 엔티티를 관리하는 EntityManager를 사용해 객체와 데이터베이스를 맵핑한다.
JPA? Spring Data JPA?
Hibernate 사용 코드
public void transactionExample(){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
/**
* 트랜잭션 내용
*/
}catch (Exception e){
tx.rollback();
}finally {
tx.commit();
}
}
JPARepository 구현체 SimpleJPARepository 내 코드
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
private final EntityManager em;
// EntityManager 외 필드 생략
@Override
@Transactional
public void deleteAllInBatch() {
em.createQuery(getDeleteAllQueryString()).executeUpdate();
}
보통 스프링에서 쓰던 JPARepository, CRUDRepository같은 인터페이스들은 Spring Data JPA를 의존성추가해야 쓸 수 있고, String Data JPA는 EntityManager보다 추상화된 Reposiotry 인터페이스로 엔티티를 관리한다.
스프링에서 JPARepository와 @Transactional 의 조합으로 쓰던 JPA는 사실 JPA를 구현한 구현체를 스프링에서 쓰기 편하게 끔 만들어준 Spring Data JPA프레임워크 였다.