CRUDRepository 와 JPARepository 모두 Spring Data JPA가 제공하는 인터페이스로, 모두 데이터 액세스 계층의 코드를 간결하게 만들기 위해 제공되지만, 제공하는 관계에 차이가 있다.
CrudRepository는 Spring Data JPA가 제공하는 기본적인 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는 CrudRepository와 PagingAndSortingRepository를 확장한 인터페이스로, 기본 CRUD 작업 외에도 페이징 및 정렬 기능과 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 는 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);
}