JPA
JPA는 Java Persistence API의 약자로, '자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스'이다.
자바 ORM(Object Relational Mapping) 기술에 대한 API 표준 명세이다. 나는 지금껏 '라이브러리' 정도로 생각하며, 사용하였다.
JPA는 단순한 인터페이스 이기 때문에 구현체가 없다. 이런 JPA의 구현체는 아래그림과 같다.
JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, DataNucleus, EclipseLink 같은 ORM 프레임워크를 사용해야한다.
그중 Hibernate가 가장 범용적으로 다양한 기능을 제공한다고 한다.
3가지 ORM 프레임워크는 다음에 찾아보자.
Hibernate
Hibernate는 JPA 구현체 중 하나이며, 다음은 JPA와 Hibernate의 상속 및 구현 관계이다.
JPA의 핵심인 EntityManagerFactory, EntityManager, EntityTransaction 인터페이스를 Hibernate는 각각 SessionFactory, Session, Transaction으로 상속받고 Impl로 구현하였다.
Hibernate는 JPA의 구현체이기때문에 다른 ORM프레임워크를 사용해도 되고, JPA는 인터페이스이기 때문에 본인이 구현하여 사용 할 수도 있다.
Hibernate 장점
- ORM 방식 사용
- Hibernate은 자바 객체와 관계형 데이터베이스 간의 매핑을 간단하게 처리한다.
- 개발자는 SQL 쿼리를 직접 작성하지않고도 객체를 데이터베이스에 저장 및 검색 등이 가능하다.
- 성능 최적화
- Hibernate은 지연 로딩(Lazy loading) 및 캐시 기능을 지원하여 애플리케이션의 성능을 향상시킬 수 있다.
- 지연 로딩은 필요한 시점에만 데이터를 로드하여 데이터베이스 액세스를 줄여준다.
- 트랜잭션 관리
- Hibernate은 ACID (원자성, 일관성, 고립성, 지속성) 트랜잭션을 지원한다.
- 트랜잭션 관리를 쉽게 할 수 있으며, 롤백과 커밋 기능을 제공한다.
Hibernate 단점
- 성능
- 물론 SQL을 직접 작성하는 것보다 메서드 호출만으로 쿼리를 수행한다는 것은 성능이 떨어질 수 있다.
- 실제로 초기의 ORM은 쿼리가 제대로 수행되지 않았고, 성능도 좋지 못했다한다.
- 그러나 지금은 많이 발전하여, 좋은 성능을 보여주고 있고 계속 발전하고 있다.
- 세밀함
- 메서드 호출로 DB 데이터를 조작 하기 때문에 세밀함이 떨어진다.
- 복잡한 통계 분석 쿼리를 메서드만으로 해결하는 것은 힘든 일이다. 이것을 보완하기 위해 SQL과 유사한 기술인 JPQL을 지원한다.
- 러닝커브
- JPA를 잘 사용하기 위해서는 알아야 할 것이 많습니다. 즉 러닝커브가 높습니다.
Spring Data JPA
Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로 JPA를 쉽고 편하게 사용하도록 도와준다.
기존 JPA의 경우 EntityManager를 주입 받아 사용해야하지만, Spring Data JPA는 JPA를 한단계 더 추상화하킨 Repository 인터페이스를 제공한다.
Repository 구현 규칙
Method
method | 기능 |
save() | 레코드 저장 (insert, update) |
findOne() | primary key로 레코드 한건 찾기 |
findAll() | 전체 레코드 불러오기. 정렬(sort), 페이징(pageable) 가능 |
count() | 레코드 갯수 |
delete() | 레코드 삭제 |
Keyword
메서드 이름 키워드 | 샘플 | 설명 |
And | findByEmailAndUserId(String email, String userId) | 여러필드를 and 로 검색 |
Or | findByEmailOrUserId(String email, String userId) | 여러필드를 or 로 검색 |
Between | findByCreatedAtBetween(Date fromDate, Date toDate) | 필드의 두 값 사이에 있는 항목 검색 |
LessThan | findByAgeGraterThanEqual(int age) | 작은 항목 검색 |
GreaterThanEqual | findByAgeGraterThanEqual(int age) | 크거나 같은 항목 검색 |
Like | findByNameLike(String name) | like 검색 |
IsNull | findByJobIsNull() | null 인 항목 검색 |
In | findByJob(String … jobs) | 여러 값중에 하나인 항목 검색 |
OrderBy | findByEmailOrderByNameAsc(String email) | 검색 결과를 정렬하여 전달 |
Hibernate와 Spring Data JPA 차이점
Spring Data JPA의 경우 DB에 접근하는 상황에서는 Repository를 정의하여 사용한다. 개발자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면 Spring이 메소드 이름에 적합한 쿼리를 만든다. 또한 Hibernate의 경우 EntityManager를 통해 관리한다. 하지만 Spring Data JPA의 경우 EntityManger를 직접 다루지않고, SimpleJpaRepository의 내부적으로 EntityManager를 사용하고 있다.