티스토리 뷰
[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -5. Repository 설계하기
돔돔이 2024. 7. 7. 00:00
스프링 부트 쇼핑몰 프로젝트 with JPA 라는 책을 읽으며 정리한 내용입니다,
이미 스프링부트로는 개발을 많이 해보았으나 JPA를 공부하기 위해 이 책을 골랐습니다.
이전 포스트를 보려면 아래 링크를 클릭하세요.
[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -1. 애플리케이션 생성 및 설정하기
[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -2. Controller, DTO(lombok)
[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -3. JPA
[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -4. Entity 설계하기
이전 포스팅에서 JPA를 사용하기 위해 엔티티 매니저를 이용해 item 엔티티를 저장하는 예제 코드를 살펴보았습니다.
하지만 Spring Data JPA에서는 엔티티 매니저를 직접 이용해 코드를 작성하지 않아도 됩니다.
그 대신에 Data Access Object의 역할을 하는 Repository 인터페이스를 설계한 후 사용하는 것만으로 충분합니다.
com.shop 패키지 아래에 repository 패키지를 만든 후 ItemRepository 인터페이스를 만듭니다.
JpaRepository를 상속받는 ItemRepository를 작성합니다.
JpaRepository는 Spring Data JPA에서 제공하는 인터페이스로, JPA(Java Persistence API)를 사용하여 데이터베이스 작업을 쉽게 처리할 수 있도록 다양한 메서드를 제공하는 역할을 합니다.
이를 사용하면 기본적인 CRUD(Create, Read, Update, Delete) 작업을 구현할 필요 없이 바로 사용할 수 있습니다.
package com.shop.repository;
import com.shop.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ItemRepository extends JpaRepository<Item, Long> {
}
JpaRepository는 2개의 제네릭 타입을 사용하는데,
첫 번째에는 엔티티 타입 클래스를 넣어주고, 두 번쨰는 기본키 타입을 넣어줍니다.
제네릭 타입(Generic Type)은 Java에서 다양한 타입의 객체들을 다룰 수 있도록 하는 기능입니다. 제네릭을 사용하면 클래스나 메서드를 정의할 때 타입을 구체적으로 명시하지 않고, 인스턴스화할 때 구체적인 타입을 지정할 수 있습니다. 이를 통해 타입 안정성을 확보하면서 코드의 재사용성을 높일 수 있습니다.
JpaRepository는 두 개의 제네릭 타입을 사용하여 정의됩니다. 이 두 개의 제네릭 타입은 다음과 같습니다:
엔티티 타입 (Entity Type): 데이터베이스 테이블과 매핑되는 엔티티 클래스의 타입.
기본키 타입 (Primary Key Type): 엔티티의 기본키(Primary Key)의 타입.
예를 들어, 'Item'이라는 엔티티 클래스가 있고, 그 클래스의 기본 키가 Long 타입이라면,
JpaRepository를 다음과 같이 정의할 수 있습니다.
public interface ItemRepository extends JpaRepository<Item, Long> {
// 예시 쿼리 메소드
List<Item> findByLastName(String lastName);
}
JpaRepository<Item, Long>는 Item 엔티티에 대한 기본적인 CRUD 작업을 처리하는데 필요한 메서드를 자동으로 제공합니다. ItemRepository 인터페이스는 JpaRepository를 상속받아 Item 엔티티와 관련된 데이터베이스 작업을 처리할 수 있는 다양한 메서드를 사용할 수 있게 됩니다.
메소드 몇가지를 살펴보면, 엔티티를 저장하거나, 삭제, 엔티티 개수 출력 등의 메소드를 볼 수 있습니다.
JpaRepository에서 지원하는 메소드 | 기능 |
<S extends T> save(S entity) | 엔티티 저장 및 수정 |
void delete(T entity) | 엔티티 삭제 |
count() | 엔티티 총 개수 반환 |
Iterable<T> findAll() | 모든 엔티티 조회 |
이 예제코드가 정상적으로 동작하는지 확인하기 위해 테스트할 수 있는 테스트 코드를 작성하면서 진행하도록 하겠습니다.
테스트 환경의 경우 h2 데이터베이스를 사용하도록 reousrces 아래에 application-test.properties 파일을 만들겠습니다.
h2데이터베이스는 메모리에 데이터를 저장하는 인메모리 데이터베이스 기능을 제공합니다. 애플리케이션이 종료되면 데이터베이스에 저장된 데이터가 삭제됩니다.
또한, 가볍고 빠르기 때문에 개발할 때 테스트용 데이터베이스로 많이 사용됩니다.
h2 데이터베이스 설치 및 사용방법에 대해서는 아래 포스팅을 참고해주세요.
[H2 Database] Mac에 H2Database 설치하는 방법
https://domdom.tistory.com/681
resources 폴더에서 마우스 오른쪽버튼을 눌러 New > File을 선택해 application-test.properties 파일을 생성해줍니다.
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
spring.jpa.hibernate.ddl-auto=create
이제 테스트코드를 작성하기 위해 ItemRepository 인터페이스에서 마우스오른쪽 버튼을 눌러 GoTo > Test 를 클릭하고,
[Create New Test]를 선택해주세요.
테스트를 위한 Junit 버전을 선택할 수 있으며, 테스트할 패키지와 테스트 클래스 잉름을 자동으로 설정해줍니다.
OK 버튼을 누르면 test 폴더에
com.shop.repository.ItemRepositoryTest 파일이 생성된 것을 볼 수 있습니다.
테스트 코드에 아래와 같이 입력해줍니다.
// 통합테스트를 위해 스프링부트에서 제공하는 어노테이션
@SpringBootTest
// 테스트 코드 실행시 application-test.properties에 더 높은 우선순위를 부여합니다.
@TestPropertySource(locations="classpath:application-test.properties")
class ItemRepositoryTest {
// ItemRepository를 사용하기 위해서 @Autowired 어노테이션을 사용하여 Bean을 주입합니다.
@Autowired
ItemRepository itemRepository;
// 테스트할 메소드 위에 선언하여 해당 메소드를 테스트 대상으로 지정합니다.
@Test
// Unit5에 추가된 어노테이션으로, 테스트코드 실행 시 테스트명이 노출됩니다.
@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 saveItem = itemRepository.save(item);
System.out.println(saveItem.toString());
}
}
테스트할 메소드에서 마우스 오른쪽 버튼을 눌러 Run 'createItemTest()'를 실행해봅니다.
단축키는 Ctrl + Shift + F10 입니다.
테스트코드가 동작하면서 insert문이 실행된 것을 로그에서 확인할 수 있습니다.
다음 포스팅을 읽으려면 아래 링크를 눌러주세요.
[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -6. Query