본문 바로가기

BackEnd/Spring Boot

[스프링 부트 쇼핑몰 프로젝트 with JPA] Spring Data JPA 2(Repository 설계, 쿼리 메소드)

728x90
반응형

https://bobo12.tistory.com/328

 

4. Repository 설계

   ▷ Data Access Object의 역할을 하는 Repository 인터페이스 설계
   ▷ 첫 번째 제네릭 타입에는 엔티티 타입 클래스, 두 번째 제네릭 타입에는 클래스의 기본키 타입 세팅

 

◎ ItemRepository.java 인터페이스 생성


package com.shop.repository;

import com.shop.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ItemRepository extends JpaRepository<Item, Long> {
}​

 

◎ JpaRepository에서 지원하는 메소드

   ▷ JpaRepository는 기본적인 CRUD 및 페이징 처리를 위한 메소드가 정의돼 있음

 

◎ application-test.properties 생성

 

# Datasource 설정
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.username=sa
spring.datasource.password=

# H2 데이터베이스 방언 설정
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

 

 

◎ ItemRepositoryTest 클래스 생성 (repository 패키지 생성)

 

package com.shop.repository;

import com.shop.constant.ItemSellStatus;
import com.shop.entity.Item;
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 java.time.LocalDateTime;

@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
class ItemRepositoryTests {

    @Autowired
    ItemRepository itemRepository;

    @Test
    @DisplayName("상품 저장 테스트")
    public void createItemTest() {
        Item item = new Item();
        item.setItemNm("테스트 상품");
        item.setPrice(10000);
        item.setItemDetail("테스트 상품 상세 설명");
        item.setItemSellStatus(ItemSellStatus.SELL);
        item.setStockNumber(100);
        item.setRegTime(LocalDateTime.now());
        item.setUpdateTime(LocalDateTime.now());
        Item savedItem = itemRepository.save(item);
        System.out.println(savedItem.toString());
    }
}


테스트 코드가 실행되면서 콘솔창에 실행되는 쿼리문을 볼 수 있음

 

 

5. 쿼리 메소드

   ▷ 쿼리 메소드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나로

       Repository 인터페이스에 간단한 네이밍 룰을 이용하여 메소드를 작성하면 원하는 쿼리 실행 가능
   ▷ 쿼리 메소드를 이용할 때 가장 많이 사용하는 문법으로 find를 사용
   ▷ 엔티티의 이름은 생략이가능하며, By 뒤에는 검색할 때 사용할 변수의 이름을 적어줌

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

 

 

◎ ItemRepository에 findByItemNm 메소드 추가(상품 이름 이용하여 데이터 조회)

package com.shop.repository;

import com.shop.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ItemRepository extends JpaRepository<Item, Long> {
    List<Item> findByItemNm(String itemNm);
}

 

 

◎ ItemRepositoryTests 클래스에 메소드 추가

...(생략)...
	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 findByItemNmTest() {
        this.createItemTest();
        List<Item> itemList = itemRepository.findByItemNm("테스트 상품1");
        for (Item item : itemList){
            System.out.println(item.toString());
        }
    }
}


▷ 실행하면 아래와 같은 화면이 나타날 수 있는 것을 볼 수 있습니다.


where 조건문에는 item_nm이 조건으로 걸려있으며 binding parameter로 "테스트 상품1"이 지정됨

 

 

◎ 쿼리 메소드 Sample 및 JPQL snippet

 

 

◎ 쿼리 메소드 OR 조건 처리하기 예제

1. ItemRepository 인터페이스 메소드 추가
public interface ItemRepository extends JpaRepository<Item, Long> {

	...(생략)...

    List<Item> findByItemNmOrItemDetail(String itemNm, String itemDetail);
}​


2. ItemRepositoryTest 클래스 메소드 추가
...(생략)...
	@Test
    @DisplayName("상품명, 상품상세설명 or 테스트")
    public void findByItemNmOrItemDetailTest() {
        this.createItemTest();
        List<Item> itemList =
                itemRepository.findByItemNmOrItemDetail("테스트 상품1", "테스트 상품 상세 설명5");
        for (Item item : itemList){
            System.out.println(item.toString());
        }
    }
}​


아래와 같이 콘솔창에 테스트 상품1, 테스트 상품 상세 설명5 출력

 

 

◎ 쿼리 메소드 LessThan 조건 처리하기 예제

1. ItemRepository 인터페이스 메소드 추가
public interface ItemRepository extends JpaRepository<Item, Long> {

	...(생략)...

    List<Item> findByPriceLessThan(Integer price);
}​

 

2. ItemRepositoryTest 클래스 메소드 추가
...(생략)...
	@Test
    @DisplayName("가격 LessThan 테스트")
    public void findByPriceLessThanTest() {
        this.createItemTest();
        List<Item> itemList =
                itemRepository.findByPriceLessThan(10005);
        for (Item item : itemList){
            System.out.println(item.toString());
        }
    }
}​



아래와 같이 콘솔창에 가격이 10005보다 작은 4개의 상품 출력

 

◎ OrderBy 정렬

1. ItemRepository 인터페이스 메소드 추가
public interface ItemRepository extends JpaRepository<Item, Long> {

	...(생략)...

    List<Item> findByPriceLessThanOrderByPriceDesc(Integer price);
}​


2. ItemRepositoryTest 클래스 메소드 추가
...(생략)...
	@Test
    @DisplayName("가격 내림차순 조회 테스트")
    public void findByPriceLessThanOrderByPriceDesc() {
        this.createItemTest();
        List<Item> itemList = itemRepository.findByPriceLessThanOrderByPriceDesc(10005);
        for (Item item : itemList){
            System.out.println(item.toString());
        }
    }
}​


아래와 같이 콘솔창에 가격이 10005보다 작은 4개의 상품이 가격이 높은 순으로 출력

 

Data Access Object의 역할을 하는 Repository 인터페이스 설계를 진행했습니다.

 

Repository는 데이터베이스에 값들을 저장하기 위한 저장소 같은 역할이었습니다.

 

인터페이스, Dto 클래스, properties, 테스트 클래스 등을 이용해서 데이터베이스의 값들을 연동할 수 있었습니다.

 

테이블에 값을 넣고 조회하고 출력까지 할 수 있네요!!

 

내장 함수를 이용하니 훨씬 편하게 구현할 수 있는데요, 스프링 부트를 잘 이용하려면 내장 함수들을 잘 이용해야겠어요!!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

 

728x90
반응형