1. JPA란?
- 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 등) 설정 등을 정의합니다.
- META-INF/persistence.xml 경로에 위치해야 합니다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2">
<persistence-unit name="jpabegin" transaction-type="RESOURCE_LOCAL">
<class>com.example.jpa.domain.User</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<!-- 필수 속성 -->
<property name="jakarta.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver"/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:mariadb://localhost:3306/sample"/>
<property name="jakarta.persistence.jdbc.user" value="root"/>
<property name="jakarta.persistence.jdbc.password" value="!123456"/>
<!-- 옵션 속성 -->
<!-- hikari pooling 환경 설정 -->
<property name="hibernate.hikari.poolName" value="pool"/>
<property name="hibernate.hikari.maximumPoolSize" value="10"/>
<property name="hibernate.hikari.maximumIdle" value="10"/>
<property name="hibernate.hikari.connectionTimeout" value="1000"/>
<!-- JPA 기본 환경 : 기본값 -->
</properties>
</persistence-unit>
</persistence>
(2) application.properties (Spring Boot 사용 시)
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/sample
spring.datasource.username=root
spring.datasource.password=!123456
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
Spring Data JPA 개요
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 등)를 통해 데이터 작업 수행.
- Database: 실제 데이터가 저장되는 관계형 데이터베이스.
참조
- Hibernate 공식 문서
- Hibernate ORM User Guide
- 자바 ORM 표준 JPA 프로그래밍 (김영한): JPA를 체계적으로 학습 가능.
- Spring Data JPA - 어제보다 더 나은 개발자
- https://velog.io/@gudonghee2000/JPA-설정과-동작원리
'Spring' 카테고리의 다른 글
JPA의 @GeneratedValue 전략 (0) | 2025.01.14 |
---|---|
JPA/Hibernate 관련 설정 (application.properties) (0) | 2025.01.13 |
Persistence Layer(영속성 계층) (0) | 2025.01.11 |
Transaction(트랜잭션)과 TCL(Transaction Control Language) (0) | 2025.01.11 |
MariaDB 엔진 - InnoDB vs MyISAM (0) | 2025.01.10 |