한 줄 정리
- ORM: 객체와 테이블을 매핑하는 개념
- JPA: 자바 ORM의 표준 명세
- Hibernate: JPA를 구현한 대표적인 ORM 프레임워크
- Spring Data JPA: JPA를 더 쉽게 사용할 수 있도록 도와주는 Spring 기반 라이브러리
전체 흐름
Spring Data JPA -> JPA -> Hibernate -> JDBC -> Database
ORM(Object-Relational Mapping)ORM이란 객체 지향 프로그래밍에서, 객체와 관계형 데이터베이스의 테이블 간 데이터를 자동으로 매핑하는 기술이다.
객체 지향 언어에서는 데이터를 객체 단위로 다루고, 관계형 데이터베이스는 데이터를 테이블, 행, 열의 형태로 저장한다.
이 둘은 데이터를 표현하는 방식이 다르기 때문에 애플리케이션에서 데이터베이스를 사용할 때 변환 작업이 필요하다.
이러한 변환 작업을 자동으로 해주는 것이 ORM이다.
ORM을 사용하면 다음과 같은 장점이 있다.
JPA(Java Persistence API)JPA(Java Persistence API)는 자바에서 ORM을 사용하기 위한 표준 명세이다.
JPA는 자바 ORM 기술 표준으로 사용되는 인터페이스의 모음이고, JPA 자체가 실제로 동작하는 ORM 프레임워크는 아니다.
JPA는 표준 명세이기 때문에 실제로 동작하려면 이를 구현한 구현체가 필요하다.
대표적인 JPA 구현체로는 다음과 같은 것들이 있다.
이 중 가장 많이 사용되는 구현체가 Hibernate이다.
JPA는 다음과 같은 내용을 표준으로 정의한다.
예를 들어 JPA에서는 @Entity, @Id, @Column, @ManyToOne 같은 어노테이션을 사용해 객체와 테이블의 매핑 정보를 정의한다.
@Entity
public class Member {
@Id
private Long id;
private String name;
}
이렇게 작성하면 Member 객체는 데이터베이스의 테이블과 매핑되는 엔티티가 된다.
JPA의 핵심 목적은 SQL 중심의 개발에서 벗어나 객체 중심의 개발을 가능하게 하는 것이다.
JDBC 기반 개발에서는 데이터를 저장하거나 조회할 때 SQL을 직접 작성해야 했지만, JPA를 사용하면 객체를 저장하고 조회하는 방식으로 데이터베이스를 다룰 수 있다.
JPA를 사용하면 다음과 같은 장점이 있다.
생산성 증가
반복적인 SQL 작성에서 벗어나 객체 중심으로 개발할 수 있다.
기본적인 CRUD는 JPA가 제공하는 API를 통해 처리할 수 있기 때문에 개발자가 비즈니스 로직에 더 집중할 수 있다.
유지보수 용이
테이블 구조가 변경되었을 때 SQL을 일일이 수정해야 하는 부담이 줄어든다.
객체와 테이블의 매핑 정보를 기준으로 관리하기 때문에 변경 지점을 비교적 명확하게 파악할 수 있다.
패러다임 불일치 해결
객체 지향 프로그래밍과 관계형 데이터베이스는 데이터를 바라보는 방식이 다르다. JPA는 이러한 구조적 차이를 매핑을 통해 완화한다.
HibernateHibernate는 JPA 표준 명세를 구현한 대표적인 ORM 프레임워크이다.
Spring Boot에서 JPA를 사용할 때도 기본적으로 Hibernate가 JPA 구현체로 사용되는 경우가 많다.
Hibernate 의 주요 기능Hibernate는 JPA 명세를 따르면서도 자체적인 추가 기능을 제공한다.
이를 통해 개발자는 JDBC 연결, SQL 실행, ResultSet 매핑과 같은 반복 작업을 직접 처리하지 않아도 된다.
Hibernate 의 동작 방식Hibernate는 내부적으로 SessionFactory를 통해서 Session을 생성하고, 이 Session을 사용해 데이터베이스와 통신한다.

JPA 관점에서는 EntityManagerFactory와 EntityManager를 사용한다.
Hibernate 관점에서는 이에 대응되는 개념으로 SessionFactory와 Session이 있다.
| JPA | Hibernate |
|---|---|
| EntityManagerFactory | SessionFactory |
| EntityManager | Session |
Hibernate 사용 방법Hibernate 또는 JPA 기반 애플리케이션의 기본 사용 흐름은 다음과 같다.
예를 들어 Member라는 엔티티를 만들고, 이를 데이터베이스의 member 테이블과 매핑하면 JPA/Hibernate가 객체와 테이블 사이의 변환을 처리한다.
Spring Data JPA는 JPA를 더 쉽게 사용할 수 있도록 도와주는 Spring 기반 라이브러리이다.
JPA만 사용해도 데이터베이스 작업을 처리할 수 있지만, 기본적인 CRUD 로직을 작성하려면 여전히 반복 코드가 발생한다.
예를 들어 순수 JPA에서는 EntityManager를 사용해 저장, 조회, 수정, 삭제 로직을 직접 작성해야 한다.
Spring Data JPA는 이러한 반복 작업을 줄이기 위해 JpaRepository 같은 인터페이스를 제공한다.
Spring Boot에서 Spring Data JPA를 사용하면 로그에 Hibernate 관련 메시지가 출력되는 경우가 많다.
이는 Spring Data JPA가 내부적으로 JPA 구현체인 Hibernate를 사용하기 때문이다.
즉, 개발자는 Spring에서 Repository 인터페이스만 작성하더라도 내부적으로는 다음과 같은 흐름이 동작한다.
Spring Data JPA -> JPA -> Hibernate -> JDBC -> Database
JpaRepositorySpring Data JPA에서는 Repository 인터페이스만 정의하면 기본적인 CRUD 메서드를 자동으로 사용할 수 있다.
public interface MemberRepository extends JpaRepository<Member, Long> {
}
이렇게 작성하면 별도의 구현 클래스를 만들지 않아도 다음과 같은 메서드를 사용할 수 있다.
memberRepository.save(member);
memberRepository.findById(id);
memberRepository.findAll();
memberRepository.delete(member);
즉, Spring Data JPA는 JPA를 더 편리하게 사용할 수 있도록 Repository 계층을 추상화해준다.
| 구분 | 역할 |
|---|---|
| JPA | 자바 ORM 표준 명세 |
| Hibernate | JPA 명세를 구현한 ORM 프레임워크 |
| Spring Data JPA | JPA를 더 쉽게 사용할 수 있도록 도와주는 Spring 기반 라이브러리 |