javax.persistence 패키지의 인터페이스 집합EntityManager, EntityManagerFactory 등 JPA 인터페이스를 실제로 구현Repository 인터페이스로 반복 코드 제거Hibernate와 Spring Data JPA는 경쟁 관계가 아니라 협력 관계다.

Hibernate 직접 사용:
@Repository
public class MemberRepositoryImpl {
@PersistenceContext
private EntityManager em; // 실제 구현은 Hibernate가 제공
public Member save(Member member) {
em.persist(member);
return member;
}
public Member findById(Long id) {
return em.find(Member.class, id);
}
}
Spring Data JPA 사용:
public interface MemberRepository extends JpaRepository<Member, Long> {
// 메서드 선언만으로 자동 구현
}
// 내부적으로 SimpleJpaRepository가 위와 동일한 로직 수행
MemberRepository 인터페이스 선언SimpleJpaRepository 사용SimpleJpaRepository는 EntityManager 호출EntityManager의 실제 구현은 Hibernate가 제공
| 항목 | Hibernate | Spring Data JPA |
|---|---|---|
| 역할 | JPA 구현 | JPA 추상화 |
| 레벨 | 저수준 API | 고수준 API |
| 의존 관계 | JPA 표준에 의존 | Hibernate에 의존 |
| 코드량 | 많음 (반복적) | 적음 (자동화) |
| 유연성 | 높음 | 중간 |
결론: Spring Data JPA는 Hibernate를 대체하는 게 아니라, Hibernate를 더 쉽게 사용하도록 도와주는 도구다.

단독 사용:
혼합 사용:
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
// Spring Data JPA - 간단한 조회
List<Member> findByName(String name);
}
@Repository
@RequiredArgsConstructor
public class MemberCustomRepository {
private final EntityManager em; // Hibernate 직접 사용
public List<Member> complexQuery() {
return em.createQuery("복잡한 JPQL", Member.class)
.getResultList();
}
}
| 구분 | JPA | Hibernate | Spring Data JPA | MyBatis |
|---|---|---|---|---|
| 분류 | 명세 | 구현체 | 추상화 모듈 | SQL Mapper |
| 의존성 | - | JPA 표준 | Hibernate | JDBC |
| SQL 작성 | - | 자동 | 자동 | 직접 |
| 학습 곡선 | - | 높음 | 중간 | 낮음 |
| 생산성 | - | 중간 | 높음 | 낮음 |