ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CrudRepository와 JpaRepository
    SpringDataJPA 2023. 8. 27. 00:58

    Spring Data JPA를 사용하면 Repository에서 JpaRepository와CrudRepository인터페이스중 한개를 선택한다. 

     

     

    아래로 갈 수록 저수준 모듈이며, 기능 구현이 많다.

     

    1. CrudRepository

    1) 정의

     

    public interface AccountRepository extends CrudRepository<Account, Long> {
    
    }
    
    // 인터페이스가 비어 있어도, 아래의 메서드들은 호출이 가능
    <S extends T> S save(S entity);
    
    Optional<T> findById(ID id);
    
    Iterable<T> findAll();
    
    long count();
    
    void deleteById(ID id);
    ...

     

    • 메드를 정의하지 않아도 간단한 CRUD 사용이 가능하다
    • CrudRepository는 레디스에 특화된 것은 아니고, Spring Data의 최상위 Repository 인터페이스들 중 하나

     

     

    2) 문제점

     

    우리가 정의하지 않은 기능을 인터페이스로 제공하면, 문제가 발생할 수 있다.

    예를 들어,
    우리는 삭제 메서드는 제공하지 않기를 바라지만,
    JpaRepository 는 삭제 메서드 & 필요 없는 다른 메서드들에 대한 인터페이스도 제공한다.

     

     

    2. JpaRepository

     

    1) JpaRepository 를 상속할 경우

     

    public interface MemverRepository extends JpaRepository<Member, Long> {
    
    }

     

    이미 구현되어 있는 많은 메시지가 외부에 개방된다.
    → 해당 repository에 개방된 메시지 자동완성 도움을 받았을 때, 이 repository의 책임들이 무엇이고 역할이 무엇인지 정확히 파악할 수 없게 된다.

     

     

     

    Repository

    Repository를 상속하게 되면 기본으로 구현되는 메서드가 전혀 없다. 직접 선언한 메서드에 대해서만 외부에 개방된다.

    이는 Application 계층에서 Repository(Domain 계층)에 어떤 메시지를 보낼 수 있는 지 한눈에 파악할 수 있게 된다.

     

    구현의 차이를 알아보자. JpaRepository를 상속하면 메서드를 선언하지 않아도 다양한 기능을 외부로 개방한다.

    public interface AccountRepository extends JpaRepository<Account, Long> {
    
    }

    반면 Repository를 상속하면 선언한 메서드만 외부로 개방한다.

    public interface AccountRepository extends Repository<Account, Long> {
        void save(Account account);
        Optional<Account> findById(Long id);
    }

    직접 선언한 메서드만 사용하므로 해당 Repository의 책임을 한 눈에 알아볼 수 있다.

     

    그래서 JpaRepository나 CrudRepository가 아닌 Repository를 상속해서 더 깔끔한 시스템 설계를 만들 수 있다.

    728x90

    'SpringDataJPA' 카테고리의 다른 글

    SpringDataJPA의 구현체  (0) 2022.12.29
    페이징과 정렬2  (0) 2022.12.29
    사용자 정의 리포지토리  (0) 2022.12.29
    벌크수정과 EntityGraph  (0) 2022.12.29
    페이징과 정렬  (0) 2022.12.28

    댓글

Designed by Tistory.