빨간색코딩

Spring Data JPA 살펴보기 (JpaRepository, Bean으로 만들어지는 원리, 메소명으로 쿼리 만들기) 본문

Spring

Spring Data JPA 살펴보기 (JpaRepository, Bean으로 만들어지는 원리, 메소명으로 쿼리 만들기)

빨간색소년 2022. 1. 5. 23:15

1. 개요

  • Repository 추상화를 통해 interface 선언만으로도 JPA 사용 가능
    • 만약, Spring Data JPA 를 사용하지 않는다면, javax.persistence 패키지의 EntityManager 를 사용하거나 JPQL을 이용해서 쿼리를 날렸어야 했음.
    • JpaRepository<T, ID> 상속
  • 메소드 이름으로 쿼리 생성 지원
  • 이외에도 다양한 지원(페이징, 정렬, 도메인 클래스 변환)

2. JpaRepository<T, ID> 살펴보기

  • JpaRepository는 CrudRepository, PagingAndSortingRepository 등을 상속받음
  • <S extends T> S save(S entity) : insert/update
  • T findOne(ID id) : select
  • long count() : count
  • void delete(ID id) : delete

2-1. JpaRepository 상속한 인터페이스가 Spring Bean 에 어떻게 등록될까?

  • 인터페이스 타입의 인스턴스는 누가 만들어 주는것인가? (Impl 도 없는데..)
  • JpaRepository 를 상속받은 클래스는 Autowired 처럼 DI 되는것도 아닌 것 같고, 구현체를 정의한 적도 없는데, 해당 타입의 Bean 이 만들어지고 등록된다. 어떻게 가능한 것인지?
  • 리플렉션 패키지 내부의 Proxy 클래스를 활용한다. 이것을 사용하기 쉽게, 스프링AOP 는 ProxyFactory 로 추상화해서 만들어두었음.
    • 아래 spring data JPA는 아래의 RepositoryFactorySupport 를 사용해서, Proxy 객체를 bean 으로 등록한다.
public abstract class RepositoryFactorySupport implements BeanClassLoaderAware, BeanFactoryAware {
    public <T> T getRepository(Class<T> repositoryInterface, RepositoryFragments fragments) {
        // Create proxy
        ProxyFactory result = new ProxyFactory();
        result.setTarget(target);
        result.setInterfaces(repositoryInterface, Repository.class, TransactionalProxy.class);
 
        // 생략...
    }
}

3. 메소드이름으로 쿼리 자동생성

5. 페이징

  • Pageable : Spring Data 에서 제공하는 web support 중 하나
    • 페이지네이션에 필요한 정보들을 추상화
  • 컨트롤러에 인자로 추가 후 JpaRepository로 전달

6. 복잡한 쿼리 작성

  • JPQL : 엔티티 객체를 조회하는 객체 지향 쿼리
  • Criteria API : JPQL을 생성하는 빌더 클래스
  • 써드파티 라이브러리
    • QueryDSL
    • JOOQ
Comments