-
Spring Data JPA 1. 상속구조와 주요 인터페이스Spring/Spring Data JPA 2020. 5. 12. 00:39
JpaRepository - PagingAndSortingRepository - CrudRepository - Repository
이러한 상속 구조와 각 인터페이스의 역할을 이해해보자.
제일 밑단에 있는 영속화 기술에 특화된 JpaRepository를 빼면 나머진 다른 영속화 기술용
리파지토리에서도 재사용하는 공용 인터페이스들이다. 이 인터페이스들을 자세히 살펴보자.
Spring Data Repository 사용하기
다양한 영속성 저장소를 위해 데이터 접근 레이어를 구성할 때
코드들의 양을 상당히 줄일 수 있도록 하는 게 Repository이다.
다양한 쿼리 키워드를 제공하는데 우리가 Repository를 만들고 메서드를 만든다.
이때 메서드에 특정한 키워드를 만든다면 쿼리를 만들어주게 된다.
예를들어 findBy라는 키워드 등은 Spring Data Repository가 알고 있고
따라서 이 메서드 안에서 실행돼야 할 쿼리를 Spring Data JPA가 알 수있다.
Spring Data Repository 추상화에 가장 중심의 인터페이스는 Repository이다.
타입 아규먼트로 도메인에 타입과 도메인에서 사용하는 ID에 타입을 파라미터로 줘야 한다.
이 Repository 인터페이스 자체는 아무것도 없고 최상위의 인터페이스이다. 이 인터페이스를 구현한
CrudRepository 가 실질적으로 다양한 CRUD에 기능들을 정의하고 있다.
기본적인 CRUD 인터페이스를 몇 가지 보면
1. save
- save를 하면 var1을 세이브한 결괏값에 대해 저장돼있는 엔티티를 다시 한번 리턴해준다.
2. saveAll
- saveAll은 여러 엔티티를 동시에 저장할 때 쓰인다. 동시에 저장된 모든 엔티티들이 Iterable로 나오게 된다.
이때 best practice는 save 후에 파라미터의 엔티티가 아닌 리턴돼서 나온 엔티티를 써야 한다.
3. findById
- findById가 기본으로 제공이 된다. Optional을 쓰고 있기 때문에 Null이 나오지 않는다.
4. existsById
- 존재하는지 안 하는지 확인하기 위해 boolean을 확인하는 existsById이다.
5. count
- 현재 개수가 몇 개 인지
6. deleteById
- delete들은 void 형이다.
영속성 기술에 특화된 추상화를 제공하는데 Jpa면 JpaRepository MongoDB 면 mongoRepository
등. 이 인터페이스들은 CrudRepository를 확장하고 있고 영속화 기술에 관련된 더 많은 기능들을 제공한다고 한다.
CrudRepository를 기반으로 PaginAndSortingRepository를 만들어서 페이지와 소트에 관련된
메서드들이 추가가 되게 된다.
다음과 같이 CrudRepository를 상속받는 구조로 findAll은 Sort라는 파라미터를 받고 있다.
그래서 find 할 때 정렬에 관련된 옵션을 달 수 있다.
어떤 프로퍼티 기준으로 어떤 방향으로 ( 내림차순 오름차순 ) 정하는 게 Order이고 Order
에 목록을 받는 것이 Sort이다.
Sort 외에도 Page를 반환하는 findAll이 있는데 보통은 다 Paging을 하기 때문에 이 findAll을
가장 많이 쓰는 것으로 알고 있다. 이 findAll은 Sort와 Paging이 합쳐져 있게 되는데
어떠한 정렬 조건과 어떤 페이지를 리턴하게 할 것인지 ( 첫 페이지에 관련된 내용, 두 번째 페이지에 관한 내용 등 )
가 되겠다.
그렇게 PageRequest를 만들어서 파라미터로 주면 그만큼에 대한 정보를 가진 Page타입으로 리턴을 해준다.
쿼리 메소드를 만드는 4가지 스텝들
1. 리포지토리를 상속한 인터페이스 만들기
-엔티티 타입과 키 타입을 주어야한다.
2. 쿼리 메소드 인터페이스에 정의하기
3. 이런 리포지토리를 정의했다면 그냥 만들어지는게 아닌 활성화를 시켜야 한다.
- PersonRepository를 찾아서 이 타입에 해당하는 Bean을 만들어서
- ApplicationContext에 등록 해주도록
- 따라서 @EnableJpaRepositories 를 통해 활성화 해주어야 한다.
(하지만 스프링 부트를 사용하고 있다면 이런 애노테이션은 자동으로 설정이 된다.)
4. 이제 해당 리포지토리를 주입받아서 사용하면 된다.
- H2 DB를 통한 간단한 실습
'Spring > Spring Data JPA' 카테고리의 다른 글
Spring Data JPA 2. null 처리 관련 애노테이션 (31) 2020.06.01 JPA의 Dialect(방언) (0) 2020.05.25 영속성 컨텍스트(persistence context) (0) 2020.05.24 하이버네이트 ORM User guide 1 (0) 2020.05.11 JPA의 도메인 클래스 컨버터 자동 등록 (0) 2020.04.25