Java/Spring

[Spring] Spring Data JPA 공통 인터페이스

SeungbeomKim 2023. 3. 18. 18:32

구조적으로 JpaRepository는 공통 CRUD기능을 제공하고 있습니다. 그래서 생성한 Repository 인터페이스를 통해 기본적인 CRUD 기능을 구현하지 않아도 사용할 수 있습니다. 이제 공통 인터페이스에 대해 알아보겠습니다.

 

JpaRepository 공통 기능 인터페이스

public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>

JpaRepository를  사용하는 인터페이스

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

@Repository 어노테이션을 생략할 수 있는 이유는 Spring Data JPA가 자동으로 컴포넌트 스캔을 처리하고, JPA 관련 예외도 처리해 주기 때문입니다.

 

MemberRepository 인터페이스가 동작할 수 있는 이유는 Spring Data JPA가 Java의 기본적인 프록시 기술을 이용해 가짜 클래스를 미리 다 만들어 버리기 때문입니다. 그래서 구현체를 따로 만들 필요가 없게 됩니다.

실제로 memberRepository.getclass()를 출력해보면 Proxy 관련 문구가 출력됨을 확인할 수 있습니다. 

 

CrudRepository의 변경사항

T findOne -> Optional<T> findByid(ID)

boolean exists(ID) -> boolean existById(ID)

 

제네릭 타입 ( T : 엔티티, ID : 엔티티의 식별자 타입, S : 엔티티와 그 자식 타입)

 

주요 메서드

  • save(S) : 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다
  • delete(T) : 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove() 호출
  • findById(ID) : 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출 getOne(ID) : 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출
  • findAll(...) : 모든 엔티티를 조회한다. 정렬( Sort )이나 페이징( Pageable ) 조건을 파라미터로 제공할 수 있다

또한 모든 엔티티를 조회할 때, 정렬, 페이징을 파라미터로 두면 Sort, Pageable 조건을 적용할 수 있다는 장점이 있습니다 

 

정말 편한 JPA가 제공해주는 공통 인터페이스 기능과 그 기능을 이용할 수 있는 이유에 대해서 알아보았습니다.  

 

<참고 자료>

실전! 스프링 데이터 JPA- 김영한님 강의영상 및 자료 참조