시냅스

Spring Data JPA 정리 본문

Java, Spring/JPA

Spring Data JPA 정리

ted k 2022. 9. 3. 16:23

Spring Data JPA

  • CRUD + 쿼리
  • 여러 데이터베이스에 동일한 인터페이스를 제공한다.
  • 메서드 이름으로 쿼리를 생성한다.
  • 스프링에서 id 값만 넘겨도 도메인 클래스로 바인딩된다.

 

용례 - 스프링 데이터 JPA 적용

public interface SpringDataJpaItemRepository extends JpaRepository<Item, Long> {
																	// 각각 객체와 PK이다.
    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);
}
  • JpaRepository 인터페이스를 상속 받으면 기본적인 CRUD 기능을 사용할 수 있다.
  • 복잡한 쿼리는 쿼리메서드를 사용하거나, @Query를 통해 사용한다.

 

용례 - CRUD

@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();
        }
    }
}
  • insert
    • 인터페이스에서 정의한 save를 통해 저장한다.
  • update
    • JPA와 마찬가지로 객체를 수정하면 영속성 컨텍스트에 의해 update 된다.
  • 단건 조회
    • id를 통해 findById를 수행한다.
  • 다건 조회
    • 각각 상황에 맞는 인터페이스에서 정의한 함수를 시행한다.
    • 동적 쿼리를 적용하는 데에 한계점이 존재한다.
    • 이러한 한계점은 Querydsl을 통해 해소할 수 있다.

'Java, Spring > JPA' 카테고리의 다른 글

JPA 상속관계 매핑 정리  (0) 2022.09.17
JPA 연관관계 정리  (0) 2022.09.16
JPA 엔티티 매핑 정리  (0) 2022.09.16
JPA 영속성 컨텍스트 정리  (0) 2022.09.16
Spring JPA 기본 사용법 정리  (0) 2022.09.03
Comments