JPA(Java Persistence API)는 Java에서 객체를 관계형 데이터베이스에 매핑(ORM: Object-Relational Mapping)하기 위한 표준 인터페이스입니다.
JPA는 데이터베이스 작업을 객체지향적으로 처리할 수 있도록 도와주며, SQL의 직접 작성 필요성을 줄이고 생산성을 높입니다.
2. JPA의 주요 특징
특징
설명
ORM(Object-Relational Mapping)
자바 객체와 데이터베이스 테이블 간의 자동 매핑을 제공.
표준 인터페이스 제공
Hibernate, EclipseLink 등 다양한 구현체에서 동작하도록 표준화된 API를 제공.
JPQL(Java Persistence Query Language)
SQL과 유사한 문법을 가진 객체 중심의 질의 언어.
트랜잭션 관리
트랜잭션을 간단히 관리할 수 있는 기능을 제공.
캐싱 지원
1차 캐시(EntityManager)와 2차 캐시(Cache Provider)를 통한 성능 최적화.
Lazy/Eager Loading
데이터 로드 전략 설정 (지연 로딩 / 즉시 로딩).
DB 독립성
특정 DBMS에 종속되지 않고 다수의 데이터베이스에서 사용할 수 있음.
3. JPA의 동작 원리
JPA에서 데이터 저장 및 조회 과정
Entity 객체 생성: 데이터를 표현하는 객체(Entity)를 정의.
EntityManager:
JPA의 핵심 인터페이스로, Entity의 상태를 관리.
데이터베이스와의 연결 및 CRUD 작업 처리.
Persistence Context:
EntityManager에서 관리하는 객체들의 집합.
1차 캐시를 활용하여 같은 트랜잭션 내에서 동일 객체 재사용.
4. JPA의 구조
EntityManager: JPA의 핵심 역할, 애플리케이션과 데이터베이스 간 데이터 접근을 중재.
Persistence Context: 1차 캐시 역할로, 동일 객체를 반복적으로 데이터베이스에서 조회하지 않음.
Database: 실제 데이터가 저장되는 관계형 데이터베이스.
Hibernate란?
Hibernate는 JPA(Java Persistence API)의 구현체 중 하나로, 객체지향 프로그래밍과 관계형 데이터베이스 간의 매핑을 지원하는 강력한 ORM(Object-Relational Mapping) 프레임워크입니다.
데이터베이스와의 상호작용을 객체 중심으로 처리할 수 있도록 하며, JPA 표준을 기반으로 추가적인 기능과 성능 최적화를 제공합니다.
Hibernate의 주요 특징
특징
설명
JPA 구현체
JPA 표준 API를 구현하여 JPA 기능을 사용할 수 있음.
HQL (Hibernate Query Language)
객체를 기반으로 한 SQL 유사 질의 언어 제공.
캐싱 지원
1차 캐시(세션)와 2차 캐시(Ehcache, Hazelcast 등) 제공.
데이터베이스 독립성
SQL Dialect를 사용하여 다양한 데이터베이스 지원.
Lazy/Eager Loading
연관된 데이터를 지연 로딩(Lazy Loading) 또는 즉시 로딩(Eager Loading) 설정 가능.
Auto Schema Generation
애플리케이션 실행 시 데이터베이스 테이블 생성 및 업데이트 자동화.
추상화된 데이터 접근
데이터 접근 코드의 중복을 줄이고 객체 중심으로 설계 가능.
Hibernate와 JPA의 관계
Hibernate는 JPA의 구현체로, JPA 표준에서 제공하는 기능 외에도 Hibernate 고유의 확장 기능을 제공합니다.
JPA 표준만 사용하는 경우 다른 JPA 구현체로 쉽게 교체 가능하지만, Hibernate 고유의 기능을 사용하면 특정 구현체에 종속될 수 있습니다.
항목
JPA
Hibernate
표준 여부
Java EE 표준 API
JPA의 구현체
쿼리 언어
JPQL(Java Persistence Query Language)
HQL(Hibernate Query Language)
기능
표준화된 기능 제공
캐싱, 데이터베이스 다이얼렉트 등 고유 기능 제공
사용성
독립적인 추상화 계층
JPA 기능 외의 확장된 기능 사용 가능
Hibernate의 주요 구성 요소
구성 요소
설명
Configuration
Hibernate 설정을 담당하며, 데이터베이스 연결 정보 및 매핑 정보를 정의.
Session
데이터베이스와의 연결을 관리하며, 객체의 영속성 상태를 유지하는 인터페이스.
SessionFactory
세션을 생성하는 팩토리 역할, 애플리케이션당 하나만 생성.
Transaction
트랜잭션 관리 및 작업의 원자성을 보장.
Query
HQL 또는 SQL을 실행하는 객체.
Hibernate의 동작 과정
Entity: 객체와 데이터베이스 테이블 간의 매핑을 정의.
Session: Hibernate와 데이터베이스 간의 연결 및 작업을 수행.
Persistence Context: 세션이 관리하는 1차 캐시 영역.
Database: 실제 데이터를 저장하는 관계형 데이터베이스.
Hibernate의 핵심 개념
(1) Entity
데이터베이스 테이블에 매핑되는 클래스.
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true)
private String email;
}
(2) Session
Hibernate의 단일 데이터베이스 작업 단위.
CRUD 작업 수행:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setName("홍길동");
user.setEmail("hong@example.com");
session.save(user);
tx.commit();
session.close();
(3) HQL
SQL과 유사하지만, 테이블 대신 엔티티 객체를 사용.
String hql = "FROM User WHERE email = :email";
User user = session.createQuery(hql, User.class)
.setParameter("email", "hong@example.com")
.uniqueResult();
Hibernate 설정 파일
(1) persistence.xml 설정
Spring Data JPA를 사용할 때 persistence.xml은 JPA 표준 방식의 설정 파일로 사용할 수 있지만, Spring Boot에서는 보통 application.properties 또는 application.yml을 사용해 설정을 간소화합니다. 그러나 프로젝트 환경에 따라 persistence.xml 파일이 필요할 때도 있습니다.
JPA 표준에서 정의된 설정 파일로, JPA에서 사용하는 Entity 클래스, 데이터베이스 연결 정보, JPA 구현체(Hibernate 등) 설정 등을 정의합니다.
Spring Data JPA는 Spring Framework의 데이터 접근 계층 모듈로, JPA(Java Persistence API)를 더 쉽고 간단하게 사용할 수 있도록 추상화한 도구입니다. 기존 JPA를 사용할 때 반복적인 코드를 줄이고, Repository 인터페이스와 간단한 메서드 이름만으로 CRUD, 페이징, 정렬 등을 쉽게 구현할 수 있습니다.
1. Spring Data JPA의 특징
특징
설명
간단한 데이터 접근
JpaRepository 인터페이스를 통해 CRUD와 페이징, 정렬을 자동화.
쿼리 메서드
메서드 이름만으로 동작하는 쿼리를 자동 생성.
JPQL 및 네이티브 SQL 지원
복잡한 쿼리의 경우 JPQL(Java Persistence Query Language) 또는 네이티브 SQL을 사용 가능.
페이징 및 정렬 지원
페이징(Pageable)과 정렬(Sort)을 기본 제공.
JPA 구현체 독립성
Hibernate, EclipseLink 등 다양한 JPA 구현체와 호환 가능.
트랜잭션 관리 통합
Spring의 @Transactional을 통해 트랜잭션을 간단히 관리 가능.
Spring Data JPA의 구조
Controller: 사용자 요청을 처리하고, 서비스 계층으로 전달.
Service Layer: 비즈니스 로직을 처리하며 Repository와 통신.
Repository: JPA를 통해 데이터베이스와의 상호작용을 추상화.
JPA EntityManager: JPA 구현체(Hibernate 등)를 통해 데이터 작업 수행.