Search
Duplicate
📒

[Spring DB] xx. 스프링 데이터 JPA 개념

상태
미진행
수업
Database Study
주제
JPA
4 more properties
참고

스프링 데이터 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
복사
ItemServiceItemRepository에 의존하기 때문에 ItemService에서 SpringDataJpaItemRepository를 그대로 사용할 수 없다
이렇게 중간에서 JpaItemRepository어댑터 역할을 해준 덕분에 ItemService가 사용하는 ItemRepository 인터페이스를 그대로 유지할 수 있고, 클라이언트인 ItemService를 변경하지 않아도 된다.
[ 참고]
스프링 데이터 JPA도 스프링 예외 추상화를 지원한다
스프링 데이터 JPA가 만들어주는 프록시에서 이미 예외 변환을 해주므로, @Repository와 관계없이 예외가 변환된다
스프링 데이터 JPA는 동적 쿼리 기능에 대한 지원이 매우 약하다..