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 |