ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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를 통한 간단한 실습

     

     

     

     

     

Designed by Tistory.