Hibernate, JPA, Spring Data JPA
JPA (Java Persistence API)
Java 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
개념
- 자바 플랫폼에서 ORM을 정의하는 표준 명세 
- 자바 객체와 데이터베이스 간 매핑을 정의하는 표준 제공 - 어노테이션 기반 매핑 
 
특징
- JPA는 특정 기능을 하는 라이브러리가 아닌 - 인터페이스- 단순 명세로 구현이 없음 
- 다양한 ORM프레임워크에서 구현할 수 있는 공통API 제공 
- JPA 정의 패키지 - javax.persistence는 interface, enum, Exception, Annotation으로 이뤄짐
 
- 영속성 컨텍스트 제공 
사용 이유
- 관계형 데이터베이스와 객체의 - 패러다임 불일치 문제해결- SQL에 종속적인 개발이 아닌 객체지향적인 코드 작성 가능 
 
- 생산성 - 간단한 CRUD 알아서 다 짜주기에 SQL작성 시 많은 시간투자X 
- 반복적인 SQL을 만드는 단순 반복작업X 
 
- 유지보수 - 필드 추가 시 JPA가 자동으로 SQL처리 
 
- 성능 - 1차 캐시와 동일성 보장 - 같은 트랜잭션안에서는 같은 엔티티를 반환하기 때문에 DB와의 통신 횟수를 줄일 수 있음 
 
- 트랜잭션을 지원하는 쓰기지연 - 트랜잭션을 commit 하기 전까지 INSERT SQL을 메모리에 쌓고 한번에 DB로 SQL 전송 
 
- 지연 로딩, 즉시 로딩 
 
- 데이터 접근 추상화와 벤더 독립성 - 인터페이스로 추상화된 데이터 접근을 제공하기에, DB변경시 JPA에게 알려 종속성 해결 가능 
 
➕ 패러다임 불일치 해결
■ 상속
- 문제 - 객체 지향 프로그래밍: 클래스 상속이 일반적 
- 관계형 데이터베이스: 상속 개념 없음 
 
- 해결 - JPA는 상속 전략 제공으로 객체 상속 구조를 테이블에 매핑 - 상속전략 : - 단일 테이블 전략,- 조인 전략,- 테이블당 클래스 전략
 
 
■ 연관관계
- 문제 - 객체 지향 프로그래밍: 객체 간의 참조로 연관관계 표현 
- 관계형 데이터베이스: 외래 키로 연관관계 표현 
 
- 해결 - JPA는 애노테이션을 사용하여 객체 간의 연관관계를 데이터베이스 테이블의 외래 키와 매핑 - 어노테이션: - @OneToOne,- @OneToMany,- @ManyToOne,- @ManyToMany
 
 
■ 그래프 탐색
- 문제 - 객체 지향 프로그래밍: 객체 그래프 탐색이 쉬움 
- 관계형 데이터베이스: 조인 쿼리를 사용해야 함 
 
- 해결 - JPA는 지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading)을 통해 객체 그래프 탐색을 효율적으로 처리 
- 연관된 객체를 사용하는 시점에 적절한 쿼리를 실행하여 연관된 객체 조회 가능 
 
■ 비교
- 문제 - 객체의 동일성: 객체는 동일성 비교(==)와 동등성 비교(equals())가 존재 
- 데이터베이스의 동일성: 기본 키 값이 동일한지로 판단 
- JDBC를 사용하여 같은 키값 두 번 조회 시, new 연산자로 새로운 인스턴스가 생성되어 반환되기에 동일성 비교 실패 
 
- 해결 - 엔티티 식별자 정의 
- 1차 캐시 - 1차 캐시를 사용하여 동일한 식별자를 가진 엔티티가 항상 동일한 객체로 반환되도록 보장 
 
- 동일 트랜잭션에서 같은 행 조회 시 동일한 객체 반환하는 것을 보장 
 
Hibernate
JPA라는 명세의 구현체로, 인터페이스를 직접 구현한 라이브러리
개념
- 자바언어를 위한 ORM 프레임워크로, 자바 애플리케이션에서 데이터베이스 연동을 쉽게 처리할 수 있도록 도움 
- JPA의 구현체로 JPA 인터페이스를 구현하며, 내부적으로 JDBC API 사용 
특징
- JPA의 구현체 중 하나 - Hibernate이외의 다른 JPA구현체 사용가능 
- EX) EclipseLink, OpenJPA 
 
- HQL (Hibernate Query Language) - 데이터베이스 독립적인 쿼리 언어 
- SQL과 유사하지만 테이블 대신 객체를 대상으로 쿼리를 작성 
 
- 자동화된 데이터베이스 연동 
JPA의 구현체로 지연로딩, 캐시지원과 같이 JPA의 특징을 가짐
JPA와 Hibernate의 상속 및 구현 관계
EntityManagerFactory
SessionFactory
EntityManager
Session
EntityTransaction
Transaction
- SessionFactory - 애플리케이션 당 하나만 생성되는 객체 
- 데이터베이스와의 연결을 설정하고 Session 생성 
 
- Session - 데이터베이스 작업을 수행하는 객체 
- 엔티티 저장, 수정, 삭제, 조회 시 사용 
- 짧은 시간 동안 유지되며 사용 후에는 닫아야 함 
 
- Transaction - 데이터베이스 작업의 원자성을 보장하는 객체 
- 작업 단위를 정의하고 커밋 또는 롤백 가능 
 
- Entity - 데이터베이스 테이블에 매핑되는 자바 클래스 
- 클래스의 필드와 데이터베이스의 컬럼 간의 매핑을 설정 
 
Spring Data JPA
Spring에서 제공하는, JPA를 쓰기 편하게 만들어 놓은 모듈
개념
- Spring에서 제공하는 모듈로 JPA 위에 추가적인 기능 제공 - JPA 기반 애플리케이션 개발을 보다 간편하게 만드는 라이브러리/프레임워크 
 
- JPA의 구현체 위에 동작하며, 복잡한 데이터 접근 로직을 단순화하고 자동화 함 
특징
- Repository인터페이스 제공을 통해 이뤄짐- JPA를 한 단계 추상화 시킨 인터페이스 
- JPA의 EntityManager와 직접 상호작용하지 않고도 데이터 접근 가능 
- 동작 - JpaRepository<> 인터페이스 상속 
- Spring Data JPA가 구현 클래스를 대신 만듦(프록시 기술 사용) 
- 만든 구현 클래스의 인스턴스를 만들어 스프링 빈으로 등록 
 
 
- 쿼리 메서드 기능 - 인터페이스에 메서드만 적어두면, 메서드 이름을 분석해서 JPQL 쿼리를 자동으로 만들고 실행하는 기능 제공 
 
- JPQL 직접 사용도 가능 - 쿼리 메서드 기능 대신 직접 JPQL 사용하고 싶을 시, - @Query로 JPQL 작성
- 이때 매서드 이름으로 실행되는 규칙은 무시 됨 
 
- 쉬운 페이징과 정렬 처리 기능 제공 
➕ JPQL과 QueryDSL
JPQL (Java Persistence Query Language)
(Java Persistence Query Language)- 개념 - JPA의 쿼리언어로 객체지향 쿼리 언어 
 
- 특징 - 객체 중심 - 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 쿼리 수행 
 
- 표준화 - JPA 표준에 포함되어 있어, 특정 JPA 구현체에 종속되지 않음 
 
- 유연성 - 다양한 조건, 정렬, 집계 등 지원 
- 네이티브 SQL과 통합 가능 
 
 
- 예시 - // 모든 사용자를 조회하는 JPQL 쿼리 String jpql = "SELECT u FROM User u"; List<User> users = entityManager.createQuery(jpql, User.class).getResultList();
QueryDSL
- 개념 - 타입 안전한 쿼리를 작성할 수 있게 해주는 Java 라이브러리 
- 타입 세이프한 SQL쿼리 형태를 자바 코드로 작성할 수 있게해주는 프레임워크 
 
- 특징 - 타입 안정성 - 쿼리 작성 시 타입 안전성을 보장하여 컴파일 시점에 오류 검출 
 
- 가독성 - 메서드 체이닝을 통해 가독성이 높은 쿼리 작성 가능 
 
- 자동 완성 - IDE에서 자동 완성을 지원하여 개발 생산성 높임 
 
- SQL, JPA, MongoDB, Elasticsearch 등 다양한 데이터 소스에 대한 쿼리 지원 
- 문자가 아닌 코드로 작성 
- 동적 쿼리 편하게 작성 가능 
 
- 예시 - // QueryDSL을 사용하여 모든 사용자를 조회하는 쿼리 JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); QUser user = QUser.user; List<User> users = queryFactory.selectFrom(user).fetch();
요약
개념
자바 플랫폼의 ORM 표준 명세
자바 기반의 ORM 프레임워크
JPA를 쉽게 사용하도록 도와주는 Spring의 하위 모듈
주요 기능
표준화된 ORM 명세, JPQL, 표준 API
HQL, 캐시, 자동 테이블 생성 등
Repository 패턴, 메서드 이름 기반 쿼리 생성, 페이징 및 정렬
설정 방법
애노테이션
XML, 애노테이션
애노테이션, 인터페이스 기반
사용 방식
표준 JPA API 사용 (EntityManager 등)
Hibernate API 사용 (Session, Transaction 등)
Spring Data JPA 인터페이스 사용 (JpaRepository)
구현체
Hibernate, EclipseLink, OpenJPA 등
-
Hibernate 등 JPA 구현체 위에서 동작
Ref
JPA, Hibernate, 그리고 Spring Data JPA의 차이점 [JPA] JPA란 ? 그리고 Spring Data JPA
Last updated