1. 개요
이 빠른 기사에서는 다양한 종류의 Spring Data 리포지토리 인터페이스와 해당 기능에 중점을 둘 것입니다. 다음을 살펴보겠습니다.
- 크러드 저장소
- PagingAndSortingRepository
- Jpa리포지토리
간단히 말해서 Spring Data 의 모든 리포지토리 는 일반 리포지토리 인터페이스를 확장하지만 그 이상으로 각각 다른 기능을 가지고 있습니다.
2. 스프링 데이터 저장소
PagingAndSortingRepository를 확장 하고 차례로 CrudRepository 를 확장 하는 JpaRepository 부터 시작 하겠습니다 .
이들 각각은 자체 기능을 정의합니다.
- CrudRepository 는 CRUD 기능
- PagingAndSortingRepository 는 페이지 매김을 수행하고 레코드를 정렬하는 메서드를 제공합니다.
- JpaRepository 는 지속성 컨텍스트를 플러시하고 배치에서 레코드를 삭제하는 것과 같은 JPA 관련 메서드를 제공합니다.
따라서 이러한 상속 관계로 인해 JpaRepository 에는 CrudRepository 및 PagingAndSortingRepository 의 전체 API가 포함 됩니다.
JpaRepository 및 PagingAndSortingRepository 에서 제공하는 전체 기능이 필요하지 않은 경우 CrudRepository 를 간단히 사용할 수 있습니다 .
이제 이러한 API를 더 잘 이해하기 위해 간단한 예를 살펴보겠습니다.
간단한 제품 엔터티부터 시작하겠습니다.
@Entity
public class Product {
@Id
private long id;
private String name;
// getters and setters
}
간단한 작업을 구현해 보겠습니다 . 이름을 기반으로 제품 을 찾습니다.
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
Product findByName(String productName);
}
그게 다야. Spring Data Repository는 우리가 제공한 이름을 기반으로 구현을 자동 생성합니다.
이것은 물론 매우 간단한 예입니다. 여기에서 Spring Data JPA에 대해 자세히 알아볼 수 있습니다 .
3. 크러드 저장소
이제 CrudRepository 인터페이스의 코드를 살펴보겠습니다.
public interface CrudRepository<T, ID extends Serializable>
extends Repository<T, ID> {
<S extends T> S save(S entity);
T findOne(ID primaryKey);
Iterable<T> findAll();
Long count();
void delete(T entity);
boolean exists(ID primaryKey);
}
일반적인 CRUD 기능에 주목하십시오.
- save(…) – 엔터티 의 Iterable 을 저장합니다. 여기에서 여러 개체를 전달하여 일괄적으로 저장할 수 있습니다.
- findOne(…) – 전달된 기본 키 값을 기반으로 단일 엔터티 가져오기
- findAll() – 데이터베이스에서 사용 가능한 모든 엔터티 의 Iterable 가져오기
- count() – 테이블의 총 엔터티 수를 반환합니다.
- delete(…) – 전달된 개체를 기반으로 엔터티를 삭제합니다.
- exists(…) – 전달된 기본 키 값을 기반으로 엔터티가 존재하는지 확인합니다.
이 인터페이스는 매우 일반적이고 단순해 보이지만 실제로는 애플리케이션에 필요한 모든 기본 쿼리 추상화를 제공합니다.
4. PagingAndSortingRepository
이제 CrudRepository 를 확장하는 또 다른 저장소 인터페이스를 살펴보겠습니다 .
public interface PagingAndSortingRepository<T, ID extends Serializable>
extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
이 인터페이스는 페이지 매김 구현의 핵심인 findAll(Pageable pageable) 메서드를 제공합니다.
Pageable 을 사용할 때 특정 속성을 가진 Pageable 객체를 생성하고 최소한 다음을 지정해야 합니다.
- 페이지 크기
- 현재 페이지 번호
- 정렬
따라서 각 레코드가 5개 이하인 오름차순으로 lastName 으로 정렬된 결과 집합의 첫 번째 페이지를 표시하려고 한다고 가정해 보겠습니다 . PageRequest 및 Sort 정의 를 사용하여 이를 달성하는 방법은 다음 과 같습니다.
Sort sort = new Sort(new Sort.Order(Direction.ASC, "lastName"));
Pageable pageable = new PageRequest(0, 5, sort);
페이지 가능한 개체를 Spring 데이터 쿼리에 전달하면 해당 결과가 반환됩니다( PageRequest 의 첫 번째 매개변수 는 0부터 시작).
5. JPA리포지토리
마지막으로 JpaRepository 인터페이스 를 살펴보겠습니다 .
public interface JpaRepository<T, ID extends Serializable> extends
PagingAndSortingRepository<T, ID> {
List<T> findAll();
List<T> findAll(Sort sort);
List<T> save(Iterable<? extends T> entities);
void flush();
T saveAndFlush(T entity);
void deleteInBatch(Iterable<T> entities);
}
다시, 이러한 각 방법을 간략하게 살펴보겠습니다.
- findAll() – 데이터베이스에서 사용 가능한 모든 엔터티 List 가져오기
- findAll(…) – 사용 가능한 모든 엔터티 List 을 가져오고 제공된 조건을 사용하여 정렬
- save(…) – 엔터티 의 Iterable 을 저장합니다. 여기에서 여러 개체를 전달하여 일괄적으로 저장할 수 있습니다.
- flush() – 보류 중인 모든 작업을 데이터베이스에 플러시합니다.
- saveAndFlush(…) – 엔터티를 저장하고 변경 사항을 즉시 플러시합니다.
- deleteInBatch(…) – 엔터티 의 Iterable 을 삭제합니다. 여기에서 여러 개체를 전달하여 일괄적으로 삭제할 수 있습니다.
분명히 위의 인터페이스 는 PagingAndSortingRepository 를 확장합니다. 즉, CrudRepository 에도 모든 메서드가 있음을 의미합니다 .
6. 스프링 데이터 저장소의 단점
이러한 리포지토리의 모든 매우 유용한 이점 외에도 이러한 리포지토리에 직접 의존하는 몇 가지 기본적인 단점도 있습니다.
- 우리는 코드를 라이브러리와 `Page` 또는 `Pageable`과 같은 특정 추상화에 연결합니다. 물론 이 라이브러리에 고유한 것은 아니지만 이러한 내부 구현 세부 정보를 노출하지 않도록 주의해야 합니다.
- 예를 들어 CrudRepository 를 확장 하여 전체 지속성 메서드 세트를 한 번에 노출합니다. 이것은 대부분의 상황에서도 괜찮을 수 있지만 노출된 메서드에 대해 보다 세밀한 제어를 얻고 싶은 상황에 직면할 수 있습니다(예: save(…) 및 delete( 를 포함하지 않는 ReadOnlyRepository 생성). ...) CrudRepository 의 메서드
7. 결론
이 기사에서는 Spring Data JPA 리포지토리 인터페이스의 간략하지만 중요한 몇 가지 차이점과 기능에 대해 설명했습니다.
자세한 내용은 Spring Persistence 시리즈를 참조하십시오 .