티스토리 뷰

728x90
반응형


스프링 부트 쇼핑몰 프로젝트 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

 

[H2 Database] Mac에 H2Database 설치하는 방법

h2 database download URL입니다. https://www.h2database.com/html/download.html Downloads Downloads Version 2.2.224 (2023-09-17) Windows Installer (SHA1 checksum: 1e4cda116519e8f95cac8298b1a4d7cbd50073ec) Platform-Independent Zip (SHA1 checksum: 8de40da72

domdom.tistory.com

 

 

 

 

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

 

 

728x90

 

이제 테스트코드를 작성하기 위해 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

 

[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -6. Query

스프링 부트 쇼핑몰 프로젝트 with JPA 라는 책을 읽으며 정리한 내용입니다, 이미 스프링부트로는 개발을 많이 해보았으나 JPA를 공부하기 위해 이 책을 골랐습니다.     이전

domdom.tistory.com

 

728x90
반응형
댓글