Spring Data JPA 를 활용해서 인터페이스를 사용할 때
JpaRepository<T, ID>
를 상속받아서 사용한다.
이 JpaRepository 안에 들어가면 또 다른 Repository 를 상속받고 또 상속받고 ,,
이 구조에 대해서 기록해두고자 한다.
인터페이스 살펴보기
먼저 MemberRepository 라는 레포지토리를 만들어보았다.
public interface MemberRepository extends JpaRepository<Member, Long> {
}
여기서 JpaRepository
안에 들어가보자.
패키지 위치는 org.springframework.data.jpa.repository
이다.
JpaRepository
는 PagingAndSortingRepository<T, ID>
를 상속받고 있고,
PagingAndSortingRepository<T, ID>
를 또 들어가보자.
재밌는게 PagingAndSortingRepository
는
org.springframework.data.repository
에 위치하는 것을 볼 수 있다.
Paging 과 Sorting 은 RDB 거나 NoSQL 거나 비슷하기 때문에
공통 인터페이스로 제공한다.
그래서 data.jpa.repository
가 아니라 data.repository
에 존재 !
그 말은 Spring Data JPA 를 쓰다가, Spring Data Mongo 같은 걸로 바꿔도
동일하게 사용할 수 있다는 뜻 !
실제 라이브러리를 확인해보자.
PagingAndSortingRepository
는 Spring-data-commmons 에 들어있다.
즉 JPA 가 아니라 Mongo, Redis 를 쓸 때도 commons 는 마찬가지로 사용된다.
물론 RDB 를 쓰다가 NoSQL 로 DB를 바꾼다는 건 쉽지 않다..
“유사한 인터페이스로 편하게 개발할 수 있다” 정도의 장점으로 생각하자.
공통으로 사용하는 CrudRepository
도 마찬가지로 data-commons 에 위치해있다.
가장 최상위로 올라가면 Repository
라는 인터페이스가 정의되어 있는데,
이 인터페이스는 marker interface 라고 하는데 주석에 보면 다음과 같은 문구가 있다.
classpath scanning for easy Spring bean creation.
스프링 빈을 만들 때 classpath 스캔을 쉽게 해주는 기능을 제공한다.
일단은 그런 게 있구나 ~ 정도만 알아두자.
JPA 에서 사용하는 JpaRepository
는 spring-data-jpa 안에 들어있고,
JPA 에 특화된 기능들을 제공한다.
위에서 설명한 인터페이스들의 관계를 간단한 그림으로 정리해보자.
참고 ⬇️
최신 스프링 데이터 JPA 에선 T findOne(ID)
에서 Optional<T> findById(ID)
로 변경되었다.
주요 메소드
save(S)
: 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다.delete(T)
: 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove() 호출findById(ID)
: 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출getOne(ID)
: 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출findAll(...)
: 모든 엔티티를 조회한다. 정렬( Sort )이나 페이징( Pageable ) 조건을 파라미터로
제공할 수 있다.
JpaRepository 는 대부분의 공통 메서드를 제공 !