시작이 반

[JPA] JpaRepository 본문

Programming/JPA

[JPA] JpaRepository

G_Gi 2021. 1. 31. 18:21
SMALL

Spring 입문한 사람이 작성한 글입니다... 잘못된 내용이 있을 수 있습니다..

 

Spring DB접근 기술

JDBC Template, JPA, Spring Data JPA등 이 있다.

 

이번 글에서는 Spring Data JPA에 대해서 작성

 

우선 스프링 부트와 JPA만을 사용해도 개발 생산성이 많이 증가하고, 개발해야할 코드도 줄어든다.

여기에 Spring Data JPA를 사용하면 리포지토리의 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있다.

그리고 반복해서 작성해야 했던 CRUD기능도 Spring Data JPA가 모두 제공한다.

하지만 JPA부터 학습하고 Spring Data JPA를 학습하는 것이 좋다.

 

사용법

 

public interface BookRepository extends JpaRepository<Book, Long> {
}

JpaReository를 extends를 하면 해당 인터페이스는 구현체를 자동으로 만들어 스프링 빈에 등록한다.

 

org.springframework.data.repository.Repository를 상속한 interface 클래스는 @Repository Annotation을 생략해도 Spring 로딩시 자동으로 Repository로 등록 한다.

 

<>안에는 Entity 클래스 이름과 ID 필드 타입이 지정된다.

 

기본기능

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를 가져옵니다.

 

JpaRepository

이름 설명
flush 영속성 컨텍스트의 변경 사항들과 DB의 상태를 동기화합니다. ( 컨텍스트를 비우는 작업이 아닙니다.)
saveAndFlush 엔티티를 저장하고 flush도 같이 진행합니다. ( 명확하게 말하면 조금 지연된 flush를 하긴합니다.)
deleteInBatch entity 리스트를 제거합니다.  단 차이가 있다면 where절을 통해 제거됩니다.
delete from account where id=? or id=?  ... id=?
deleteAllInBatch Entity전체를 삭제합니다. ( 단  deleteAll과 다르게 동작합니다.)
getOne id를 이용하여 Entity한개를 조회합니다.

 

위의 기본 기능을 제외한 조회 기능을 추가하기 위해서는 규칙에 맞는 메소드를 추가해야 한다.

규칙 설명
findBy로 시작 쿼리를 요청하는 메서드 임을 알림
countBy로 시작 쿼리 결과 레코드 수를 요청하는 메서드 임을 알림

위의 findBy에 이어 해당 Entity 필드 이름을 입력하면 검색 쿼리를 실행한 결과를 전달한다.

메서드의 반환형이 Entity 객체이면 하나의 결과만을 전달하고, 반환형이 List라면 쿼리에 해당하는

모든 객체를 전달한다. 

 

Query 메소드에 포함할 수 있는 키워드 (이외에도 여러 키워드가 있음)

docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

메서드 이름 키워드  샘플  설명
 And  findByEmailAndUserId(String email, String userId)  여러필드를 and 로 검색
 Or  findByEmailOrUserId(String email, String userId)  여러필드를 or 로 검색
 Between  findByCreatedAtBetween(Date fromDate, Date toDate)  필드의 두 값 사이에 있는 항목 검색
 LessThan  findByAgeGraterThanEqual(int age)  작은 항목 검색
 GreaterThanEqual  findByAgeGraterThanEqual(int age)  크거나 같은 항목 검색
 Like  findByNameLike(String name)  like 검색
 IsNull  findByJobIsNull()  null 인 항목 검색
 In  findByJob(String … jobs)  여러 값중에 하나인 항목 검색
 OrderBy  findByEmailOrderByNameAsc(String email)  검색 결과를 정렬하여 전달

 

만약에 사용자 정의 메소드를 구현하고 싶다면 따로 interface를 작성한다.

 

사용자 정의 Repository Interface

public interface CustomProductRepository{
    public List<Product​> findCustomProduct;
}

인터페이스 구현

public class CustomProductRepositoryImpl implements CustomProductRepository{
    public List<Product> findCustomProduct(){
        .....
    }
}

JpaRepository에 따로 작성한 interface를 상속 한다.

public interface ProductRepository extends JpaRepository<Product, String>, CustomProductRepository
}

 

 

 

참고

 

LIST

'Programming > JPA' 카테고리의 다른 글

[JPA] 변경감지와 병합(merge)  (1) 2021.05.27
[JPA] DTO, Domain(Entity)  (0) 2021.02.19
[JPA] 연관관계  (0) 2021.02.18
[JPA] Paging  (0) 2021.02.05
[JPA] List<DTO> to List<Entity> (DTO, Entity)  (0) 2021.02.01