1. 개요

이 빠른 기사에서는 다양한 종류의 Spring Data 리포지토리 인터페이스와 해당 기능에 중점을 둘 것입니다. 다음을 살펴보겠습니다.

  • 크러드 저장소
  • PagingAndSortingRepository
  • Jpa리포지토리

간단히 말해서 Spring Data 의 모든 리포지토리 는 일반 리포지토리 인터페이스를 확장하지만 그 이상으로 각각 다른 기능을 가지고 있습니다.

2. 스프링 데이터 저장소

PagingAndSortingRepository를 확장 하고 차례로 CrudRepository 를 확장 하는 JpaRepository 부터 시작 하겠습니다 .

이들 각각은 자체 기능을 정의합니다.

  • CrudRepository 는 CRUD 기능
  • PagingAndSortingRepository 는 페이지 매김을 수행하고 레코드를 정렬하는 메서드를 제공합니다.
  • JpaRepository 는 지속성 컨텍스트를 플러시하고 배치에서 레코드를 삭제하는 것과 같은 JPA 관련 메서드를 제공합니다.

따라서 이러한 상속 관계로 인해 JpaRepository 에는 CrudRepositoryPagingAndSortingRepository 의 전체 API가 포함 됩니다.

JpaRepositoryPagingAndSortingRepository 에서 제공하는 전체 기능이 필요하지 않은 경우 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 객체를 생성하고 최소한 다음을 지정해야 합니다.

  1. 페이지 크기
  2. 현재 페이지 번호
  3. 정렬

따라서 각 레코드가 5개 이하인 오름차순으로 lastName 으로 정렬된 결과 집합의 첫 번째 페이지를 표시하려고 한다고 가정해 보겠습니다 . PageRequestSort 정의 를 사용하여 이를 달성하는 방법은 다음 과 같습니다.

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. 스프링 데이터 저장소의 단점

이러한 리포지토리의 모든 매우 유용한 이점 외에도 이러한 리포지토리에 직접 의존하는 몇 가지 기본적인 단점도 있습니다.

  1. 우리는 코드를 라이브러리와 `Page` 또는 `Pageable`과 같은 특정 추상화에 연결합니다. 물론 이 라이브러리에 고유한 것은 아니지만 이러한 내부 구현 세부 정보를 노출하지 않도록 주의해야 합니다.
  2. 예를 들어 CrudRepository 를 확장 하여 전체 지속성 메서드 세트를 한 번에 노출합니다. 이것은 대부분의 상황에서도 괜찮을 수 있지만 노출된 메서드에 대해 보다 세밀한 제어를 얻고 싶은 상황에 직면할 수 있습니다(예: save(…)delete( 를 포함하지 않는 ReadOnlyRepository 생성). ...) CrudRepository 의 메서드

7. 결론

이 기사에서는 Spring Data JPA 리포지토리 인터페이스의 간략하지만 중요한 몇 가지 차이점과 기능에 대해 설명했습니다.

자세한 내용은 Spring Persistence 시리즈를 참조하십시오 .

Persistence footer banner