개발/spring
[jpa] Repository, CrudRepository, JpaRepository
방푸린
2024. 11. 23. 22:00
반응형
환경: springboot3.3
1. Repository 사용
- Repository는 Spring Data JPA의 가장 기본 인터페이스로, 기본적인 CRUD 메서드를 제공하지 않는다.
- 따라서 save(), findById(), delete()와 같은 기본적인 CRUD 기능을 사용하려면 CrudRepository 또는 JpaRepository를 확장해야 한다.
- Repository는 보통 커스텀 리포지토리 인터페이스에서 사용되며, 실제 데이터베이스 관련 작업은 별도로 구현해야 한다.
public interface RatingRepository extends Repository<Rating, String> {
Optional<Rating> findByMemberId(String memberId);
}
하지만 위와 같이 작성가능하다!?
Repository 인터페이스 자체는 Spring Data JPA에서 기본적으로 제공하는 CRUD 기능을 직접적으로 제공하지 않지만, Spring Data JPA가 제공하는 쿼리 메서드 이름 규칙을 사용하면 findBy와 같은 쿼리 메서드를 Repository 인터페이스에서도 사용할 수 있다. 즉, Repository는 기본적으로 CRUD 메서드를 제공하지 않지만, Spring Data JPA는 메서드 이름 기반의 쿼리 생성 기능을 지원한다.
왜 findBy 메서드가 동작할까?
Spring Data JPA의 인터페이스 상속 구조
- Repository는 Spring Data JPA의 최상위 마커 인터페이스
- 실제로 인터페이스 열면 아무 함수도 없음
- CrudRepository와 JpaRepository는 이 Repository를 상속받아 확장된 기능을 제공한다.
- findBy 메서드는 실제로 Repository에 구현된 것이 아니라, Spring Data JPA가 런타임에 자동으로 구현해 주는 기능
어떻게?
- Spring Data JPA는 @EnableJpaRepositories를 통해 등록된 리포지토리를 스캔
- 리포지토리가 Repository를 상속받으면 Spring은 이를 프록시 객체로 생성하고, 쿼리 메서드(findByXxx)를 자동으로 구현
- 따라서 JpaRepository나 CrudRepository가 아니라도 Repository를 상속하면 동작한다.
2. CrudRepository
CrudRepository는 기본적인 CRUD 메서드를 제공
- save(): 엔티티 저장 또는 업데이트
- findById(): ID로 엔티티 조회
- delete(): 엔티티 삭제
- deleteById(): ID로 엔티티 삭제
- count(): 엔티티 개수 조회
- existsById(): 엔티티 존재 여부 확인
페이징 및 정렬 기능은 제공하지 않으며, 추가 기능이 필요하다면 JpaRepository로 확장해야 합니다.
3. JpaRepository
- CrudRepository에 추가적으로 JPA에 특화된 기능인 페이징, 정렬, 배치 저장 등을 제공.
- 또한, findAll(Pageable pageable)이나 saveAll()과 같은 메서드를 제공하여 더 고급 기능을 사용할 수 있다.
- 기본 CRUD만 필요한 경우:
- CrudRepository 또는 PagingAndSortingRepository를 사용.
- JPA 관련 기능 사용 필요:
- JpaRepository를 사용.
- 커스터마이징된 최소 구현이 필요한 경우:
- Repository를 상속하여 직접 메서드를 정의.
728x90
반응형