[스프링부트JPA] 쇼핑몰 상품 쿼리메서드

JEONG SUJIN·2023년 1월 24일
0

쿼리 메서드

애플리케이션을 개발할려면 데이터를 조회하는 기능은 필수.
쿼리메서드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나로 Repository인터페이스에 간단한 네이밍 룰을 이용하여 메서드를 작성하면 원하는 쿼리를 실행할 수 있다.

find + (엔티티이름) + By + 변수이름

상품의 이름을 이용하여 데이터를 조회

ItemRepository.java

public interface ItemRepository extends JpaRepository<Item, Long> {

	List<Item> findByName(String itemNm); // 상품명으로 데이터 조회
}

ItemRepositoryTest.java

	public void createItemList() {
		for( int i=1; i<=10; i++) {
			Item item = new Item();
			item.setItemNm("테스트 상품" + i);
			item.setPrice(10000 + i);
			item.setItemDetail("테스트상품 상세"+ i);
			item.setItemStatus(ItemStatus.SELL);
			item.setStockNumber(100);
			item.setRegTime(LocalDateTime.now());
			item.setUpdateTime(LocalDateTime.now());
			Item savedItem = itemRepository.save(item);		
		}
	}
	
	
	@Test
	@DisplayName("상품명 조회 테스트")
	public void findByItemNmTest() {
		this.createItemList();
		List<Item> itemList = itemRepository.findByItemNm("테스트 상품1");
		for(Item item : itemList) {
			System.out.println(item.toString());
		}
	}

OR 조건처리하기

List<Item> findByItemNmOrItemDetail(String itemNm, String ItemDetail);//상품명 또는 상품상세설명을 조회

LessThan 조건처리하기

List<Item> findByPriceLessThan(Integer price);//파라미터로 넘어온 price변수보다 값이 작은 상품데이터 조회

OrderBy로 정렬 처리하기

List<Item> findByPriceLessThanOrderByPriceDesc(Integer price); //상품의 가격이 높은 순으로 조회

@Query어노테이션


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

	List<Item> findByItemNm(String itemNm); // 상품명으로 데이터 조회
	
	List<Item> findByItemNmOrItemDetail(String itemNm, String ItemDetail);//상품명 또는 상품상세설명을 조회
	
	List<Item> findByPriceLessThan(Integer price);//파라미터로 넘어온 price변수보다 값이 작은 상품데이터 조회
	
	List<Item> findByPriceLessThanOrderByPriceDesc(Integer price); //상품의 가격이 높은 순으로 조회

	@Query("select i from Item i where i.itemDetail" 
	+ " like " + 
	"%:itemDetail% order by i.price desc")
	List<Item> findByItemDetail(@Param("itemDetail") String itemDetail);


}

@Query("select i from Item i where i.itemDetail like %:itemDetail% order by i.price desc")
List findByItemDetail(@Param("itemDetail") String itemDetail)

@Query 어노테이션 안에 JPQL로 작성한 쿼리문을 넣어주는데, from 뒤에 엔티티 클래스로 작성한 item을 지정해주고, item으로부터 데이터를 select 하겠다는 의미.

파라미터에 @Param 어노테이션을 이용하여 파라미터로 넘어온 값을 JPQL에 들어갈 변수로 지정할 수있다.
현재는 itemDetail 변수를 "like % %" 사이에 ":itemDetail" 로 값이 들어가도록 작성

ItemRepositoryTest.java

 
import java.time.LocalDateTime;
import java.util.List;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;

import com.shopping.study.constant.ItemStatus;
import com.shopping.study.entity.Item;



@SpringBootTest
@TestPropertySource(locations="classpath:application-test.properties")
class ItemRepositoryTest {
	
	@Autowired
    ItemRepository itemRepository;
	
	
	@Test
    @DisplayName("상품 저장 테스트")
    public void createItemTest(){
        Item item = new Item();
        item.setItemNm("테스트 상품");
        item.setPrice(10000);
        item.setItemDetail("테스트 상품 상세 설명");
        item.setItemStatus(ItemStatus.SELL);
        item.setStockNumber(100);
        item.setRegTime(LocalDateTime.now());
        item.setUpdateTime(LocalDateTime.now());
        Item savedItem = itemRepository.save(item);
        System.out.println(savedItem.toString());
    }
	
//데이터 생성을 위해서 10개의 상품을 저장
	public void createItemList() {
		for( int i=1; i<=10; i++) {
			Item item = new Item();
			item.setItemNm("테스트 상품" + i);
			item.setPrice(10000 + i);
			item.setItemDetail("테스트상품 상세"+ i);
			item.setItemStatus(ItemStatus.SELL);
			item.setStockNumber(100);
			item.setRegTime(LocalDateTime.now());
			item.setUpdateTime(LocalDateTime.now());
			Item savedItem = itemRepository.save(item);		
		}
	}
	
	
	@Test
	@DisplayName("상품명 조회 테스트")
	public void findByItemNmTest() {
		this.createItemList();
		List<Item> itemList = itemRepository.findByItemNm("테스트 상품1");
		for(Item item : itemList) {
			System.out.println(item.toString());
		}
	}
	
	@Test
	@DisplayName("상품명, 상품상세설명 or 테스트 ")	
	public void findByItemNmOrItemDetail() {
		this.createItemList();
		List<Item> itemList = itemRepository.findByItemNmOrItemDetail("테스트 상품1", "테스트 상품 상세 설명5");
		for(Item item : itemList) {
			System.out.println(item.toString());
		}
		
	}
	
	@Test
    @DisplayName("가격 LessThan 테스트")
    public void findByPriceLessThanTest(){
        this.createItemList();
        List<Item> itemList = itemRepository.findByPriceLessThan(10005);
        for(Item item : itemList){
            System.out.println(item.toString());
        }
    }

    @Test
    @DisplayName("가격 내림차순 조회 테스트")
    public void findByPriceLessThanOrderByPriceDesc(){
        this.createItemList();
        List<Item> itemList = itemRepository.findByPriceLessThanOrderByPriceDesc(10005);
        for(Item item : itemList){
            System.out.println(item.toString());
        }
    }
    
    
    @Test
    @DisplayName("@Query를 이용한 상품조회 테스트")
    public void findByItemDetailTest() {
    	this.createItemList();
    	List<Item> itemList = itemRepository.findByItemDetail("테스트 상품 상세 설명");
    	for(Item item : itemList) {
    		System.out.println(item.toString());
    	}		
    }
}

상품 데이터 10개가 가격이 높은 슨부터 조회되는 걸 확인할 수 있다

profile
기록하기

0개의 댓글