[스프링 로드맵] C-1. JPA 큰 그림 - JPA vs Hibernate vs Spring Data JPA

2026. 1. 19. 17:20·백엔드

REST와 DI를 어느 정도 보고 나면 자연스럽게 다음 단계로 넘어가게 된다.

“이제 DB를 붙여야 하는데 JPA, Hibernate, Spring Data JPA… 무슨 차이지”

이 글의 목적은 이름이 섞이기 쉬운 세 개를 역할 기준으로 분리해서 이해하는 것이다.

“뭘 쓰는지”보다 “누가 무슨 역할을 하는지”에 초점을 둔다.


1. 먼저 결론: 셋은 경쟁 관계가 아니다

이 셋은 서로 대체하는 관계가 아니라 위에 얹히는 구조다.

Spring Data JPA   ← 사용 편의 계층
        ↓
       JPA        ← 자바 ORM 표준(규약)
        ↓
    Hibernate     ← JPA 구현체(실행 엔진)
        ↓
       DB

2. JPA란 무엇인가 (표준, 규약)

JPA (Java Persistence API)

  • 자바에서 DB를 다루는 표준 규격
  • “객체를 테이블에 어떻게 매핑하고, 저장·조회·수정할지”에 대한 약속
  • 인터페이스 + 애너테이션 묶음
  • 단독으로는 실행되지 않는다

JPA는 “이렇게 만들어라”라고 정의한 설명서이지, 실제로 SQL을 날리거나 DB에 접근하는 프로그램은 아니다.


3. Hibernate란 무엇인가 (구현, 엔진)

Hibernate

  • JPA 규격을 실제로 동작하게 만든 구현체
  • JPA 애너테이션을 해석해서:
    • SQL 생성
    • DB 실행
    • 결과 매핑
    • 을 실제로 수행한다.

관계로 보면:

  • JPA = 규칙(스펙)
  • Hibernate = 그 규칙을 지켜서 실제로 일하는 엔진

그래서 “JPA를 쓴다”는 말은 대부분 “Hibernate를 사용 중이다”라는 의미.


4. Spring Data JPA는 JPA를 대체하지 않는다

여기서 가장 많이 생기는 오해가 있다.

❌ Spring Data JPA = JPA 대체

⭕ Spring Data JPA = JPA를 더 쉽게 쓰게 해주는 계층

 

Spring Data JPA는 JPA 위에 얹힌 편의 레이어다. 내부에서는 여전히 JPA(EntityManager) 를 사용한다.


5. 기존 JPA 방식 vs Spring Data JPA 방식

5-1. 기존 JPA 방식

@Repository
public class UserRepository {

    @PersistenceContext
    private EntityManager em;

    public User find(Long id) {
        return em.find(User.class, id);
    }
}
  • EntityManager 직접 사용
  • DAO/Repository 구현 클래스 직접 작성
  • CRUD 코드 반복

5-2. Spring Data JPA 방식

public interface UserRepository extends JpaRepository<User, Long> {
}
  • 구현 클래스 없음
  • CRUD 메서드 자동 제공: save(User), findById(Long), findAll(), deleteById(Long), count()
  • 메서드 이름 기반 쿼리 생성 가능

👉 이 차이가 Spring Data JPA의 핵심 가치다.


6. 인터페이스만으로 CRUD가 되는 이유

핵심은 두 가지다.

  1. 스프링이 Repository 인터페이스를 보고 런타임에 프록시 구현체를 자동 생성
  2. 그 구현체 내부에서 EntityManager(Hibernate)를 호출

그래서 개발자는:

  • Hibernate 객체를 직접 만들지 않고
  • EntityManager를 직접 호출하지 않아도
  • repository.save() 같은 코드가 동작하는 것처럼 보이게 된다.

7. 스프링 부트가 뒤에서 해주는 일

sprint-boot-starter-data-jpa 와 DB 드라이버가 있으면 스프링 부트는 실행 시점에 자동으로 다음을 처리한다.

  1. DataSource(DB 연결) 설정
  2. JPA 설정 구성
  3. EntityManagerFactory 생성
  4. EntityManager 생성·관리
  5. Repository 인터페이스 스캔 및 구현체 생성

그래서 개발자는 Hibernate나 EntityManager를 직접 다루지 않아도 된다.


8. EntityManager 관련 개념

지금 단계에서는 깊이 들어갈 필요 없다. “이런 구성요소가 있다” 정도만 잡으면 충분하다.

 

EntityManagerFactory

  • EntityManager를 만들어내는 공장
  • 앱 전체에서 보통 하나

EntityManager

  • 실제 DB 작업을 수행하는 핵심 객체
  • 저장, 조회, 변경 감지 수행

영속성 컨텍스트

  • EntityManager가 엔티티를 관리하는 공간
  • 엔티티 상태를 추적한다

→ 이 개념들은 다음 글에서 @Transactional과 함께 다시 등장한다.


9. 요약 3개

  • JPA는 표준, Hibernate는 구현체
  • Spring Data JPA는 JPA를 더 쉽게 쓰게 해주는 계층
  • 실행 흐름은: 내 코드 → Spring Data JPA → JPA(EntityManager) → Hibernate → DB

'백엔드' 카테고리의 다른 글

[스프링 로드맵] C-3. Repository 실전 - JpaRepository가 해주는 것들  (1) 2026.01.19
[스프링 로드맵] C-2. 엔티티 설계 - @Entity와 기본 생성자의 의미  (0) 2026.01.19
[스프링 로드맵] B-3. DI/Bean 실전 - @Autowired, @Qualifier, Profile  (0) 2026.01.19
[스프링 로드맵] B-2. DI/Bean 내부 - 빈 등록 방식과 라이프사이클  (1) 2026.01.19
[스프링 로드맵] B-1. DI/Bean 기본 - new 지옥에서 벗어나기  (1) 2026.01.19
'백엔드' 카테고리의 다른 글
  • [스프링 로드맵] C-3. Repository 실전 - JpaRepository가 해주는 것들
  • [스프링 로드맵] C-2. 엔티티 설계 - @Entity와 기본 생성자의 의미
  • [스프링 로드맵] B-3. DI/Bean 실전 - @Autowired, @Qualifier, Profile
  • [스프링 로드맵] B-2. DI/Bean 내부 - 빈 등록 방식과 라이프사이클
samsam031
samsam031
samsam031 님의 블로그 입니다.
  • samsam031
    samsam031 님의 블로그
    samsam031
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 디지털포렌식
      • 드림핵 문제풀이
      • 대외활동
      • 개발 실습
      • 컴퓨터 보안
      • 클라우드
      • 자격증
      • 자연어처리
      • 백엔드
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
samsam031
[스프링 로드맵] C-1. JPA 큰 그림 - JPA vs Hibernate vs Spring Data JPA
상단으로

티스토리툴바