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가 되는 이유
핵심은 두 가지다.
- 스프링이 Repository 인터페이스를 보고 런타임에 프록시 구현체를 자동 생성
- 그 구현체 내부에서 EntityManager(Hibernate)를 호출
그래서 개발자는:
- Hibernate 객체를 직접 만들지 않고
- EntityManager를 직접 호출하지 않아도
- repository.save() 같은 코드가 동작하는 것처럼 보이게 된다.
7. 스프링 부트가 뒤에서 해주는 일
sprint-boot-starter-data-jpa 와 DB 드라이버가 있으면 스프링 부트는 실행 시점에 자동으로 다음을 처리한다.
- DataSource(DB 연결) 설정
- JPA 설정 구성
- EntityManagerFactory 생성
- EntityManager 생성·관리
- 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 |