일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Data Structure
- Proxy
- 파이썬
- 네트워크
- Kafka
- Spring
- design pattern
- Java
- mongoDB
- MSA
- spring webflux
- Algorithm
- react
- 백준
- Galera Cluster
- 자료구조
- OS
- 자바
- Heap
- JPA
- c언어
- redis
- JavaScript
- 디자인 패턴
- 컴퓨터구조
- MySQL
- IT
- 알고리즘
- 운영체제
- C
Archives
- Today
- Total
시냅스
Spring Data JPA 정리 본문
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