코딩하는 문과생
[Spring Boot] Spring Data JPA 본문
개인 프로젝트에 알림기능을 구현을 위해 스프링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를 상속하면 된다.
'웹 프로그래밍 > Spring Boot' 카테고리의 다른 글
[Spring Boot] Spring AOP, 예외 처리 (0) | 2023.12.20 |
---|---|
[Spring Boot] CI/CD - CD(지속적 배포)(step3) (0) | 2020.12.13 |
[Spring boot] CI/CD - CI(지속적통합)(step2) (0) | 2020.12.12 |
[Spring boot] 프로젝트 AWS에 올리기(step1) (0) | 2020.12.10 |
[Spring Boot] AWS 아키텍처(+ HotSpot으로 연결 시 여러 이슈들) (0) | 2020.12.06 |