
JPA(Java Persistence API)는 자바 애플리케이션에서 객체(Object)와 관계형 데이터베이스(Relational Database) 사이의 데이터를 매핑해주는 ORM(Object-Relational Mapping) 기술에 대한 표준 명세(Interface)입니다.
쉽게 말해, JPA는 자바 개발자들이 SQL을 직접 작성하지 않고도 객체 지향적으로 DB를 다룰 수 있도록 도와주는 “기준”입니다.
즉, 실제로 동작하는 구현체는 아니며, 대표적인 구현체로는 Hibernate, EclipseLink 등이 있습니다.
🧱 왜 JPA를 써야 할까?
자바에서 DB와 연동하는 가장 기본적인 방식은 JDBC입니다. JDBC로 쿼리를 날릴 땐 SQL을 직접 작성해야 하며, 매핑도 수동으로 해야 합니다.
SELECT * FROM user WHERE id = 1;
이런 쿼리를 작성하는 건 반복적일 뿐만 아니라,
등의 문제가 발생합니다.
반면 JPA를 사용하면 객체 중심으로 코드를 작성하고, 복잡한 SQL 없이도 대부분의 CRUD를 처리할 수 있습니다.
userRepository.findById(1L);
JPA는 내부적으로 적절한 JPQL(HQL)을 생성하고, 이를 다시 SQL로 번역하여 실행합니다.
즉, 비즈니스 로직은 객체 중심, 실행은 SQL 기반으로 처리됩니다.
앞에서 설명한 것처럼 JPA는 단순히 "규약(인터페이스)"일 뿐이라, 혼자서는 아무것도 실행할 수 없습니다.
그래서 이 JPA를 실제로 동작하게 해주는 구현체(Implementation)가 필요한데,
그 중 가장 대표적이고 널리 사용되는 것이 바로 Hibernate입니다.
📌 Hibernate는 JPA를 구현한 ORM 프레임워크입니다.
JPA는 말 그대로 최소한의 기능만 정의한 표준이에요.
Hibernate는 이걸 기반으로 더 많은 부가기능을 제공합니다.
| JPA 기능 | Hibernate에서 지원하는 추가 기능 |
|---|---|
| CRUD (save, find 등) | Dirty Checking (변경 감지) |
| JPQL | Native SQL 지원, Criteria API 확장 |
| 엔티티 매핑 | 1차 캐시, 2차 캐시, 배치 처리, 통계 기능 등 |
| 트랜잭션 관리 | 더 다양한 전파 옵션, 고급 설정 가능 |
Spring Boot 프로젝트에 아래 의존성을 추가하면,
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
이 내부적으로 Hibernate를 기본 JPA 구현체로 사용합니다.
즉, 우리가 @Entity, @Repository, @Transactional 등을 쓰면,
실제로 SQL을 만들고 실행하는 건 Hibernate입니다.
✅ Hibernate가 SQL을 만드는 흐름
userRepository.save(new User("kim", "kim@email.com"));
위 코드 한 줄이 실행되면,
Hibernate는 중간에서 이 모든 일을 처리해주는 ORM 엔진입니다.