목차
1. Hibernate
2. Spring Data JPA
1. Hibernate
1) Hibernate
- "More Than An ORM, Discover The Hibernate Galaxy."
- 자바생태계를 대표하는 ORM framework
- 스프링 부트에서 채택한 메인 ORM framework
- JPA 표준 스펙을 구현한 JPA Provider
- 고성능, 확장성, 안정성을 표방
- 다양한 하위 제품들로 나뉨
- Hibernate ORM
- Hibernate Validator
- Hibernate Reactive
2) Hibernate Query Language: HQL
- 하이버네이트가 사용하는 SQL 스타일의 비표준 쿼리 언어
- 객체 모델에 초점을 맞춰 설계됨
- JPQL의 바탕이 됨(JPQL은 HQL의 subset)
- JPQL은 완벽한 HQL 문장이지만, 반대로는 성립하지 않음
- ex)
Query query = entityManager.createQuery(
"select p from Person p where p.name like :name"
);
TypedQuery<Person> typedQuery = entityManager.createQuery(
"select p from Person p where p.name like :name", Person.class
);
3) Criteria query
- type-safety를 제공하는 JPQL의 대안 표현법
- ex)
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
Root<Person> root = criteria.from(Person.class);
criteria.select(root);
criteria.where(builder.equal(root.get(Person_.name), "John Doe"));
List<Person> persons = entityManager.createQuery(criteria).getResultList();
4) Native SQL Query
- 특정 DB에 종속된 SQL도 사용 가능
- ex)
List<Object[]> persons = entityManager.createNativeQuery(
"SELECT * FROM Person")
.getResultList();
2. Spring Data JPA
1) Spring Data JPA
- 스프링에서 제공하는 JPA 추상화 모듈
- JPA 구현체의 사용을 한 번 더, Repository라는 개념으로 추상화
- JPA 구현체의 사용을 감추고, 다양한 지원과 설정 방법을 제공
- JPA 기본 구현체로 Hibernate 사용
- Querydsl 지원
2) Spring Data JPA를 사용한다면
- JPA, 하이버네이트를 몰라도 되어야 한다.
- EntityManager를 직접 사용하지 않는다.
- JPQL을 직접 사용하지 않는다.
- persist(), merge(), close()를 직접 사용하지 않는다.
- 트랜잭션을 getTransaction(), commit(), rollback()으로 관리하지 않는다.
- 코드가 하이버네이트를 직접 사용하고 있다면
- 꼭 필요한 코드인지, 아니면 Spring Data JPA로 할 수 있는 일인지 확인하기
- 그 코드는 하이버네이트와 직접적인 연관 관계를 가지게 됨
- 추상화의 이점을 포기하게 되는 것이다!