✔️ [참고한 책] 백견불여일타 스프링 부트 쇼핑몰 프로젝트 with JPA
JPA는 ORM 기술의 표준 명세로 자바에서 제공하는 API입니다.
JPA 인터페이스를 구현한 대표적인 오픈소스가 Hibernate입니다.
엔티티란 데이터베이스의 테이블에 대응하는 클래스라고 생각하면 됩니다.
클래스 자체나 생성한 인스턴스도 엔티티라고 부릅니다.
엔티티 매니저 팩토리는 엔티티 매니저 인스턴스를 관리하는 주체입니다.
애플리케이션 실행시 한개만 만들어지며
사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티매니저를 생성합니다.
엔티티 매니저는 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공합니다.
내부적으로 데이터베이스 커넥션을 사용해서 데이터베이스에 접근합니다.
[엔티티 매니저의 메소드]
1. find() : 영속성 컨텍스트에서 엔티티를 검색하고 영속성 컨텍스트에 없을 경우 데이터베이스에서 데이터를 찾아 영속성 컨텍스트에 저장합니다.
2. persist() : 엔티티를 영속성 컨텍스트에 저장합니다.
3. remove() : 엔티티 클래스를 영속성 컨텍스트에서 삭제합니다.
4. flush() : 영속성 컨텍스트에 저장된 내용을 데이터베이스에 반영합니다.
생명주기 | 내용 |
---|---|
비영속(new) | new 키워드를 통해 생성된 상태로 영속성 컨텍스트와 관련이 없는 상태 |
영속(managed) | - 엔티티가 영속성 컨텍스트에 저장된 상태로 영속성 컨텍스트에 의해 관리되는 상태 |
- 영속 상태에서 데이터베이스에 저장되지 않으며, 트랜잭션 커밋 시점에 데이터베이스에 반영 | |
준영속 상태(detached) | 영속성 컨텍스트에 엔티티가 저장되었다가 분리된 상태 |
삭제 상태(removed) | 영속성 컨텍스트와 데이터베이스에서 삭제된 상태 |
constant 패키지와 entity 패키지를 만든 후 코드를 작성했습니다.
public enum ItemSellStatus {
SELL, SOLD_OUT
}
@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; //수정 시간
}
import com.example.shop.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ItemRepository extends JpaRepository<Item, Long> {
}
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
@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());
}
}
import java.util.List;
public interface ItemRepository extends JpaRepository<Item, Long> {
List<Item> findByItemNm(String itemNm);
}
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());
}
}