[JPA] CRUDRepository vs. JPARepository

Yennie·2024년 6월 27일

JPA

목록 보기
19/19

CRUDRepository 와 JPARepository 모두 Spring Data JPA가 제공하는 인터페이스로, 모두 데이터 액세스 계층의 코드를 간결하게 만들기 위해 제공되지만, 제공하는 관계에 차이가 있다.

  1. CRUDRepository
  • 기본 CRUD 작업을 지원한다.
  1. JPARepository
  • CrudRepository와 PagingAndSortingRepository를 확장하므로 CRUD 작업 및 페이징/정렬 관련 메서드를 모두 포함한다.
  • 추가적으로 JPA 관련 메서드 (flush(), deleteInBatch() 등 JPA에 특화된 작업 또한 가능하다)
  • JPARepository 를 사용하면 페이징, 정렬 및 JPA의 다른 고급 기능을 쉽게 사용할 수 있다.
  • Iterable을 반환하는 CrudRepository에 비해 List를 반환하기 때문에 더 편리하다.

CrudRepository

CrudRepository는 Spring Data JPA가 제공하는 기본적인 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 위한 인터페이스이다. 기본적인 데이터 액세스 작업을 단순화하기 위해 제공된다.

주요 기능:

  • 기본적인 CRUD 작업을 지원한다.
  • 인터페이스 메서드:
    • save(S entity)
    • saveAll(Iterable<S> entities)
    • findById(ID id)
    • existsById(ID id)
    • findAll()
    • findAllById(Iterable<ID> ids)
    • count()
    • deleteById(ID id)
    • delete(T entity)
    • deleteAllById(Iterable<? extends ID> ids)
    • deleteAll(Iterable<? extends T> entities)
    • deleteAll()
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {

	<S extends T> S save(S entity);

	<S extends T> Iterable<S> saveAll(Iterable<S> entities);

	Optional<T> findById(ID id);

	boolean existsById(ID id);

	Iterable<T> findAll();

	Iterable<T> findAllById(Iterable<ID> ids);

	long count();

	void deleteById(ID id);

	void delete(T entity);

	void deleteAllById(Iterable<? extends ID> ids);

	void deleteAll(Iterable<? extends T> entities);

	void deleteAll();

JPARepository

JpaRepositoryCrudRepositoryPagingAndSortingRepository를 확장한 인터페이스로, 기본 CRUD 작업 외에도 페이징 및 정렬 기능과 JPA 관련 추가 기능을 제공한다.

추가 기능:

  • 페이징 및 정렬 기능 지원.
  • JPA에 특화된 메서드 지원:
    • flush()
    • saveAndFlush(S entity)
    • saveAllAndFlush(Iterable<S> entities)
    • deleteAllInBatch(Iterable<T> entities)
    • deleteAllByIdInBatch(Iterable<ID> ids)
    • deleteAllInBatch()
    • getReferenceById(ID id)
    • findAll(Example<S> example)
    • findAll(Example<S> example, Sort sort)
@NoRepositoryBean
public interface JpaRepository<T, ID> extends ListCrudRepository<T, ID>, ListPagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {

	void flush();
	
	<S extends T> S saveAndFlush(S entity);

	<S extends T> List<S> saveAllAndFlush(Iterable<S> entities);

	void deleteAllInBatch(Iterable<T> entities);

	void deleteAllByIdInBatch(Iterable<ID> ids);

	void deleteAllInBatch();

	T getReferenceById(ID id);

	@Override
	<S extends T> List<S> findAll(Example<S> example);

	@Override
	<S extends T> List<S> findAll(Example<S> example, Sort sort);
}

차이점

  • JPARepository는 Iterator를 반환하는 CRUDRepository와 달리 List를 반환하기 때문에 사용이 더 편리하다. (findAll() 메서드 참고)

JPARepository 는 pagination과 정렬 기능을 추가로 제공하고, 쿼리 메소드 기능을 제공하는 것이 차이점이다.

@NoRepositoryBean
public interface JpaRepository<T, ID> extends ListCrudRepository<T, ID>, ListPagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {

    void flush();

    <S extends T> S saveAndFlush(S entity);

    <S extends T> List<S> saveAllAndFlush(Iterable<S> entities);

    void deleteAllInBatch(Iterable<T> entities);

    void deleteAllByIdInBatch(Iterable<ID> ids);

    void deleteAllInBatch();

    T getReferenceById(ID id);

    @Override
    <S extends T> List<S> findAll(Example<S> example);

    @Override
    <S extends T> List<S> findAll(Example<S> example, Sort sort);
}
profile
PM | Aspiring SWE | linkedin.com/in/emilyyeeun

0개의 댓글