쿼리 메소드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나.
Repository 인터페이스에 간단한 네이밍 룰을 이용해 메소드를 작성하면 원하는 쿼리 작성 가능!
쿼리 메소드 이용시 가장 많이 사용하는 문법으로 find
사용.
find + (엔티티 이름) + By + 변수이름
엔티티 이름은 생략 가능, By 뒤에는 검색할 때 사용할 변수의 이름 적어주기
itemNm(상품명)으로 데이터를 조회하기 위해 By 뒤에 필드명인 ItemNm을 메소드의 이름에 붙여준다. 매개변수로는 검색할 때 사용할 상품명 변수 넘겨주기.
com.shop.respository.ItemRepository.java
List<Item> findByItemNm(String itemNm);
package com.shop.repository;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
class ItemRepositoryTest {
@Autowired
ItemRepository itemRepository;
@Test
@DisplayName("상품 저장 테스트")
public void createItemTest(){
for(int i=1; i<=10; i++){
Item item = new Item();
item.setItemNm("테스트 상품" + i);
item.setPrice(10000 + i);
item.setItemDetail("테스트 상품 상세 설명" + i);
item.setItemSellStatus(ItemSellStatus.SELL);
item.setStockNumber(100);
item.setRegTime(LocalDateTime.now());
item.setUpdateTime(LocalDateTime.now());
Item savedItem = itemRepository.save(item);
}
}
@Test
@DisplayName("상품명 조회 테스트")
public void findItemNmTest(){
this.createItemTest();
List<Item> itemList = itemRepository.findByItemNm("테스트 상품1");
for(Item item : itemList) {
System.out.println(item.toString());
}
}
}
테스트 코드를 실행시켜보면 콘솔창에 select 쿼리문이 실행된다. where 조건문에 item_nm 조건이 걸려있어서 binding parameter로 "테스트 상품1"이 지정된 것을 볼 수 있다!
💡 여러 개의 조건을 이용해 상품을 검색하거나 정렬해야 하는 경우, 키워드와 변수 이름을 메소드명으로 이어서 나열하면 됩니다.
ItemRepository.java
public interface ItemRepository extends JpaRepository<Item, Long> {
// 상품명과 상품 상세설명을 or 조건을 이용해 조회하는 쿼리 메소드
List<Item> findByItemNmOrItemDetail(String itemNm, String itemDetail);
}
ItemRepositoryTest.java
@Test
@DisplayName("상품명, 상품상세설명 or 테스트")
public void findByItemNmOrItemDetailTest(){
// 기존에 만들었던 테스트 상품을 만드는 메소드
this.createItemTest();
// 상품명이 "테스트 상품1" 또는 상품 상세설명이 "테스트 상품 상세 설명5"이면 해당 상품을 itemList에 할당한다.
List<Item> itemList = itemRepository.findByItemNmOrItemDetail("테스트 상품1", "테스트 상품 상세 설명5");
for(Item item : itemList){
System.out.println(item.toString());
}
}
2개의 상품 출력되는 것 확인!
ItemRepository.java
public interface ItemRepository extends JpaRepository<Item, Long> {
// LessThan 조건 처리하기
List<Item> findByPriceLessThan(Integer price);
}
ItemRepositoryTest.java
@Test
@DisplayName("가격 LessThan 테스트")
public void findByPriceLessThanTest() {
this.createItemTest();
List<Item> itemList = itemRepository.findByPriceLessThan(10005);
for(Item item : itemList){
System.out.println(item.toString());
}
}
db에 저장된 가격이 10001~10010인데 10005보다 작은 조건을 설정했으므로 4개의 상품이 출력되는 것을 볼 수 있다.
현재는 10001부터 10004까지 차례대로 출력되지만 OrderyBy 키워드를 이용하면 오름차순, 내림차순으로 조회 가능함.
오름차순의 경우: OrderBy + 속성명 + Asc
내림차순의 경우: OrderBy + 속성명 + Desc
ItemRepository.java
// OrderBy로 정렬하기
List<Item> findByPriceLessThanOrderByPriceDesc(Integer price);
ItemRespositoryTest.java
@Test
@DisplayName("가격 내림차순 조회 테스트")
public void findByPriceLessThanOrderByPriceDesc(){
this.createItemTest();
List<Item> itemList = itemRepository.findByPriceLessThanOrderByPriceDesc(10005);
for(Item item : itemList){
System.out.println(item.toString());
}
}
내림차순 정렬 성공~