JPA, Hibernate, Spring Data JPA 차이점과 동작 원리 비교

Xylitol311·2026년 1월 14일

Back-end

목록 보기
7/14

핵심 개념

JPA (Java Persistence API)

  • 자바 ORM 기술의 표준 명세 (인터페이스)
  • javax.persistence 패키지의 인터페이스 집합
  • 구현체가 없으며, 실제 동작을 위해선 구현체 필요

Hibernate

  • JPA의 구현체 중 가장 널리 사용됨
  • EntityManager, EntityManagerFactory 등 JPA 인터페이스를 실제로 구현
  • 다른 구현체: EclipseLink, DataNucleus 등

Spring Data JPA

  • JPA를 한 단계 더 추상화한 스프링 모듈
  • Repository 인터페이스로 반복 코드 제거
  • 내부적으로 Hibernate를 사용함 (기본 설정)

Hibernate vs Spring Data JPA의 핵심 차이

계층 관계

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가 위와 동일한 로직 수행

내부 동작 원리

  1. MemberRepository 인터페이스 선언
  2. Spring Data JPA가 프록시 객체 생성
  3. 프록시 내부에서 SimpleJpaRepository 사용
  4. SimpleJpaRepositoryEntityManager 호출
  5. EntityManager의 실제 구현은 Hibernate가 제공

핵심 정리

항목HibernateSpring Data JPA
역할JPA 구현JPA 추상화
레벨저수준 API고수준 API
의존 관계JPA 표준에 의존Hibernate에 의존
코드량많음 (반복적)적음 (자동화)
유연성높음중간

결론: Spring Data JPA는 Hibernate를 대체하는 게 아니라, Hibernate를 더 쉽게 사용하도록 도와주는 도구다.

MyBatis와의 차이

MyBatis

  • SQL Mapper 방식
  • 개발자가 직접 SQL 작성
  • 테이블 중심 개발
  • 복잡한 쿼리에 유리

JPA/Hibernate

  • ORM 방식
  • SQL 자동 생성
  • 객체 중심 개발
  • 생산성 향상

실무 활용

단독 사용:

  • MyBatis: SQL 직접 제어 필요시
  • Hibernate: JPA만으로 충분한 경우
  • Spring Data JPA: 표준적인 CRUD 위주

혼합 사용:

@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();
    }
}

주의사항

  • 영속성 컨텍스트 이해 필수 (1차 캐시, 변경 감지)
  • N+1 문제 주의 (fetch join, @EntityGraph)
  • 지연 로딩 vs 즉시 로딩 전략 선택
  • 복잡한 쿼리는 QueryDSL 또는 네이티브 쿼리 고려

전체 비교

구분JPAHibernateSpring Data JPAMyBatis
분류명세구현체추상화 모듈SQL Mapper
의존성-JPA 표준HibernateJDBC
SQL 작성-자동자동직접
학습 곡선-높음중간낮음
생산성-중간높음낮음

결론

  • JPA: 표준 인터페이스
  • Hibernate: JPA를 실제로 구현한 라이브러리
  • Spring Data JPA: Hibernate를 더 쉽게 사용하는 스프링 모듈
  • 셋은 함께 동작하며, Spring Data JPA → Hibernate → JDBC 순서로 호출됨
profile
문제에 도전하고 성장하는 백엔드 개발자입니다.

0개의 댓글