서론
JPA와 Spring Data JPA는 서로 다른 개념이라는 것, 그리고 Spring Data JPA는 JPA를 더 쉽게 사용할 수 있는 라이브러리라는 것은 알고 있었다. 하지만 실제로 Spring Data JPA가 어떤 방식으로 JPA를 더 편리하게 만들어주는지는 모르고 사용하고 있었다.
그래서 오늘은 Spring Data JPA가 JPA 위에서 어떤 기능들을 제공하고, 어떻게 개발을 편리하게 도와주는지 구체적으로 살펴보려고 한다.
JPA
JPA(Java Persistence API)는 자바 ORM(Object-relational mapping) 표준 명세로, ORM 프레임워크가 구현해야 하는 인터페이스다. JPA의 주요 목적 중 하나는 Java에서 데이터를 지속적으로 저장하기 위한 표준적인 접근 방식을 만드는 것이다. 이는 JPA를 구현한 ORM 프레임워크 간의 상호 운용성을 향상시킨다. 예를 들어 애플리케이션이 ORM 프레임워크로 Hibernate를 사용하고 있다가 다른 ORM 프레임워크로 교체해야 한다고 가정해보자. 두 프레임워크가 모두 JPA 표준을 준수한다면 한 프레임워크에서 다른 프레임워크로의 전환이 더 쉬워진다. JPA 구현체로는 Hibernate, EclipseLink 등이 있다.
JPA는 영속성 프로세스를 관리하기 위해 EntityManager와 EntityManagerFactory에 의존한다.
EntityManager는 엔티티의 상태 변화를 관리하고 이를 SQL 쿼리로 변환하는 Persistence Context로 작동한다.
EntityManager의 주요 메서드는 다음과 같다.
/*
* Returns an entity by its primary key.
*/
public <T> T find(Class<T> entityClass, Object primaryKey);
/*
* Creates a new transient entity that will be inserted in the databse during
* the next flush()
*/
public void persist(Object entity);
/*
* Transforms a detached entity (an entity that was managed by a Persistence
* Context at some point) into a transient one
*/
public <T> T merge(T entity);
/*
* Removes the entity from database at the next flush() operation
*/
public void remove(Object entity);
/*
* Synchronizes the Persistence Context with the underlying database
*/
public void flush();
- 저장 : persist(member)
- 조회 : find(memberId)
- 수정 : member.setName("변경할 이름")
- 삭제 : remove(member)
Hibernate
Hibernate는 JPA를 구현한 프레임워크로, JPA 표준을 준수하면서 객체와 관계형 데이터베이스 간의 매핑을 제공한다.
즉, JPA 코드를 실행하면 실제로는 Hibernate가 동작하게 된다. JPA의 핵심인 EntityManagerFactory, EntityManager, EntityTransaction을 Hibernate에서는 각각 SessionFactory, Session, Transaction으로 상속받고 각각 Impl로 구현하고 있다.
Hibernate는 JPA의 모든 기능을 지원하며 객체와 관계형 데이터베이스간의 매핑을 자동으로 처리해서 개발자가 SQL 쿼리를 직접 작성하지 않도록 도와준다.
JDBC
JDBC는 Java Database Connectivity의 약자로 데이터베이스에 접근할 수 있도록 자바에서 제공하는 API이다.
Hibernate는 내부적으로 JDBC를 사용하여 데이터베이스와 통신한다.
JDBC는 직접적인 SQL 코드 작성과 데이터베이스 관리에 초점을 맞추고 있지만, Hibernate는 객제지향적인 접근 방식을 통해 개발자가 데이터베이스와의 상호작용을 SQL을 직접 작성하지 않고 할 수 있도록 도와준다.
Spring Data JPA
Spring Data JPA는 Spring 프레임워크에서 JPA를 더욱 쉽게 사용할 수 있도록 지원하는 모듈이다.
JPA에서는 EntityManager를 직접 사용하여 쿼리를 작성하고, 객체의 상태를 수동으로 관리해야 하며, 트랜잭션 처리 또한 개발자가 직접 수행해야 한다. 반면에 Spring Data JPA는 JpaRepository 또는 CrudRepository 인터페이스를 상속받아 Repository를 정의하기만 하면 내부적으로 해당 인터페이스에 대한 구현체를 자동으로 생성하여 Bean으로 등록해준다.
Spring 프로젝트에서 Spring Data JPA를 사용하면, 기본적으로 Hibernate가 JPA의 구현체로 등록되어 동작하게 되며 개발자는 하이버네이트의 세부적인 설정이나 API를 직접 다루지 않고도 데이터베이스와의 연동을 쉽게 처리할 수 있다.
또한 Repository 인터페이스에 메서드를 작성할 때 일정한 네이밍 규칙을 따르면 Spring이 해당 메서드 이름에 알맞은 쿼리를 자동으로 생성하고 실행해주는 구현체를 만들어주므로, 반복적인 쿼리 작성 없이도 데이터 조회 기능을 손쉽게 구현할 수 있다.
정리하자면 Spring Data JPA -> JPA -> Hibernate -> JDBC -> DB 이렇게 계층적으로 동작한다.
[Reference]
'Development > 데이터베이스' 카테고리의 다른 글
왜 데이터베이스 인덱스로 B tree 계열을 사용할까? (0) | 2025.01.07 |
---|---|
JPA와 MyBatis (0) | 2024.12.13 |
Redis (0) | 2024.12.04 |
RDB와 NoSQL (0) | 2024.11.23 |