Spring Data Repository

  • Spring Data Repository 추상화의 목표는 다양한 영속성 저장소에 대한 데이터 접근 계층을 구현하는 데 필요한 상용구 코드(boilerplate)의 양을 크게 줄이는 것이다.
  • 쉽게 말해, 데이터를 조회하기 위해 Persistence Layer 인 Repository 를 구현하기 위해서 필요한 boilerplate 를 줄이는 것이 목적이다.
  • Spring Data JPA 에서 JpaRepository 는 Infrastructure Layer 에 속하며, 그것을 상속받아서 구현한 Repository 는 Persistence Layer 에 속한다.

Core concepts

  • Spring Data Repository 추상화의 핵심 인터페이스는 Repository Inteface 이다.
    • @Indexed
      public interface Repository<T, ID> {}
      
  • Spring Data JPA Repository Architectures
    • JpaRepository (interface)
      • PagingAndSortingRepository (interface)
        • CrudRepository (interface)
          • Repository (interface)
      • QueryByExampleExecutor (interface)
  • Repository<T, ID>
    • T is Domain class
    • ID is Identifier
    • 작업할 유형을 캡처 하고, 인터페이스를 확장하는데 도움이 되는 마커 인터페이스(Marker Interface) 역할을 한다.
    • 특정 기술을 추상화한 JpaRepository, MongoRepository 같은 Persistence 를 제공한다. 이러한 인터페이스들은 CrudRepository 를 상속 받고 있다.
  • PagingAndSortingRepository<T, ID>
    • 페이지 접근을 용이하게 해주는 추상화된 인터페이스
  • Derived Count Query
    • CrudRepository 를 상속 받아서 새로운 인터페이스를 만들 수 있다.
    • interface UserRepository extends CrudRepository<User, Long> {
        long countByLastname(String lastname);
      }
      

Spring Data 를 사용하기 위한 4단계

  • Interface 구현
    • interface PersonRepository extends Repository<Person, Long> {  }
      
  • 쿼리 메서드 선언
    • interface PersonRepository extends Repository<Person, Long> {
        List<Person> findByLastname(String lastname);
      }
      
  • Java 기반 설정
    • @EnableJpaRepositories
      class Config {  }
      
  • xml 기반 설정
    • <jpa:repositories base-package="com.acme.repositories"/>
      
  • Repository 를 주입 받아서 사용
    • class SomeClient {
          private final PersonRepository repository;
      
          SomeClient(PersonRepository repository) {
            this.repository = repository;
          }
      
          void doSomething() {
            List<Person> persons = repository.findByLastname("Matthews");
          }
       }