참고
스프링 데이터 JPA
NOTE
Spring Data JPA는 JPA를 한 단계 더 추상화 시켜 개발 용이성을 상당히 올려주는 인터페이스다.
공통 인터페이스 기능
NOTE
public interface SpringDataJpaItemRepository extends JpaRepository<Item, Long> {
Java
복사
•
JpaRepository 인터페이스를 상속받고, 제네릭에 관리할 <entity, entitiy id>를 준다
•
JpaRepository 인터페이스만 상속받으면 스프링 데이터 JPA가 프록시 기술을 사용해서 구현 클래스를 만들어 스프링 빈으로 등록해준다.
쿼리 메서드 기능
NOTE
•
스프링 데이터 JPA는 인터페이스에 메서드만 적어두면, 메서드 이름을 분석해서 쿼리를 자동으로 만들어주고 실행해주는 기능을 제공한다.
순수 JPA 리포지토리
public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {
return em.createQuery("select m from Member m where m.username = :username and m.age > :age")
.setParameter("username", username)
.setParameter("age", age)
.getResultList();
}
Java
복사
직접 JPQL을 작성하고, 파라미터도 직접 바인딩 해야함.
스프링 데이터 JPA
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}
Java
복사
메서드 이름을 분석해서 자동으로 만들어줌
스프링 데이터 JPA가 제공하는 쿼리 메소드 기능
•
조회 : find..By, read..By, query..By, get..By
◦
ex) findHelloBy 처럼 ..에 식별하기 위한 내용(설명)이 들어가도 된다.
•
COUNT : count..By → 반환타입 long
•
EXISTS : exists..By → 반환타입 Boolean
•
삭제 : delete..By, remove..By → 반환타입 long
•
DISTINCT : findDistinct, findMemberDistinctBy
•
LIMIT : findFirst3, findFirst, fintTop, findTop3
스프링 데이터 JPA 적용
NOTE
•
데이터를 조건에 따라 4가지로 분류해서 검색한다
◦
모든 데이터 조회
◦
이름 조회
◦
가격 조회
◦
이름 + 가격 조회
public interface SpringDataJpaItemRepository extends JpaRepository<Item, Long> {
// ItemName을 Like로 검색함
List<Item> findByItemNameLike(String itemName);
// Price를 이하조건으로 검색함
List<Item> findByPriceLessThanEqual(Integer price);
// 쿼리 메서드
List<Item> findByItemNameLikeAndPriceLessThanEqual(String itemName, Integer price);
// 쿼리 직접 실행
@Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") String itemName,@Param("price") Integer price);
}
Java
복사
쿼리 메소드 예시, 이름이 너무길면 직접 Query를 작성하기도 함
의존관계와 구조
NOTE
public class JpaItemRepositoryV2 implements ItemRepository {
private final SpringDataJpaItemRepository repository;
@Override
public Item save(Item item) {
...
Java
복사
•
ItemService는 ItemRepository에 의존하기 때문에 ItemService에서 SpringDataJpaItemRepository를 그대로 사용할 수 없다
•
이렇게 중간에서 JpaItemRepository가 어댑터 역할을 해준 덕분에 ItemService가 사용하는 ItemRepository 인터페이스를 그대로 유지할 수 있고, 클라이언트인 ItemService를 변경하지 않아도 된다.
[ 참고]
•
스프링 데이터 JPA도 스프링 예외 추상화를 지원한다
•
스프링 데이터 JPA가 만들어주는 프록시에서 이미 예외 변환을 해주므로, @Repository와 관계없이 예외가 변환된다
•
스프링 데이터 JPA는 동적 쿼리 기능에 대한 지원이 매우 약하다..