Spring/Spring Data JPA

[Spring Data JPA] 1. Core concepts

noahkim_ 2023. 10. 17. 23:00

1. Repository 인터페이스

  • Spring Data의 중심 인터페이스입니다.
개념 설명
마커 인터페이스 - 객체의 특정 성질을 표시하기 위해 사용
- 타입 정보만을 포착하고 식별하는 데 사용 (메서드 정의 ❌)
쿼리 메서드 자동 생성 메서드 이름을 분석하여 자동으로 적절한 쿼리를 생성해줌
Spring Data JPA
Spring Data JPA는 Repository 인터페이스를 자동으로 구현하여 CRUD 작업을 제공합니다.

 

코드) Repository

더보기
@Indexed
public interface Repository<T, ID> { }

 

 타입 인자

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

 

예제) 쿼리 메서드 자동 생성

더보기
interface UserRepository extends CrudRepository<User, Long> {
    long countByLastname(String lastname);  
    long deleteByLastname(String lastname);
    List<User> removeByLastname(String lastname);
}
  • count 및 delete에 대한 쿼리 유도 가능
  • CRUD 메서드 사용을 위해 CrudRepository 확장 (기능에 따른 인터페이스 확장 필수)

 

2. CrudRepository와 ListCrudRepository 인터페이스

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

 

코드) CrudRepository

더보기
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S entity);      
    Optional<T> findById(ID primaryKey); 
    Iterable<T> findAll();               
    long count();                        
    void delete(T entity);               
    boolean existsById(ID primaryKey);   
    // … 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)

 

3. PagingAndSortingRepository 인터페이스

  • 엔티티에 대한 페이징 및 정렬을 용이하게 하는 메서드를 제공합니다.

 

코드) PagingAndSortingRepository

더보기
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends Repository<T, ID> {
    Iterable<T> findAll(Sort sort);
    Page<T> findAll(Pageable pageable);
}

 

스크롤링

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

 

 

예제) PagingAndSortingRepository

더보기
public interface MemberRepository extends PagingAndSortingRepository<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());
  • 조건에 대한 페이징 결과를 반환받을 수 있습니다.

 

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

  • 위 인터페이스들을 확장하여 특정 영속성 기술에 대한 추상화를 제공합니다.
기능 설명 예시
JpaRepository CRUD 기능 제공
영속성 컨텍스트와 상호작용.
CRUD
- findByName(), save(), delete() 등

영속성 컨텍스트
- flush(): DB에 반영
- saveAndFlush(): 즉시 저장 및 반영
- deleteInBatch(): 배치 삭제
JPAQueryFactory QueryDSL을 사용한 동적 쿼리 작성.
- 타입 안정성 보장
- 복잡한 동적 쿼리 작성 지원.
JPAQueryFactory와 QMember 사용
- selectFrom(member).where(member.name.eq("John")).fetch()

 

 

출처