쿼리 메소드

JinKyung·2023년 3월 22일
0

SpringBoot 쇼핑몰

목록 보기
4/12

쿼리 메소드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나.
Repository 인터페이스에 간단한 네이밍 룰을 이용해 메소드를 작성하면 원하는 쿼리 작성 가능!

쿼리 메소드 이용시 가장 많이 사용하는 문법으로 find 사용.

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

엔티티 이름은 생략 가능, By 뒤에는 검색할 때 사용할 변수의 이름 적어주기


itemNm(상품명)으로 데이터를 조회하기 위해 By 뒤에 필드명인 ItemNm을 메소드의 이름에 붙여준다. 매개변수로는 검색할 때 사용할 상품명 변수 넘겨주기.

com.shop.respository.ItemRepository.java

List<Item> findByItemNm(String itemNm);

상품명을 조회하기 위한 테스트 코드 작성 com.shop.respository.ItemRespositoryTest.java
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"이 지정된 것을 볼 수 있다!


💡 여러 개의 조건을 이용해 상품을 검색하거나 정렬해야 하는 경우, 키워드와 변수 이름을 메소드명으로 이어서 나열하면 됩니다.

OR 조건 처리하기

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개의 상품 출력되는 것 확인!


LessThan 조건 처리하기

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개의 상품이 출력되는 것을 볼 수 있다.


OrderBy로 정렬하기

현재는 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());
        }
    }


내림차순 정렬 성공~

0개의 댓글