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 쿼리처럼 애플리케이션 실행 시점에 문법 오류를 발견할 수 있는 매우 큰 장점이 있다. 

+ Recent posts