Spring/Spring Data JPA

[Spring Data JPA] 1. Core concepts

noahkim_ 2023. 10. 17. 23:00

 

1. Repository 인터페이스

@Indexed
public interface Repository<T, ID> { }
  • Spring Data의 중심 인터페이스입니다.

 

마커 인터페이스

  • 타입 정보 포착 및 식별에 활용 (구체적 메서드 X)
  • 확장 인터페이스 식별 및 추적

 

Spring Data JPA 와의 연계

  • Spring Data JPA는 Repository 인터페이스를 인식하여, 개발자가 필요로 하는 CRUD 작업의 구현체를 자동으로 제공합니다.

 

타입 인자
  • T: 도메인 클래스
  • ID: 도메인 클래스의 식별자 타입

 

2. CrudRepository와 ListCrudRepository 인터페이스

  • 관리되는 엔터티 클래스에 대해 고급 CRUD 기능을 제공합니다.
  • 개발자는 이 인터페이스를 확장함으로써 엔터티에 대한 기본 CRUD 작업을 쉽게 수행할 수 있는 메소드를 얻게 됩니다.

 

CrudRepository

public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S entity);      (1)
    Optional<T> findById(ID primaryKey); (2)
    Iterable<T> findAll();               (3)
    long count();                        (4)
    void delete(T entity);               (5)
    boolean existsById(ID primaryKey);   (6)
    // … more functionality omitted.
}

 

ListCrudRepository

@NoRepositoryBean
public interface ListCrudRepository<T, ID> extends CrudRepository<T, ID> {
    <S extends T> List<S> saveAll(Iterable<S> entities);
    List<T> findAll();
    List<T> findAllById(Iterable<ID> ids);
}

 

findAll()
  • List 로 반환합니다. (Iterable X)

 

특정 영속성 기술을 위한 추상화

  • CrudRepository를 확장하여 특정 영속성 기술에 대한 추상화를 제공합니다.

 

JpaRepository
  • JPA를 사용하는 애플리케이션을 위한 추가 기능 제공
    • 영속성 컨텍스트와의 상호작용을 도움: flush(), saveAndFlush(), deleteInBatch()
  • PagingAndSortingRepository 확장

 

JPAQueryFactory

 

스크롤링

  • 큰 결과 세트를 작은 청크로 나누어 반복적으로 가져오는 방식 (대규모 데이터 세트를 효율적으로 처리)
  • 메모리 사용량 관리 + 성능 최적화

 

(JPA) Paging
public interface MemberRepository extends JpaRepository<Member, Long> {
    Page<Member> findByAgeGreaterThan(int age, Pageable pageable);
}

Pageable pageable = PageRequest.of(0, 50); // 첫 번째 페이지, 페이지 크기 50
Page<Member> page;

do {
    page = memberRepository.findByAgeGreaterThan(18, pageable);
    for (Member member : page.getContent()) {
        // member 객체 처리 로직
    }
    pageable = page.nextPageable(); // 다음 페이지 요청
} while (page.hasNext());

 

쿼리 메서드

interface UserRepository extends CrudRepository<User, Long> {
    long countByLastname(String lastname);  
    long deleteByLastname(String lastname);
    List<User> removeByLastname(String lastname);
}
  • count 및 delete에 대한 쿼리 유도 가능합니다.

 

3. PagingAndSortingRepository 인터페이스

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends Repository<T, ID> {
    Iterable<T> findAll(Sort sort);
    Page<T> findAll(Pageable pageable);
}
  • 엔티티에 대한 페이징 및 정렬을 용이하게 하는 메서드를 제공합니다.

 

PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(PageRequest.of(1, 20));
  • 조건에 대한 페이징 결과를 반환받을 수 있습니다.

 

 

출처