구조적으로 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- 김영한님 강의영상 및 자료 참조
'Java > Spring' 카테고리의 다른 글
[Spring] N+1 문제를 해결하기 위한 방안 (fetch join, @EntityGraph) (0) | 2023.03.18 |
---|---|
[Spring] Spring Data JPA Paging, Sort 기능 (0) | 2023.03.18 |
[Spring] Querydsl (0) | 2023.03.12 |
[Spring] OSIV[Open Session In View]를 적절히 사용하여 성능 최적화 (0) | 2023.03.08 |
[Spring] 변경 감지(Dirty checking)와 병합(merge) (0) | 2023.03.08 |