[Spring Boot] 쇼핑몰 프로젝트 (2)

YulHee Kim·2021년 11월 23일
0
post-thumbnail

✔️ [참고한 책] 백견불여일타 스프링 부트 쇼핑몰 프로젝트 with JPA

✏️ JPA 동작 방식

JPA는 ORM 기술의 표준 명세로 자바에서 제공하는 API입니다.
JPA 인터페이스를 구현한 대표적인 오픈소스가 Hibernate입니다.

✔️ 엔티티

엔티티란 데이터베이스의 테이블에 대응하는 클래스라고 생각하면 됩니다.
클래스 자체나 생성한 인스턴스도 엔티티라고 부릅니다.

✔️ 엔티티 매니저 팩토리

엔티티 매니저 팩토리는 엔티티 매니저 인스턴스를 관리하는 주체입니다.
애플리케이션 실행시 한개만 만들어지며
사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티매니저를 생성합니다.

✔️ 엔티티 매니저

엔티티 매니저는 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공합니다.
내부적으로 데이터베이스 커넥션을 사용해서 데이터베이스에 접근합니다.
[엔티티 매니저의 메소드]

1. find() : 영속성 컨텍스트에서 엔티티를 검색하고 영속성 컨텍스트에 없을 경우 데이터베이스에서 데이터를 찾아 영속성 컨텍스트에 저장합니다.
2. persist() : 엔티티를 영속성 컨텍스트에 저장합니다.
3. remove() : 엔티티 클래스를 영속성 컨텍스트에서 삭제합니다.
4. flush() : 영속성 컨텍스트에 저장된 내용을 데이터베이스에 반영합니다.

✔️ 엔티티 생명주기

생명주기내용
비영속(new)new 키워드를 통해 생성된 상태로 영속성 컨텍스트와 관련이 없는 상태
영속(managed)- 엔티티가 영속성 컨텍스트에 저장된 상태로 영속성 컨텍스트에 의해 관리되는 상태
- 영속 상태에서 데이터베이스에 저장되지 않으며, 트랜잭션 커밋 시점에 데이터베이스에 반영
준영속 상태(detached)영속성 컨텍스트에 엔티티가 저장되었다가 분리된 상태
삭제 상태(removed)영속성 컨텍스트와 데이터베이스에서 삭제된 상태

✏️ 상품 엔티티 설계하기

constant 패키지와 entity 패키지를 만든 후 코드를 작성했습니다.

constant.ItemSellStatus.java

public enum ItemSellStatus {
    SELL, SOLD_OUT
}

entity.Item.java

@Entity
@Table(name="item")
@Getter
@Setter
@ToString
public class Item {

    @Id
    @Column(name="item_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false, length = 50)
    private String itemNm; //상품명

    @Column(nullable = false, name="price")
    private int price; //가격

    @Column(nullable = false)
    private int stockNumber; //재고수량

    @Lob
    @Column(nullable = false)
    private String itemDetail; //상품 상세 설명

    @Enumerated(EnumType.STRING)
    private ItemSellStatus itemSellStatus; //상품 판매 상태

    private LocalDateTime regTime; //등록 시간

    private LocalDateTime updateTime; //수정 시간
}

✏️ Repository 설계하기

ItemRepository.java

import com.example.shop.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ItemRepository extends JpaRepository<Item, Long> {
}

application-test.properties

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.username=sa
spring.datasource.password=

spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

ItemRepositoryTest.java

@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());

    }

}

✏️ 쿼리 메소드

ItemRepository.java


import java.util.List;

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

ItemRepositoryTest.java

    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());
        }
    }

profile
백엔드 개발자

0개의 댓글