Spring Data JPA에서는 엔티티 매니저를 직접 이용해 코드를 작성하지 않아도 되는데, 그 대신 Data Access Object 역할을 하는 Repository 인터페이스를 설계해 사용하면 된다!
먼저 com.shop 패키지 아래에 repository 패키지를 만들고 ItemRepository 인터페이스를 만들어주자.
com.shop.repository.ItemRepository.java
package com.shop.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.shop.entity.Item;
public interface ItemRepository extends JpaRepository<Item, Long> {
}
JpaRepository를 상속받는 ItemRepository.
JpaRepository는 2개의 제네릭 타입을 사용.
첫번째에는 엔티티 타입 클래스를 넣어주고, 두번째는 기본키의 타입을 넣어준다.
- 기본적인 CRUD 및 페이징 처리를 위한 메소드가 정의되어 있음.
void delete(T entity)
: 엔티티 삭제<S extends T> save(S entity)
: 엔티티 저장 및 수정count()
: 엔티티 총 개수 반환Iterable<T> findAll()
: 모든 엔티티 조회
위의 코드에서는 Item 클래스는 엔티티 타입은 Item, 기본키인 Id는 Long 타입이므로 JpaRepository<Item, Long> 으로 적어주었다.
로직이 복잡할 때 코드 수정 이후 코드가 버그 없이 제대로 동작하는지 테스트하는 것은 매우 중요!
테스트 코드도 유지보수를 해야 하기에 비용이 발생하므로, 의미 있는 테스트 케이스를 작성하고, 검사하는 로직도 만들어야 한다.
메모리에 데이터를 저장하는 인메모리 데이터베이스 기능 제공.
resources > 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
ItemRepository 인터페이스에서 Go To - Test - Create New Test
테스트를 위한 JUnit 버전을 선택할 수 있고, 테스트할 패키지와 테스트 클래스 이름을 자동으로 설정해준다.
OK 버튼을 누르면 test 폴더에 ItemRepositoryTest.java 파일이 생성된 것을 볼 수 있다. 테스트 코드는 이 클래스에 적는다!
package com.shop.repository;
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.shop.entity.Item;
import com.shop.constant.ItemSellStatus;
import java.time.LocalDateTime;
import static org.junit.jupiter.api.Assertions.*;
@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.setItemSellStatus(ItemSellStatus.SELL);
item.setStockNumber(100);
item.setRegTime(LocalDateTime.now());
item.setUpdateTime(LocalDateTime.now());
Item savedItem = itemRepository.save(item);
System.out.println(savedItem.toString());
}
}
@SpringBootTest
: 통합 테스트를 위해 스프링 부트에서 제공하는 어노테이션. 실제 애플리케이션을 구동할 때처럼 모든 Bean을 IoC 컨테이너에 등록. @TestPropertySource(locations = "classpath:application-test.properties")
: 테스트 코드 실행 시 application.properties
에 설정해둔 값과 같은 설정이 있을 때 application-test.properties
에 우선순위를 부여한다. ItemRepository itemRepository;
: @Autowired를 이용해 Bean을 주입.테스트할 메소드 run 시키기
insert query문을 따로 작성하지 않았지만 ItemRepository 인터페이스를 작성한 것만으로 상품 테이블에 데이터를 insert 했음! 테스트 성공~