JPA

JPA - JpaRepository API

du.study 2020. 9. 11. 22:20
728x90

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가 많은것같아 다음 블로그에서 정리하려합니다.

728x90