JPA - JpaRepository API
JpaRepository를 사용하면서 매번 사용하고 있는 API들에 대해 한번 기록해보려합니다.
우선 테스트를 다음과같은 간략학 JpaRepository를 작성하였습니다.
import org.springframework.data.jpa.repository.JpaRepository;
public interface AccountRepository extends JpaRepository<Account,Long> {
}
다음과 같이 JpaRepository 를 상속만 하면되며 별도의 @Repository를 이용하여 등록하지 않아도 됩니다.(이부분은 추후에 다시 찾아보는걸로)
repository의 준비가 끝났고, 이제 사용할 수 있는 method를 정리하려 합니다.
JpaRepository를 살펴보면, 내부적으로 PagingAndSortingRepository를 상속하면서 결과적으로 CrudRepository도 같이 상속하고 있기에 다음과 같은 API들을 사용할 수 있습니다.
findAllById(Iterable<ID> ids)
CrudRepository
이름 | 설명 |
save |
엔티티를 저장하는 메서드 |
saveAll |
엔티티 전체를 저장하는 메서드 |
findById | Id값을 이용하여 엔티티를 검색하는 메서드 |
findAll | entity전체를 검색하는 메서드 ( 전체조회 주의) |
findAllById(Iterable<ID> ids) | Ids 를 이용하여 entity 전체를 가져옵니다 여기서 ID는 위 레파지토리에서 정의한 Long 입니다. |
count | 엔티티의 개수를 반환하는 메서드 |
deleteById | id를 이용하여 entity를 삭제합니다. |
delete | entity 를 삭제합니다. |
deleteAll | 모든 entity를 삭제합니다. ( 위험.. 매우위험..) |
PagingAndSortingRepository
이름 | 설명 |
findAll (Sort sort) | sorting 조건을 걸어 전체 entity를 가져옵니다. |
findAll(Pageable pageable) | paging 조건을 걸어 전체 entity를 가져옵니다. |
우선 db데이터가 다음과 같이 있다고 가정할때, 간략한 테스트 코드입니다.
1. Iterable<T> findAll(Sort sort) example
List<Account> list = accountRepository.findAll(Sort.by(Sort.Direction.DESC, "id"));
System.out.println(list);
list.stream().forEach(it -> System.out.println(it.getId() +" "+ it.getUsername()));
---------------------------
5 test4
4 test3
3 test2
2 test1
1 test0
간단한 예시로 id를 이용하여 역정렬등을 쉽게 진행할 수 있도록 구현되어 있습니다.
2. Page<T> findAll(Pageable pageable) example
Page<Account> pagingTest = accountRepository.findAll(PageRequest.of(0,2));
pagingTest.stream().forEach(it -> System.out.println(it.getId() +" "+ it.getUsername()));
-------------------
1 test0
2 test1
page의 경우 전체 count개수 가져온 컨텐츠 개수등을 같이 가지고 있어서 페이징을 어디까지 할지또한 결정할 수 있습니다.
JpaRepository
이름 | 설명 |
flush | 영속성 컨텍스트의 변경 사항들과 DB의 상태를 동기화합니다. ( 컨텍스트를 비우는 작업이 아닙니다.) |
saveAndFlush | 엔티티를 저장하고 flush도 같이 진행합니다. ( 명확하게 말하면 조금 지연된 flush를 하긴합니다.) |
deleteInBatch | entity 리스트를 제거합니다. 단 차이가 있다면 where절을 통해 제거됩니다. delete from account where id=? or id=? ... id=? |
deleteAllInBatch | Entity전체를 삭제합니다. ( 단 deleteAll과 다르게 동작합니다.) |
getOne | id를 이용하여 Entity한개를 조회합니다. |
해당 사용 코드는 너무 간단하여 별도로 정리하지않았고, PagingAndSortingRepository에 존재하는 기능만 코드를 추가하였습니다.
각각의 기능을 이용해서 대부분의 동작을 구현할 수 있지만, where절이라던지 정렬등의 Query에 가까운 동작을 하기위해서는 JpaRepositiry 인터페이스에 메서드명으로 어떤 쿼리를 날릴 지 설정할 수 있습니다.
해당부분을 사용하면서도 naming keyword가 많은것같아 다음 블로그에서 정리하려합니다.