Hibernate와 Spring Data JPA의 차이점은 무엇입니까?


207

Hibernate와 Spring Data JPA의 주요 차이점은 무엇입니까? 언제 Hibernate 또는 Spring Data JPA를 사용해서는 안됩니까? 또한 Spring JDBC 템플릿은 언제 Hibernate / Spring Data JPA보다 성능이 좋을까요?


7
@NeilStockton은 두 기술의 비교를 요구하는 것은 의견을 요구하지 않습니다.
Philip Rego

답변:


262

Hibernate는 JPA 구현이고 Spring Data JPA는 JPA 데이터 액세스 추상화입니다. Spring Data JPA는 JPA 제공자없이 작동 할 수 없습니다.

Spring Data는 DDD Repository패턴 또는 레거시 GenericDao사용자 정의 구현에 대한 솔루션을 제공합니다 . 또한 메소드 이름 규칙을 통해 JPA 쿼리를 생성 할 수도 있습니다.

Spring Data를 사용하면 Hibernate, Eclipse Link 또는 기타 JPA 제공자를 사용할 수 있습니다. Spring 또는 Java EE를 사용하면 매우 흥미로운 이점은 주석을 사용하여 트랜잭션 경계를 선언적으로 제어 할 수@Transactional 있다는 입니다.

Spring JDBC는 훨씬 가벼우 며 기본 쿼리를 위해 만들어졌으며 JDBC 만 사용하려는 경우 Spring JDBC를 사용하여 JDBC 상세 정보를 처리하는 것이 좋습니다.

따라서 최대 절전 모드와 스프링 데이터는 경쟁사보다는 보완 적입니다.


52
이것이 스프링 데이터 JPA 자체가 존재할 수 없다는 것을 의미합니까? 즉, Hibernate, Eclipselink 또는 다른 JPA 제공자와 같은 JPA 제공자 중 하나를 사용합니까?
CuriousMind

최대 절전 모드 만 사용하는 경우 최대 절전 모드 수준에 대한 구성이 거의 없습니다. 스프링 데이터 jpa를 사용하면 최대 절전 모드보다 훨씬 쉽습니다. 이런 의미에서 나는 그 질문을했다.
Asif Mushtaq

1
보다 정확하게는 지금까지 모든 것이 잘 작동합니다. Spring Data JPA와 같은 최상위 수준을 이해하기 만하면됩니다. 첫 번째 예외를 제외하면 잠재적으로 하위 수준, 즉 최대 절전 모드, JDBC 데이터베이스 를 알아야합니다 .
Marmite Bomber

138

우리가 여기서 사용하고있는 3 가지 다른 것들이 있습니다 :

  1. JPA : Java 객체에서 데이터베이스의 관계로 데이터를 지속, 읽기, 관리하기위한 사양을 제공하는 Java 지속성 API.
  2. 최대 절전 모드 : jpa를 구현하는 다양한 공급자가 있습니다. 최대 절전 모드는 그 중 하나입니다. 그래서 다른 제공자도 있습니다. 그러나 봄에 jpa를 사용하면 나중에 다른 공급자로 전환 할 수 있습니다.
  3. 스프링 데이터 JPA : 이것은 스프링이 당신의 인생을 쉽게 만들어주는 jpa 위에 또 다른 층입니다.

스프링 데이터 JPA와 스프링 + 최대 절전 모드가 어떻게 작동하는지 이해 하자.


스프링 데이터 JPA :

애플리케이션에 spring + hibernate를 사용한다고 가정 해 봅시다. 이제 최대 절전 모드의 SessionFactory를 사용하여 crud 작업을 작성하는 dao 인터페이스 및 구현이 필요합니다. 내일 Employee 클래스에 대한 dao 클래스를 작성한다고 가정 해 봅시다. 내일 응용 프로그램에서 다른 엔티티에 대해 비슷한 crud 작업을 작성해야 할 수도 있습니다. 여기에 보일 수있는 상용구 코드가 많이 있습니다.

이제 Spring 데이터 jpa를 사용하면 리포지토리 (crudrepository, jparepository)를 확장하여 dao 인터페이스를 정의 할 수 있으므로 런타임에 dao 구현을 제공합니다. 더 이상 dao 구현을 작성할 필요가 없습니다. 이것은 스프링 데이터 JPA가 삶을 쉽게 만드는 방법입니다.


3
스프링 데이터 JPA의 기본 구현은 무엇입니까? PagingAndSortingRepository를 사용할 때 최대 절전 모드입니까? 콘솔에 최대 절전 모드 로그가 표시됩니다.
Vicky

2
Spring Data JPA는 기본적으로 Hibernate 구현을 사용했다. spring-boot-starter-data-jpa의 전이 의존성을 볼 수 있다면 거기에서 hibernate-core를 볼 수있다
IamVickyAV

28

SpringJPA에 동의하지 않으면 쉽게 살 수 있습니다. 예, 일부 클래스를 제공하며 간단한 DAO를 빠르게 만들 수 있지만 실제로는 할 수있는 모든 것입니다. findById () 이상의 작업을 수행하거나 저장하려면 지옥을 거쳐야합니다.

  • org.springframework.data.repository 클래스에는 EntityManager 액세스 권한이 없습니다 (이것은 기본 JPA 클래스입니다).
  • 자체 트랜잭션 관리 (최대 절전 트랜잭션 허용 안 함)
  • 둘 이상의 데이터 소스 구성과 관련된 큰 문제
  • 데이터 소스 풀링 없음 (HikariCP는 타사 라이브러리로 사용 중이어야 함)

자체 트랜잭션 관리가 단점 인 이유는 무엇입니까? Java 1.8은 기본 메소드를 인터페이스, Spring 어노테이션 기반 트랜잭션으로 허용하므로 단순하게 작동하지 않습니다.

불행히도 SpringJPA는 리플렉션을 기반으로하며 때로는 메소드 이름이나 엔티티 패키지를 주석 (!)으로 가리켜 야합니다. 리팩토링이 큰 충돌을 일으키는 이유입니다. 슬프게도 @Transactional은 기본 DS에서만 작동합니다. (따라서 둘 이상의 데이터 소스가있는 경우 트랜잭션은 기본 소스에 대해서만 작동합니다.)

Hibernate와 Spring Data JPA의 주요 차이점은 무엇입니까?

Hibernate는 JPA 호환, SpringJPA Spring 호환입니다. SpringJPA를 Spring-SpringBoot에서 사용할 수있는 경우 HibernateJPA DAO를 JavaEE 또는 Hibernate Standalone과 함께 사용할 수 있습니다.

언제 Hibernate 또는 Spring Data JPA를 사용해서는 안됩니까? 또한 Spring JDBC 템플릿은 언제 Hibernate / Spring Data JPA보다 성능이 좋을까요?

많은 조인을 사용해야하거나 여러 데이터 소스 연결이있는 Spring을 사용해야하는 경우에만 Spring JDBC를 사용하십시오. 일반적으로 조인용 JPA는 피하십시오.

그러나 나의 일반적인 조언은 신선한 솔루션 인 Daobab ( http://www.daobab.io )을 사용하는 것입니다. Daobab은 저의 Java 및 JPA 엔진 통합 자이며, 여러분의 작업에 많은 도움이 될 것이라고 믿습니다. :)


2
Daobab, 정말로? Jpql과 같은 유형의 안전성을 좋아하지 않는다면 (J는 싫어) JPA에는 유형 안전 기준 API가 있습니다 ... 표준 JPA는 그 나쁜 대안보다 낫습니다.
ymajoros

8

Spring Data편의점은 JPA많은 것들을 추상화하고 지속성 저장소 액세스에 Spring의 마법을 가져옵니다. 주로 관계형 데이터베이스 작업에 사용됩니다. 즉, findByNameOrderByAge(String name);런타임에 구문 분석되고 적절한 JPA쿼리 로 변환 될 수 있는 메소드가있는 인터페이스를 선언 할 수 있습니다 .

그것의 배치 JPA는 다음에 대한 유혹을 만듭니다 :

  1. 잘 모르 SQL거나 모르는 신인 개발자 . 이것은 재난에 대한 레시피이지만 프로젝트가 사소한 경우에는 벗어날 수 있습니다.

  2. 자신이하는 일을 알고 일을 빠르게 시작하려는 숙련 된 엔지니어. 이것은 실행 가능한 전략 일 수 있습니다 (그러나 더 읽으십시오).

에 대한 나의 경험에서 Spring Data마술이 너무 큽니다 ( Spring일반적으로 적용 가능함 ). 나는 하나의 프로젝트에서 그것을 많이 사용하기 시작했고 결국 라이브러리를 방해 할 수 없었고 추악한 해결책으로 끝나는 몇 가지 모퉁이 사건을 겪었습니다. 나중에 다른 사용자의 불만 사항을 읽고이 문제가에 대한 것임을 깨달았습니다 Spring Data. 예를 들어, 몇 시간 동안 조사 / 맹세를 유발 한이 문제를 확인하십시오.

 public TourAccommodationRate createTourAccommodationRate(
        @RequestBody TourAccommodationRate tourAccommodationRate
    ) {
        if (tourAccommodationRate.getId() != null) {
            throw new BadRequestException("id MUST NOT be specified in a body during entry creation");
        }

        // This is an ugly hack required for the Room slim model to work. The problem stems from the fact that
        // when we send a child entity having the many-to-many (M:N) relation to the containing entity, its
        // information is not fetched. As a result, we get NPEs when trying to access all but its Id in the
        // code creating the corresponding slim model. By detaching the entity from the persistence context we
        // force the ORM to re-fetch it from the database instead of taking it from the cache

        tourAccommodationRateRepository.save(tourAccommodationRate);
        entityManager.detach(tourAccommodationRate);
        return tourAccommodationRateRepository.findOne(tourAccommodationRate.getId());
    }

나는 더 낮은 레벨로 올라 갔고 사용하기 시작했습니다 JDBI. 이를 통해 SQL 쿼리를 완벽하게 제어 할 수 있으며 라이브러리와 싸울 필요가 거의 없습니다.


이것은 좋은 대답이지만 코너 사례를 나열하고 자세히 설명하면 더 도움이 될 것입니다. 큰 답변이 될 것입니다. 감사합니다
John

글쎄, 꽤 오랫동안 Spring Data로 작업하지 않은 사람들을 기억하는 것은 쉽지 않습니다. 이전 코드를 살펴보고 더 많은 주석을 추가 할 것입니다. 그러나 JPA에서 내 머리에서 바로 짜증나는 것 중 하나는 매우 자주 객체를 서로 참조해야합니다 (예 : 계단식 작업). Spring이 직렬화하려고 할 때 스택 오버플로 오류 (순환 참조로 인해)가 발생하여 추악한 조정 / 해결 방법이 발생합니다. 이 문제는 JPA 문제이기 때문에 Spring Data와 접합니다. 그러나 JPA는 기본 스프링 데이터이므로 "무료"로 제공됩니다.
raiks

게시물을 수정하고 예를 하나 더 추가했습니다.
raiks

1

최대 절전 모드는 데이터베이스의 Java 객체에 대한 사양 인 "JPA"의 구현입니다.

다른 ORMS간에 전환 할 수 있으므로 wrt JPA를 사용하는 것이 좋습니다.

JDBC를 사용할 때는 SQL 쿼리를 사용해야하므로 SQL에 능숙하다면 JDBC로 이동하십시오.


1

SQL 쿼리에 대한 단순성과 더 많은 제어를 원한다면 Spring Data / Spring JDBC를 사용하는 것이 좋습니다.

JPA에는 많은 양의 학습 곡선이 있으며 때로는 문제를 디버깅하기가 어렵습니다. 반면 SQL을 완전히 제어 할 수 있지만 쿼리를 최적화하고 성능을 향상시키는 것이 훨씬 쉬워집니다. SQL을 DBA 또는 데이터베이스에 대해 잘 알고있는 사람과 쉽게 공유 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.