ItemRepository 인터페이스가 JpaRepository를 구현하면 Spring Data Jpa가 ItemRepository 구현 클래스를 대신 생성한다.
이때 ItemRepository는 프록시 클래스라서 작동한 것이다
@Repository를 생략가능한 이유는 스프링 데이터 JPA가 컴포넌트 스캔을 자동으로 처리해준다
JPA예외를 스프링 예외로 변환하는 과정도 자동으로 처리해준다
-JpaRepository에서 제공하는 공통 메서드

-스프링 데이터 JPA에서 제공하는 3가지 기능
1. 메소드 이름으로 쿼리 생성: find....byxxxx(xxxx를 기반으로 쿼리를 실행한다)
스프링 데이터 JPA가 제공하는 쿼리 메소드 기능
1) 조회: find..By, read...By, query...By, get...By
2) count: count...By, 반환타입은 long이다
3) exists: exits...By, 반환타입은 boolean이다
4) delete: delete...By, remove...By, 반환타입은 long이다
5) distinct: findDistinct, findMemberDistincBy, 중복제거해서 객체 조회?
6) limit: findFirst3, findFirst, findTop, findTop3
참고: 엔티티의 필드명이 변경되면 인터페이스에 정의된 메서드 이름도 꼭 같이 변경해줘야 한다. 그렇지 않으면 애플리케이션을 실행하는 시점에 오류가 발생할 수 있다. 애플리케이션 로딩 시점에 오류를 인지할 수 있는 것이 스프링 데이터 JPA의 큰 장점이다
2. 메소드 이름으로 JPA NamedQuery 호출
실무에서 사용하는 일은 드물기 때문에 밑의 3번 방법을 사용하는 것을 권장한다.
그래도 애플리케이션 실행 시점에 문법 오류를 발견할 수 있는 매우 큰 장점이 있다.
@Entity
@NamedQuery(
name="Member.findByUsername",
query="select m from Member m where m.username = :username")
public class Member {
... }
@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
3. @Query 어노테이션을 사용해서 Repository interface에 쿼리를 직접 정의함
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query("select m from Member m where m.username= :username and m.age = :age")
List<Member> findUser(@Param("username") String username, @Param("age") int age);
}
실행할 메서드에 정적 쿼리를 직접 작성하므로 이름 없는 Named 쿼리라 할 수 있다
JPA Named 쿼리처럼 애플리케이션 실행 시점에 문법 오류를 발견할 수 있는 매우 큰 장점이 있다.
'Spring > Spring Data JPA' 카테고리의 다른 글
[스프링 데이터 JPA] Auditing (0) | 2022.03.20 |
---|---|
[스프링 데이터 JPA] @EntityGraph (0) | 2022.03.20 |
[스프링 데이터 JPA] 벌크 연산, 스냅샷 (0) | 2022.03.19 |
[스프링 데이터 JPA] 페이징과 정렬 (0) | 2022.03.19 |
[스프링 데이터 JPA] 파라미터 바인딩, 반환 타입 (0) | 2022.03.19 |