JPA(Java Persistence API) 개요

2025. 1. 13. 10:15·Spring

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에서 데이터 저장 및 조회 과정

  1. Entity 객체 생성: 데이터를 표현하는 객체(Entity)를 정의.
  2. EntityManager:
    • JPA의 핵심 인터페이스로, Entity의 상태를 관리.
    • 데이터베이스와의 연결 및 CRUD 작업 처리.
  3. 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의 동작 과정

  1. Entity: 객체와 데이터베이스 테이블 간의 매핑을 정의.
  2. Session: Hibernate와 데이터베이스 간의 연결 및 작업을 수행.
  3. Persistence Context: 세션이 관리하는 1차 캐시 영역.
  4. 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의 구조

  1. Controller: 사용자 요청을 처리하고, 서비스 계층으로 전달.
  2. Service Layer: 비즈니스 로직을 처리하며 Repository와 통신.
  3. Repository: JPA를 통해 데이터베이스와의 상호작용을 추상화.
  4. JPA EntityManager: JPA 구현체(Hibernate 등)를 통해 데이터 작업 수행.
  5. 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
'Spring' 카테고리의 다른 글
  • JPA의 @GeneratedValue 전략
  • JPA/Hibernate 관련 설정 (application.properties)
  • Persistence Layer(영속성 계층)
  • Transaction(트랜잭션)과 TCL(Transaction Control Language)
jhyngu
jhyngu
취업하자.
    티스토리 홈
    |
  • jhyngu
    jhyngu
    jhyngu
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • Dev (151)
      • Java (2)
      • Spring (51)
      • Spring Security (39)
        • JWT (22)
        • OAuth2 (17)
      • Kotlin (2)
      • React (6)
      • Coding Test (28)
      • DB (0)
      • Git (5)
      • Linux (14)
      • docker (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    api client
    Spring Boot
    react
    OAuth2
    알고리즘
    JWT
    Spring Framework
    MVC
    Postman
    spring web
    mybatis
    백준
    Spring Security
    Spring
    JDBC
    git
    oauth2
    JavaScript
    Linux
    MariaDB
  • hELLO· Designed By정상우.v4.10.3
jhyngu
JPA(Java Persistence API) 개요
상단으로

티스토리툴바