Spring boot & JPA
Spring Boot - 쇼핑몰 프로젝트 02 (Spring Data JPA - 2)
록's
2023. 4. 3. 14:31
728x90
반응형
https://rogi221.tistory.com/167
Spring Boot - 쇼핑몰 프로젝트 02 (Spring Data JPA - 1)
JPA 1. JPA(Jave Persistence API’)는 자바 ORM 기술에 대한 API 표준 2. ORM이란 ‘Object Relational Mapping’의 약자로 객체와 관계형 데이터베이스 매핑 JPA 장점 특정 데이터베이스에 종속되지 않음 객체지향
rogi221.tistory.com
Spring Data JPA
Repository 설계
- Data Access Object의 역할을 하는 Repository 인터페이스 설계
- 첫 번째 제네릭 타입에는 엔티티 타입 클래스, 두 번째 제네릭 타입에는 클래스의 기본키 타입 세팅
// ItemRopository.java
package repository;
import entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ItemRepository extends JpaRepository<Item, Long> {
}
- 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
상품 저장 테스트
- test.java.com.shop.repository 패키지 아래에 ItemRepositoryTest.java 파일 생성
ItemRepositoryTest.java
// ItemRepositoryTest.java
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")
public class ItemRepositoryTest {
@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());
}
}
테스트 실행하면 쿼리문이
쿼리 메소드
- 쿼리 메소드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나로 Repository 인터페이스에 간단한 네이밍 룰을 이용하여 메소드를 작성하면 원하는 쿼리 실행 가능.
- 쿼리 메소드를 이용할 때 가장 많이 사용하는 문법으로 find를 사용.
- 엔티티의 이름은 생략이가능하며, By 뒤에는 검색할 때 사용할 변수의 이름을 적어준다.
쿼리 메소드를 이용한 상품 조회
// ItemRepository.java
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);
}
ItemRepositoryTest.java
// ItemRepository.java
package com.shop.repository;
... 임포트 생략 ...
import java.util.List;
@SpringBootTest
@TestPropertySource(locations="classpath:application-test.properties")
public class ItemRepositoryTest {
@Autowired
ItemRepository itemRepository;
... 생략 ...
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.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.createItemList();
List<Item> itemList = itemRepository.findByItemNm("테스트 상품1");
for(Item item : itemList){
System.out.println(item.toString());
}
}
}
결과창
쿼리 메소드 OR 조건
OR 조건 처리하기
// ItemRepository.java
public interface ItemRepository extends JpaRepository<Item, Long> {
... 생략 ...
List<Item> fondByItemNmOrItemDetail(String itemNm, String itemDetail);
}
ItemRepositoryTest.java
// ItemRepositporyTest.java
@SpringBootTest
@TestPropertySource(locations="classpath:application-test.properties")
class ItemRepositoryTest {
... 생략 ...
@Test
@DisplayName("상품명, 상품상세설명 or 테스트")
public void findByItemNmOrItemDetailTest() {
this.createItemList();
List<Item> itemList =
itemRepository.findByItemNmOrItemDetail("테스트 상품1", "테스트 상품 상세 설명5");
for(Item item : itemList) {
System.out.println(item.toString());
}
}
}
쿼리 메소드 LessThan 조건
LessThan 조건 처리하기
// ItemRepository.java
public interface ItemRepository extends JpaRepository<Item, Long> {
... 생략 ...
List<Item> findByPriceLessThan(Integer price);
}
ItemRepositoryTest.java
// ItemRepositoryTest.java
@SpringBootTest
@TestPropertySource(locations="classpath:application-test.properties")
class ItemRepositoryTest {
... 생략 ...
@Test
@DisplayName("가격 LessThan 테스트")
public void findByPriceLessThanTest(){
this.createItemList();
List<Item> itemList = itemRepository.findByPriceLessThan(10005);
for(Item item : itemList){
System.out.println(item.toString());
}
}
}
쿼리 메소드 OrderBy 조건
OrderBy로 정렬 처리하기
// ItemRepository.java
... 생략 ...
List<Item> findByPrivceLessThanOrderByPricceDesc(Integer price);
}
ItemRepositoryTest.java
// ItemRepositoryTest.java
... 생략 ...
@Test
@DisplayName("가격 내림차순 조회 테스트")
public void findByPriceLessThanOrderByPriceDesc() {
this.createItemList();
List<Item> itemList =
itemRepository.findByPrivceLessThanOrderByPricceDesc(10005);
for(Item item : itemList) {
System.out.println(item.toString());
}
}
}
https://rogi221.tistory.com/169
728x90
반응형