본문 바로가기
스프링

JPA, Hibernate, Spring Data JPA

by 흰색남자 2023. 1. 26.

JPA를 입문하면 하나를 배우는데 여러가지 용어가 나온다.

Hibernate, Spring Data JPA, JPA, Repository, Entitymanager, Entitymanagerfactory, CRUD Repository 등 헷갈리게 많이 나온다.

이 용어들을 정리하는 시간을 가져보려고 한다.

 

1. JPA - RDB의 테이블과 관계를 자바의 객체와 객체들간의 관계로 표현하여 데이터베이스를 조작하는 기술을 의미

javax.persistence

JPA는 javax.persistence 패키지에 정의되어 있으며 EntityManager, EntityManagerFactory 인터페이스와 OnetoMany, OnetoOne 등 다양한 어노테이션이 포함되어 있다.

 

2. Hibernate - JPA의 구현체  

org.hibernate.engine

EntityManagerFactory의 구현체는 위 패키지 아래의 SessionFactoryImpl에 구현되어 있다. 다른 JPA의 인터페이스도 마찬가지로 구현체를 찾아볼 수 있다.

 

3. Spring Data JPA - JPA를 편하게 쓰기 위해 만들어 놓은 모듈

org.springframework.data.jpa.repository

우리가 자주 자용하는 Repository가 있는 패키지이다. 같은 패키지 아래에 SimpleJpaRepository가 구현체이며 구현체를 살펴보면 JPA가 사용되는 것을 알 수 있다.

import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import javax.persistence.NoResultException;
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.ParameterExpression;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

위와 같은 JPA 인터페이스를 가져다가 구현해 놓은 것을 알 수 있다.

public SimpleJpaRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {

   Assert.notNull(entityInformation, "JpaEntityInformation must not be null!");
   Assert.notNull(entityManager, "EntityManager must not be null!");

   this.entityInformation = entityInformation;
   this.em = entityManager;
   this.provider = PersistenceProvider.fromEntityManager(entityManager);
}

 

똑같이 EntityManager를 생성자에 넣어주고

@Override
@Transactional
@SuppressWarnings("unchecked")
public void delete(T entity) {

   Assert.notNull(entity, "Entity must not be null!");

   if (entityInformation.isNew(entity)) {
      return;
   }

   Class<?> type = ProxyUtils.getUserClass(entity);

   T existing = (T) em.find(type, entityInformation.getId(entity));

   // if the entity to be deleted doesn't exist, delete is a NOOP
   if (existing == null) {
      return;
   }

   em.remove(em.contains(entity) ? entity : em.merge(entity));
}

 

em 을 사용하여 delete 메서드를 만들어 놓은 것을 볼 수 있다.

하지만 Spring Data JPA는 직접 HINT를 사용하지 못하기 때문에 JPA의 어노테이션을 추가적으로 달아서 DB최적화를 실시한다.

'스프링' 카테고리의 다른 글

[JAVA, Spring ] equals, hashcode  (0) 2023.06.12
자바 스프링의 AOP구현에 사용되는 도구 2가지  (0) 2023.03.19
Tomcat과 Netty  (0) 2023.02.28