JpaRepository vs CrudRepository
JpaRepository는 PagingAndSortingRepository, QueryByExampleExecutor를 상속합니다.
PagingAndSortingRepository은 CrudRepository를 상속합니다.
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID>
상속관계를 보면 JpaRepository는 결국 CrudRepository를 부모로 가지고 있습니다.
그렇다면 패키지 구조를 한번 봐보겠습니다.
JpaRepository는 org.springframework.data.jpa.repository
CrudRepository는 org.springframework.data.repository
jpa가 유무라고 볼 수 있습니다.
즉, JpaRepository는 JPA에 특화된 기능들이 있습니다. ex) 영속성 컨텍스트에 따른 1차 캐시, 더티 체킹, 지연 로딩, 쓰기 지연 등
JPA, MongoDB, Redis 등의 CRUD는 비슷하므로 공통 인터페이스인 CrudRepository가 제공됩니다.
이러한 인터페이스들은 external libraries를 보시면 spring-data-commons 디렉토리에 들어있습니다.
CrudRepository는 왜 Iterable을 반환할까?
CrudRepository에 있는 findAll은 Iterable을 반환하고, JpaRepository에 있는 findAll은 List를 반환한다
//CrudRepository
Iterable<T> findAll();
//JpaRepository
@Override
List<T> findAll();
왜 CrudRepository는 Iterable을 반환할까요?
CrudRepository는 spring-data-commons에 있는 실제 사용되는 database에 관계없이 확장할 수 있는 인터페이스입니다.
그래서 만약 List와 같은 컬렉션 타입을 사용하면 일부 database의 기능이 상실될 수 있습니다. 그래서 Iterable을 반환합니다.
Spring Issue에서는 Neo4J는 Iterable을 반환함으로써 데이터 조회를 지연시켜 퍼포먼스를 향상시킬 수 있다고 합니다.
오버라이딩의 조건 중에 반환 타입이 같아야 한다고 하는데 두 findAll의 반환 타입이 다른데요?
저도 처음에 보고 오버라이딩을 하기 위해서는 반환 타입이 같아야 하지 않나?라는 생각을 했습니다.
하지만 사진과 같이 List는 Collection을 상속, Collection은 Iterable을 상속하고 있기 때문에 sub type인 List가 올 수 있게 됩니다
REFERENCES
'Spring Data' 카테고리의 다른 글
@NotNull vs @Column(nullable = false) (0) | 2022.10.22 |
---|---|
Find vs Get (0) | 2022.09.25 |
Spring Data JPA에서의 벌크 삭제 정리 (0) | 2022.07.12 |
[YAPP] 검색 성능 최적화 일지(Feat. Elasticsearch) (0) | 2022.07.08 |
Querydsl의 like vs contains (0) | 2022.05.22 |