[JPA] JPA와 Hibernate 그리고 Spring Data JPA
by coco3o1. JPA(Java Persistent API)란?
JPA란 자바 ORM(Object Relational Mapping) 기술에 대한 API 표준 명세를 의미합니다.
JPA는 특정 기능을 하는 라이브러리가 아니고, ORM을 사용하기 위한 인터페이스를 모아둔 것입니다.
JPA는 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의하는 방법중 한 가지 입니다.
JPA는 단순히 명세이기 때문에 구현이 없습니다.
JPA를 정의한 javax.persistence 패키지의 대부분은 interface , enum , Exception, 그리고 Annotation 들로 이루어져 있습니다.
JPA의 핵심이 되는 EntityManager 는 아래와 같이 javax.persistence 패키지 안에 interface 로 정의되어 있습니다.
package javax.persistence;
import ...
public interface EntityManager {
public void persist(Object entity);
public <T> T merge(T entity);
public void remove(Object entity);
public <T> T find(Class<T> entityClass, Object primaryKey);
// More interface methods...
}
JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus 같은 ORM 프레임워크를 사용해야 합니다.
우리가 Hibernate를 많이 사용하는 이유는 가장 범용적으로 다양한 기능을 제공하기 때문입니다.
2. Hibernate
Hibernate는 JPA의 구현체 중 하나입니다.
Hibernate는 SQL을 사용하지 않고 직관적인 코드(메소드)를 사용해 데이터를 조작할 수 있습니다.
Hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는 것은 아닙니다.
Hibernate가 지원하는 메소드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 작성하지 않을 뿐 입니다.
JPA와 Hibernate는 마치 자바의 interface와 해당 interface를 구현한 class와 같은 관계입니다.
위 사진은 JPA와 Hibernate의 상속 및 구현 관계를 나타낸 것입니다.
JPA의 핵심인 EntityManagerFactory , EntityManager , EntityTransaction 을
Hibernate에서는 각각 SessionFactory , Session , Transaction 으로 상속받고 각각 Impl로 구현하고 있음을 확인할 수 있습니다.
Hibernate의 장단점
장점
- 생산성
- Hibernate는 SQL을 직접 사용하지 않고, 메소드 호출만으로 query가 수행된다.
- 즉, 반복적인 SQL 작업과 CRUD 작업을 직접 하지 않으므로 생산성이 매우 높아진다.
- 유지보수
- 테이블 컬럼이 변경되었을 경우,
- Mybatis에서는 관련 DAO의 파라미터, 결과, SQL 등을 모두 확인하여 수정해야 하지만
- JPA는 JPA가 이런 일들을 대신 해주기 때문에 유지보수 측면에서 좋다.
- 객체지향적 개발
- 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중할 수 있다.
- 로직을 쿼리에 집중하기 보다 객체 자체에 집중할 수 있다.
- 특정 벤더에 종속적이지 않다.
- 여러 DB 벤더 (MySQL, ORACLE 등 . .)마다 SQL 사용이 조금씩 다르기 때문에 어플리케이션 개발 시 처음 선택한 DB를 나중에 바꾸는 것은 매우 어렵다.
- 하지만 JPA는 추상화된 데이터 접근 계층을 제공하기 때문에 특정 벤더에 종속적이지 않다.
- 설정 파일에서 JPA에게 어떤 DB를 사용하고 있는지 알려주기만 하면 얼마든지 DB를 변경할 수 있다.
단점
- 어렵다.
- 많은 내용이 감싸져 있기 때문에 JPA를 잘 사용하기 위해서는 알아야 할 것이 많다.
- 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다.
- 성능
- 메소드 호출로 쿼리를 실행하는 것은 내부적으로 많은 동작이 있다는 것을 의미하므로, 직접 SQL을 호출하는것보다 성능이 떨어질 수 있다.
- 실제로 초기의 ORM은 쿼리가 제대로 수행되지 않았고, 성능도 좋지 못했다고 한다.
- 그러나 지금은 많이 발전하고 있고, 좋은 성능을 보여주고 있다.
- 세밀함이 떨어진다.
- 메소드 호출로 SQL을 실행하기 때문에 세밀함이 떨어진다. 또한 객체간의 매핑 (Entity Mapping)이 잘못되거나 JPA를 잘못 사용하여 의도하지 않은 동작을 할 수도 있다.
- 복잡한 통계 분석 쿼리를 메소드 호출로 처리하는 것은 힘들다.
- 이것을 보완하기 위해 JPA에서는 SQL과 유사한 기술인 JPQL을 지원한다.
- SQL 자체 쿼리를 작성할 수 있도록 지원도 하고 있다.
3. Spring Data JPA
Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로 JPA를 쉽고 편하게 사용할 수 있도록 도와줍니다.
기존에 JPA를 사용하려면 EntityManager를 주입받아 사용해야 하지만,
Spring Data JPA는 JPA를 한단계 더 추상화 시킨 Repository 인터페이스를 제공합니다.
Spring Data JPA가 JPA를 추상화 했다는 말은, Spring Data JPA의 Repository의 구현에서 JPA를 사용하고 있다는 것입니다.
사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면,
Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해줍니다.
Hibernate와 Spring Data JPA의 차이점
하이버네이트는 JPA 구현체이고, 스프링 데이터 JPA는 JPA에 대한 데이터 접근의 추상화라고 말할 수 있습니다.
스프링 데이터 JPA는 GenericDao라는 커스텀 구현체를 제공합니다. 이것의 메소드의 명칭으로 JPA 쿼리들을 생성할 수 있습니다.
Spring Data를 사용하면 Hibernate, Eclipse Link 등의 JPA 구현체를 사용할 수 있습니다.
또 한가지는 @Transaction 어노테이션을 통해 트랜잭션 영역을 선언하여 관리할 수 있습니다.
Hibernate는 낮은 결합도의 이점을 살린 ORM 프레임워크로써 API 레퍼런스를 제공합니다.
여기서 반드시 기억해야할 점은 Spring Data JPA는 항상 Hibernate와 같은 JPA 구현체가 필요합니다.
참고 :
https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/
https://victorydntmd.tistory.com/195
https://sas-study.tistory.com/364
'🌈Programming > JPA' 카테고리의 다른 글
[JPA] 즉시로딩과 지연로딩 알아보기(FetchType.EAGER, LAZY) (1) | 2022.01.15 |
---|---|
[JPA] 양방향 순환참조 문제 및 해결방법 (0) | 2022.01.05 |
[JPA] 연관관계 매핑 알아보기 (@ManyToOne, @OneToMany, @OneToOne, @ManyToMany) (1) | 2021.09.23 |
[JPA] querydsl 설정하기 (0) | 2021.08.05 |
[JPA] Hibernate 엔티티(Entity) 매핑하기 (0) | 2021.07.06 |
블로그의 정보
슬기로운 개발생활
coco3o