코딩하는 문과생

[Spring Boot] Spring Data JPA 본문

웹 프로그래밍/Spring Boot

[Spring Boot] Spring Data JPA

코딩하는 문과생 2021. 5. 1. 22:05

개인 프로젝트에 알림기능을 구현을 위해 스프링JPA를 활용하기로 결정했다.

 

[JPA, Hibernate, Spring Data Jpa]

- JPA

JPA는 기술명세다. Java Persistence API의 약자로, 자바 어플리케이션에서 관계형 DB를 사용하는 방식을 정의한 인터페이스다. 여기서 중요한 점은 JPA는  말 그대로 특정 기능을 하는 라이브러리가 아닌 인터페이스라는 점이다. 

ex. JPA의 EntityManager

: 말그대로 인터페이스다.

package javax.persistence;

import ...

public interface EntityManager {

    public void persist(Object entity);

    public <T> T merge(T entity);

    public void remove(Object entity);

    public <T> T find(Class<T> entityClass, Object primaryKey);

    // More interface methods...
}

 

-Hibernate 

Hibernate는 JPA의 구현체다.

즉, 위 EntityManager와 같은 인터페이스를 직접 구현한 라이브러리다. Hibernate에서는 EntityManager를 상속해 Session으로 상속받고, SessionImpl로 구현해 사용한다.

JPA를 사용하기 위해 반드시 Hibernate를 사용할 필요는 없다. 대안으로 DataNucleus, EclipseLink 등 다른 구현체를 사용해도 된다. 단지, Hibernate가 성숙한 라이브러리이기에 많이 사용되고 있다.

 

- Spring Data Jpa 

부트에 JPA를 사용하면서 Hibernate는 설정으로만 작성한 것 외에 잘 보지 못한거 같다. 대신 JpaRepository를 Domain영역에서 상속받아 DB에 접근하기 위해 사용했었는데, 이 때 이 JpaRepository(Repository)가 Spring Data Jpa의 핵심이다.

 

Spring Data Jpa 는 Spring에서 제공하는 모듈 중 하나로, JPA를 한단계 더 추상화시킨 Repository 인터페이스를 제공함으로써 이루어진다. 개발자가 Repository에 정해진 규칙대로 메소드를 작성하면 스프링이 알아서 구현체를 만들어 Bean으로 등록해 준다. 한단계 더 추상화 된 Spring Data Jpa Repository의 구현에서 JPA를 사용하고 있다는 것이다.

ex. UserRepository

public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByEmail(String email);
}

 

위 내용을 간략히 정리하면 아래와 같다. 


[JpaRepository]

Spring JPA Docu를 읽다보니 CrudRepository인터페이스를 구현하는 예제도 있고, JpaRepository 인터페이스를 구현하는 예제도 있었다. 언제 어떤 상황에 인터페이스를 사용해야 할까?

 

- Spring JPA Interface종류

 

 

위 구조처럼 Repository 인터페이스를 기준으로 CrudRepository, PagingAndSortingRepository, JpaRepository가 차례로 나와있다. 즉, PagingAndSortingRepository에 있는 기능 외 JpaRepository에는 추가기능이 있음을 알 수 있다.

 

간단히 요약하자면, 

  • CrudRepository: CRUD기능만 사용할 경우
  • PagingAndSortingRepository: 페이징 및 정렬 관련 기능 제공
  • JpaRepository: 위 기능 + JPA 관련 특화 기능들(flush나 배치성 작업)

이렇게 구분된다고 한다. 큰 문제가 없다면, JpaRepository를 상속하면 된다.