Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

스프링 데이터 JPA 본문

Spring/Spring 데이터 접근 - 활용 기술

스프링 데이터 JPA

studyHub 2024. 8. 18. 00:36

스프링 데이터 JPA 주요 기능

스프링 데이터 JPA는 JPA를 편리하게 사용할 수 있도록 도와주는 라이브러리이다.
수많은 편리한 기능을 제공하지만 가장 대표적인 기능은 다음과 같다.

  • 공통 인터페이스 기능 - JpaRepository 인터페이스를 통해서 기본적인 CRUD 기능 제공
  • 쿼리 메서드 기능 - 메서드 이름을 분석해서 필요한 JPQL을 만들고 실행해준다.

공통 인터페이스 기능

JpaRepository 인터페이스를 통해서 기본적인 CRUD 기능 제공한다.

공통화 가능한 기능이 거의 모두 포함되어 있다.

CrudRepository 에서 fineOne() findById() 로 변경되었다

 

JpaRepository 사용법

JpaRepository 인터페이스를 인터페이스 상속 받고, 제네릭에 관리할 <엔티티, 엔티티ID> 를 주면 된다.

그러면 JpaRepository 가 제공하는 기본 CRUD 기능을 모두 사용할 수 있다.

public interface ItemRepository extends JpaRepository<Item, Long> {
}

 

JpaRepository 인터페이스만 상속받으면 스프링 데이터 JPA가 프록시 기술을 사용해서 구현 클래스를 만들어준다.

그리고 만든 구현 클래스의 인스턴스를 만들어서 스프링 빈으로 등록한다.


쿼리 메서드 기능

인터페이스에 메서드만 적어두면, 메서드 이름을 분석해서 쿼리를 자동으로 만들고 실행해주는 기능을 제공한다.

public interface MemberRepository extends JpaRepository<Member, Long> {
   List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}

스프링 데이터 JPA는 메서드 이름을 분석해서 필요한 JPQL을 만들고 실행해준다.

물론 그냥 아무 이름이나 사용하는 것은 아니고 다음과 같은 규칙을 따라야 한다.

스프링 데이터 JPA가 제공하는 쿼리 메소드 기능

  • 조회: find…By , read…By , query…By , get…By
    예:) findHelloBy 처럼 ...에 식별하기 위한 내용(설명)이 들어가도 된다.
  • COUNT: count…By 반환타입 long
  • EXISTS: exists…By 반환타입 boolean
  • 삭제: delete…By , remove…By 반환타입 long
  • DISTINCT: findDistinct , findMemberDistinctBy
  • LIMIT: findFirst3 , findFirst , findTop , findTop3

JPQL 직접 사용하기

(이름이 너무 길 수 있어서) 쿼리 메서드 대신 직접 JPQL을 사용하고 싶을 때는 @Query 와 함께 JPQL을 작성하면 된다.

이때는 메서드 이름으로 실행하는 규칙은 무시된다

public interface SpringDataJpaItemRepository extends JpaRepository<Item, Long> {
   //쿼리 메서드 기능
   List<Item> findByItemNameLike(String itemName);
 
   //쿼리 직접 실행
   @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);
}

 

 

 


적용

ItemService는 ItemRepository에 의존하므로 ItemService에서 SpringDataJpaItemRepository를 그대로 사용할 수 없다. 물론 ItemService가 SpringDataJpaItemRepository를 직접 사용하도록 코드를 고치면 되겠지만, ItemService 코드의 변경없이 ItemService가 ItemRepository에 대한 의존을 유지하면서 DI를 통해 구현 기술을 변경하고 싶다.

 

조금 복잡하지만, 새로운 리포지토리를 만들어서 이 문제를 해결해보자. 여기서는 JpaItemRepositoryV2가 ItemRepository와 SpringDataJpaItemRepository 사이를 맞추기 위한 어댑터처럼 사용된다.

 

 

 

예외 변환

스프링 데이터 JPA도 스프링 예외 추상화를 지원한다. 스프링 데이터 JPA가 만들어주는 프록시에서 이미 예외 변환을 처리하기 때문에, @Repository 와 관계없이 예외가 변환된다.


참고 자료 & 이미지 출처
스프링 DB 2편 - 데이터 접근 기술 (김영한 님)

'Spring > Spring 데이터 접근 - 활용 기술' 카테고리의 다른 글

데이터 접근 기술 - 활용 방안  (2) 2024.09.02
QueryDSL : type-safe Query  (0) 2024.08.31
JPA  (0) 2024.08.17
MyBatis  (0) 2024.08.17
데이터 접근 기술 - 스프링 JdbcTemplate  (0) 2024.08.17