목차
구분 | JPA | Hibernate | Spring Data JPA |
개념 | Java Persistence API의 약자로, 자바 표준 ORM (인터페이스) | JPA의 구현체 중 하나 (가장 많이 사용됨) | JPA/Hibernate를 더 쉽게 사용하도록 도와주는 스프링 모듈 |
역할 | ORM(Object Relational Mapping) 표준을 정의하는 인터페이스 | JPA의 표준을 구현한 프레임워크 (구현체) | JPA/Hibernate를 추상화하여 개발 생산성을 높이는 스프링 프레임워크 |
사용 방식 | 직접 EntityManager 사용하여 쿼리 실행 | JPA의 기능을 제공하고, 추가적인 캐싱, 성능 최적화 기능 제공 | Repository 인터페이스만 정의하면 자동으로 CRUD 메서드 제공 |
코드 복잡도 | 비교적 많음 (직접 EntityManager 사용) | JPA와 비슷하지만 추가 기능 제공 | 가장 적음 (자동 CRUD 및 동적 쿼리 지원) |
JPQL 지원 | O | O | O |
Native Query 지원 | O | O | O |
Spring과의 연계 | Spring과 직접 연계 X | Spring Boot에서 기본적으로 사용됨 | Spring Boot에서 가장 권장됨 |
1. JPA (Java Persistence API)
- JPA는 자바 ORM(Object Relational Mapping) 표준 인터페이스
- 직접 사용할 수 없으며, 구현체(Hibernate, EclipseLink 등)가 필요함
- EntityManager를 통해 데이터베이스와 통신
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Member member = new Member();
member.setName("John Doe");
em.persist(member); // INSERT 실행
em.getTransaction().commit();
em.close();
emf.close();
- JPA는 인터페이스이므로 직접 사용하려면 구현체(Hibernate 등)가 필요
- 코드가 길고 복잡함
2. Hibernate (JPA 구현체)
- Hibernate는 JPA의 대표적인 구현체
- JPA에서 정의한 기능을 제공하면서 추가적인 기능(캐싱, 성능 최적화) 포함
- Spring Boot에서 기본적으로 Hibernate를 내장하여 사용
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Member member = new Member();
member.setName("John Doe");
session.save(member); // INSERT 실행
transaction.commit();
session.close();
sessionFactory.close();
- JPA보다 더 많은 기능을 제공 (예: 2차 캐시, HQL 등)
- 직접 사용하면 복잡하고, 설정이 많음
3. Spring Data JPA
- JPA/Hibernate를 더 쉽게 사용할 수 있도록 추상화한 Spring 모듈
- Repository 인터페이스만 정의하면 자동으로 CRUD 메서드를 생성
- JPA의 EntityManager를 직접 사용할 필요 없이, Spring이 관리하는 방식으로 JPA를 활용 가능
- Spring Boot에서는 자동 설정(Auto Configuration) 지원
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByName(String name); // 자동으로 쿼리 생성
}
@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
public Member saveMember(String name) {
Member member = new Member();
member.setName(name);
return memberRepository.save(member); // INSERT 실행
}
}
- JPA와 Hibernate의 복잡한 코드 없이 간단하게 CRUD 구현 가능
- 자동 CRUD 메서드 제공 (save(), findAll(), deleteById() 등)
- JPQL 없이 메서드 이름만으로 쿼리 생성 (findByName() 등)
4. JPA, Hibernate, Spring Data JPA 관계
- JPA는 인터페이스(표준)이고, Hibernate는 JPA의 구현체
- Spring Data JPA는 JPA + Hibernate를 더 쉽게 사용할 수 있도록 추상화
- Spring Boot에서는 기본적으로 Hibernate를 사용하며, Spring Data JPA와 함께 사용하면 더욱 편리
5. 언제 무엇을 사용해야 할까?
상황 | JPA | Hibernate | Spring Data JPA |
JPA 표준을 준수해야 하는 경우 | ✅ 적합 | ✅ 가능 | ❌ 불필요한 기능이 많을 수 있음 |
Hibernate의 추가 기능 (캐싱, 성능 최적화 등)이 필요한 경우 | ❌ 부족 | ✅ 적합 | ❌ Hibernate를 내부적으로 사용하지만 직접 활용 어려움 |
Spring Boot 프로젝트에서 JPA를 쉽게 사용하고 싶은 경우 | ❌ 코드가 많음 | ❌ 설정 필요 | ✅ 가장 적합 (자동 설정 및 CRUD 지원) |
단순한 CRUD 및 동적 쿼리를 쉽게 구현하고 싶은 경우 | ❌ 직접 EntityManager 사용 | ❌ Session 직접 사용 | ✅ Repository 인터페이스만으로 간편하게 구현 가능 |
- Spring Boot 프로젝트에서는 Spring Data JPA를 사용하는 것이 가장 효율적
- Hibernate는 JPA의 구현체로 사용되므로, 기본적으로 JPA를 사용할 때 Hibernate가 함께 동작
- JPA 표준을 준수하면서도 Spring 환경에서 편하게 사용하고 싶다면 Spring Data JPA를 활용하는 것이 최선
연관된 글 :
2024.06.06 - [개발/DB] - ORM(Object-Relational Mapping) 데이터베이스 액세스 프레임워크
참고:
https://lealea.tistory.com/238
https://dev-coco.tistory.com/74
https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/
'개발 > back-end' 카테고리의 다른 글
R2DBC (0) | 2024.06.17 |
---|---|
[네트워크]스토리지(Storage) (0) | 2023.05.24 |
[Apache] Kafka (0) | 2023.03.08 |
구분 | JPA | Hibernate | Spring Data JPA |
개념 | Java Persistence API의 약자로, 자바 표준 ORM (인터페이스) | JPA의 구현체 중 하나 (가장 많이 사용됨) | JPA/Hibernate를 더 쉽게 사용하도록 도와주는 스프링 모듈 |
역할 | ORM(Object Relational Mapping) 표준을 정의하는 인터페이스 | JPA의 표준을 구현한 프레임워크 (구현체) | JPA/Hibernate를 추상화하여 개발 생산성을 높이는 스프링 프레임워크 |
사용 방식 | 직접 EntityManager 사용하여 쿼리 실행 | JPA의 기능을 제공하고, 추가적인 캐싱, 성능 최적화 기능 제공 | Repository 인터페이스만 정의하면 자동으로 CRUD 메서드 제공 |
코드 복잡도 | 비교적 많음 (직접 EntityManager 사용) | JPA와 비슷하지만 추가 기능 제공 | 가장 적음 (자동 CRUD 및 동적 쿼리 지원) |
JPQL 지원 | O | O | O |
Native Query 지원 | O | O | O |
Spring과의 연계 | Spring과 직접 연계 X | Spring Boot에서 기본적으로 사용됨 | Spring Boot에서 가장 권장됨 |
1. JPA (Java Persistence API)
- JPA는 자바 ORM(Object Relational Mapping) 표준 인터페이스
- 직접 사용할 수 없으며, 구현체(Hibernate, EclipseLink 등)가 필요함
- EntityManager를 통해 데이터베이스와 통신
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Member member = new Member();
member.setName("John Doe");
em.persist(member); // INSERT 실행
em.getTransaction().commit();
em.close();
emf.close();
- JPA는 인터페이스이므로 직접 사용하려면 구현체(Hibernate 등)가 필요
- 코드가 길고 복잡함
2. Hibernate (JPA 구현체)
- Hibernate는 JPA의 대표적인 구현체
- JPA에서 정의한 기능을 제공하면서 추가적인 기능(캐싱, 성능 최적화) 포함
- Spring Boot에서 기본적으로 Hibernate를 내장하여 사용
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Member member = new Member();
member.setName("John Doe");
session.save(member); // INSERT 실행
transaction.commit();
session.close();
sessionFactory.close();
- JPA보다 더 많은 기능을 제공 (예: 2차 캐시, HQL 등)
- 직접 사용하면 복잡하고, 설정이 많음
3. Spring Data JPA
- JPA/Hibernate를 더 쉽게 사용할 수 있도록 추상화한 Spring 모듈
- Repository 인터페이스만 정의하면 자동으로 CRUD 메서드를 생성
- JPA의 EntityManager를 직접 사용할 필요 없이, Spring이 관리하는 방식으로 JPA를 활용 가능
- Spring Boot에서는 자동 설정(Auto Configuration) 지원
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByName(String name); // 자동으로 쿼리 생성
}
@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
public Member saveMember(String name) {
Member member = new Member();
member.setName(name);
return memberRepository.save(member); // INSERT 실행
}
}
- JPA와 Hibernate의 복잡한 코드 없이 간단하게 CRUD 구현 가능
- 자동 CRUD 메서드 제공 (save(), findAll(), deleteById() 등)
- JPQL 없이 메서드 이름만으로 쿼리 생성 (findByName() 등)
4. JPA, Hibernate, Spring Data JPA 관계
- JPA는 인터페이스(표준)이고, Hibernate는 JPA의 구현체
- Spring Data JPA는 JPA + Hibernate를 더 쉽게 사용할 수 있도록 추상화
- Spring Boot에서는 기본적으로 Hibernate를 사용하며, Spring Data JPA와 함께 사용하면 더욱 편리
5. 언제 무엇을 사용해야 할까?
상황 | JPA | Hibernate | Spring Data JPA |
JPA 표준을 준수해야 하는 경우 | ✅ 적합 | ✅ 가능 | ❌ 불필요한 기능이 많을 수 있음 |
Hibernate의 추가 기능 (캐싱, 성능 최적화 등)이 필요한 경우 | ❌ 부족 | ✅ 적합 | ❌ Hibernate를 내부적으로 사용하지만 직접 활용 어려움 |
Spring Boot 프로젝트에서 JPA를 쉽게 사용하고 싶은 경우 | ❌ 코드가 많음 | ❌ 설정 필요 | ✅ 가장 적합 (자동 설정 및 CRUD 지원) |
단순한 CRUD 및 동적 쿼리를 쉽게 구현하고 싶은 경우 | ❌ 직접 EntityManager 사용 | ❌ Session 직접 사용 | ✅ Repository 인터페이스만으로 간편하게 구현 가능 |
- Spring Boot 프로젝트에서는 Spring Data JPA를 사용하는 것이 가장 효율적
- Hibernate는 JPA의 구현체로 사용되므로, 기본적으로 JPA를 사용할 때 Hibernate가 함께 동작
- JPA 표준을 준수하면서도 Spring 환경에서 편하게 사용하고 싶다면 Spring Data JPA를 활용하는 것이 최선
연관된 글 :
2024.06.06 - [개발/DB] - ORM(Object-Relational Mapping) 데이터베이스 액세스 프레임워크
참고:
https://lealea.tistory.com/238
https://dev-coco.tistory.com/74
https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/
'개발 > back-end' 카테고리의 다른 글
R2DBC (0) | 2024.06.17 |
---|---|
[네트워크]스토리지(Storage) (0) | 2023.05.24 |
[Apache] Kafka (0) | 2023.03.08 |