Framework/Spring

Data JPA를 이용한 상품 구매 사이트 Item 엔티티 개발 예제

MINGYUM 2021. 9. 13. 03:48

개발의 편의성을 위해서 순수 JPA에서 Data JPA로 개발 방법을 옮겼다. 

* 추가 요구사항 - 카트 : 아이템 = 다 : 1 연관관계 추가하기

 

0. 개발환경 설정

 

build.gradle

compile('org.springframework.boot:spring-boot-starter-data-jpa')

 

1. Item.java 

package springstudy.spring.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "item")
@Getter @Setter
public class Item {
    @Id @GeneratedValue
    @Column(name = "item_id")
    private Long id;

    private String itemName;

    @Lob
    @Column(length = 100000)
    private byte[] itemImage;
    // byte배열로 Blob 타입의 itemImage 필드 생성


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "category_id")
    private String itemCategory;

    private String itemQuantity;

    private String itemFrom;

    private String itemIntro;

    private String itemPrice;

    private String itemDescription;

    private List<String> itemOption = new ArrayList<>();

    @OneToMany(mappedBy = "item", fetch = FetchType.LAZY)
    private List<OrderItem> orderItems = new ArrayList<>();
    // DB에 없는데, Item : Order_item 이 '1 : 다' 관계이므로 Item 클래스에 @OneToMany 어노테이션 추가
    // OrderItem DB 생성자는 OrderItem 엔티티 내부에 다음 주석과 같이 작성해야 함.

    /*
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "item_id")
    private Item item;
    */

    // Item : ItemQuestion 의 1 : 다 매핑
    @OneToMany(mappedBy = "item", fetch = FetchType.LAZY)
    private List<ItemQuestion> itemQuestions = new ArrayList<>();


    // Item과 Category_item 1 : 1 매핑, Item이 연관관계의 주인이므로 @JoinColumn 추가
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "category_id")
    private CategoryItem categoryItem;
}

객체의 기본적인 필드 정보와 타 객체와의 연관관계를 표시하였다. 

 

 

2.  ItemRepository.java

JpaRepository를 사용해 인터페이스를 만든다.  이때 인터페이스 파일은 Item.java와 같은 디렉토리에 위치하도록 한다. 

package springstudy.spring.domain;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

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

추가적으로 필요한 메소드는 인터페이스에 선언만 해놓으면 함수 명을 Jpa가 분석해 메소드를 만들어준다. 

 

아래는 JPA Repository 내장 클래스이다.

 

 

3. ItemService.java, ItemController.java

순수 JPA와 동일한 느낌으로 작성하였다.