스프링 데이터 JPA 주요기능
JpaRepository
인터페이스를 통해 기본적인 CRUD 기능 제공JPARepository 사용법
public interface ItemRepository extends JpaRepository<Item, Long> {
}
JpaRepository
인터페이스를 인터페이스 상속 받고, 제네릭에 관리할 <엔티티, 엔티티ID>
를 주면 된다JpaRepository
가 제공하는 기본 CRUD기능을 모두 사용 가능JpaRepository
만 상속받으면 스ㅡㅍ링 데이터 JPA가 프록시 기술을 사용해서 구현 클래스를 만들어 준다. 그리고 만든 구현 클래스의 인스턴스를 만들어서 스프링 빈으로 등록쿼리메서드 기능
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}
JPQL 사용 예시
public interface SpringDataJpaItemRepository extends JpaRepository<Item, Long> {
List<Item> findByItemNameLike(String itemName);
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);
}
@Query
와 함께 JPQL을 작성하면 도니다. 이때 메서드 이름으로 실행되는 규칙은 무시List<Item> findByItemNameLike(String itemName);
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);
findAll()
select i from Item i
findByItemNameLike()
select i from Item i where i.name like ?
select i from Item i where i.price <= ?
findByItemNameLikeAndPriceLessThanEqual()
select i from Item i where i.name like ? and i.price <= ?
쿼리를 직접 사용하려면 @Query
구문을 쓰면된다. 변수를 바인딩 할 때는 @Param("itemName")
와 같이 지정하면 됨
@Repository
@Transactional
@RequiredArgsConstructor
public class JpaItemRepositoryV2 implements ItemRepository {
private final SpringDataJpaItemRepository repository;
@Override
public Item save(Item item) {
return repository.save(item);
}
@Override
public void update(Long itemId, ItemUpdateDto updateParam) {
Item findItem = repository.findById(itemId).orElseThrow();
findItem.setItemName(updateParam.getItemName());
findItem.setPrice(updateParam.getPrice());
findItem.setQuantity(updateParam.getQuantity());
}
@Override
public Optional<Item> findById(Long id) {
return repository.findById(id);
}
@Override
public List<Item> findAll(ItemSearchCond cond) {
String itemName = cond.getItemName();
Integer maxPrice = cond.getMaxPrice();
if (StringUtils.hasText(itemName) && maxPrice != null) {
// return repository
.findByItemNameLikeAndPriceLessThanEqual("%" + itemName + "%", maxPrice);
return repository.findItems("%" + itemName + "%", maxPrice);
} else if (StringUtils.hasText(itemName)) {
return repository.findByItemNameLike("%" + itemName + "%");
} else if (maxPrice != null) {
return repository.findByPriceLessThanEqual(maxPrice);
} else {
return repository.findAll();
}
}
}
의존관계와 구조
ItemService
는 ItemRepository
에 의존하므로 ItemService
에서 직접 SpringDataJpaItemRepository
을 사용할 수 없음JpaItemRepository2
를 ItemRepository
와 SpringDataJpaItemRepository
사이를 맞추 기 위한 어댑터 처럼 사용함findAll()
@Override
public List<Item> findAll(ItemSearchCond cond) {
String itemName = cond.getItemName();
Integer maxPrice = cond.getMaxPrice();
if (StringUtils.hasText(itemName) && maxPrice != null) {
// return repository
.findByItemNameLikeAndPriceLessThanEqual("%" + itemName + "%", maxPrice);
return repository.findItems("%" + itemName + "%", maxPrice);
} else if (StringUtils.hasText(itemName)) {
return repository.findByItemNameLike("%" + itemName + "%");
} else if (maxPrice != null) {
return repository.findByPriceLessThanEqual(maxPrice);
} else {
return repository.findAll();
}
}
}
like
=> % + itemName + %
이 부분을 주의하자itemName
이름을 넣으면 x
출처:https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2