1 Spring Data JPA
- Spring Data JPA는 데이터 액세스 계층 구현에 필요한 반복적인 코드를 크게 줄여주는 프레임워크입니다.
- JPA 기반의 Repository를 편리하게 생성할 수 있도록 지원합니다.
- 기본적인 CRUD와 페이징 기능을 인터페이스만으로도 구현할 수 있습니다.
- 개발자는 JpaRepository를 상속받는 인터페이스만 작성하면 됩니다.
- 구현체는 Spring Data JPA가 자동으로 생성해서 주입해줍니다.
스프링 데이터 JPA가 구현 클래스 대신 생성
- JpaRepository를 상속받는 인터페이스 ItemRepository의 구현 클래스를 Spring Data JPA가 생성해줍니다.
2 인터페이스 구성
- Spring Data JPA는 다양한 리포지토리 인터페이스를 제공합니다.
- 각 인터페이스는 특정 기능에 중점을 둔 메서드들을 제공합니다.
2.1 JpaRepository 인터페이스
- 가장 일반적으로 사용되는 기본 리포지토리 인터페이스입니다.
- 엔티티 클래스와 ID 타입을 타입 파라미터로 지정합니다.
- 예)
<Member, Long>
- 예)
public interface MemberRepository extends JpaRepository<Member, Long> {
}
사용 예시
@SpringBootTest
@Transactional
public class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Test
public void testMember() {
Member member = new Member("memberA");
Member savedMember = memberRepository.save(member);
Member findMember = memberRepository.findById(savedMember.getId()).get();
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
Assertions.assertThat(findMember).isEqualTo(member);
}
}
- MemberRepository는 인터페이스입니다.
memberRepository.save()
라는 메소드를 구현한적이 없지만 사용이 가능합니다.- 이는 Spring Data JPA가 MemberRepository를 구현한 구현체를 주입받기 때문입니다.
- 이처럼 기본적인 CRUD는 직접 구현하지 않아도 됩니다.
2.2 CrudRepository 인터페이스
- 기본적인 CRUD 기능을 제공하는 인터페이스입니다.
- 주요 메서드는 다음과 같습니다:
- save(): 엔티티 저장 및 수정
- findById(): ID로 엔티티 조회
- findAll(): 모든 엔티티 조회
- delete(): 엔티티 삭제
- count(): 엔티티 개수 조회
- existsById(): ID로 엔티티 존재 여부 확인
public interface CrudRepository<T, ID> extends Repository<T, ID> {
// 주어진 엔티티 저장하기
<S extends T> S save(S entity);
// 주어진 ID로 엔티티를 찾아 반환
Optional<T> findById(ID primaryKey);
// 모든 엔티티를 반환
Iterable<T> findAll();
// 엔티티의 수를 반환
long count();
// 주어진 엔티티를 삭제
void delete(T entity);
// 주어진 ID를 가지는 엔티티의 존재 유무 반환
boolean existsById(ID primaryKey);
// … more functionality omitted.
}
2.3 PagingAndSortingRepository 인터페이스
- 페이징과 정렬 기능을 제공하는 인터페이스입니다.
- 다음과 같은 메서드를 제공합니다:
- findAll(Pageable): 페이징 처리된 데이터 조회
- findAll(Sort): 정렬된 데이터 조회
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<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));
3 Query Methods
- Spring Data JPA는 메서드 이름만으로 쿼리를 생성하는 강력한 기능을 제공합니다.
- 복잡한 쿼리가 필요한 경우 JPA Named Query나 @Query 어노테이션을 사용할 수 있습니다.
쿼리 메소드의 3가지 기능
- 메소드 이름으로 쿼리 생성
- 메소드 이름으로 JPA Named Query 호출
- @Query 어노테이션을 사용해서 리포지토리 인터페이스에 쿼리 직접 정의