[스프링 부트와 JPA 활용 1] 4. 상품 도메인 개발

2024. 1. 23. 15:20·인프런 Spring 강의 정리/실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
728x90
반응형

📌 상품 도메인 개발

✔ 구현 기능

  • 상품 등록
  • 상품 목록 조회
  • 상품 수정

✔ 순서

  • 상품 엔티티 개발(비즈니스 로직 추가)
  • 상품 리포지토리 개발
  • 상품 서비스 개발
  • 상품 기능 테스트

 

 

📌 상품 엔티티 개발(비즈니스 로직 추가)

상품 엔티티 코드

🔶 main/.../domain/Item

package jpabook.jpashop.domain.item;
 import jpabook.jpashop.exception.NotEnoughStockException;
 import lombok.Getter;
 import lombok.Setter;
 import jpabook.jpashop.domain.Category;
 import javax.persistence.*;
 import java.util.ArrayList;
 import java.util.List;
 @Entity
 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
 @DiscriminatorColumn(name = "dtype")
 @Getter @Setter
 public abstract class Item {
  @Id @GeneratedValue
     @Column(name = "item_id")
     private Long id;
     private String name;
     private int price;
     private int stockQuantity;
     @ManyToMany(mappedBy = "items")
     private List<Category> categories = new ArrayList<Category>();
//==비즈니스 로직==//
public void addStock(int quantity) {
         this.stockQuantity += quantity;
     }
     public void removeStock(int quantity) {
         int restStock = this.stockQuantity - quantity;
         if (restStock < 0) {
             throw new NotEnoughStockException("need more stock");
         }
         this.stockQuantity = restStock;
     }
}

 

 

  • 예외 코드
    package jpabook.jpashop.exception;
    public class NotEnoughStockException extends RuntimeException {
       public NotEnoughStockException() {
       }
       public NotEnoughStockException(String message) {
           super(message);
    }
       public NotEnoughStockException(String message, Throwable cause) {
           super(message, cause);
    }
    public NotEnoughStockException(Throwable cause) {
           super(cause);
    } }

✔ 비지니스 로직 분석

  • addStock() 메서드는 파라미터로 넘어온 수만큼 재고를 늘림
    • 이 메서드는 재고가 증가하거나 상품 주문을 취소해서 다시 재고를 늘려야 할 때 사용
  • removeStock() 메서드는 파라미터로 넘어온 수만큼 재고 감소
    • 만약 재고가 부족하면 예외가 발생
    • 주로 상품 주문 시 사용

 

 

📌 상품 리포지토리 개발

🔶 main/.../repository/ItemRepository 

package jpabook.jpashop.repository;

import jakarta.persistence.EntityManager;
import jpabook.jpashop.domain.item.Item;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@RequiredArgsConstructor
public class ItemRepository {

    private final EntityManager em;

    public void save(Item item){
        if(item.getId()==null){
            em.persist(item);
        }
        else{
            em.merge(item);
        }
    }

    public Item findOne(Long id){
        return em.find(Item.class, id);
    }

    public List<Item> findAll(){
        return em.createQuery("select i from Item i", Item.class).getResultList();
    }


}

✔ 기능 설명

  • save()
    • id 가 없으면 신규로 보고 persist() 실행
    • id가 있으면 이미 데이터베이스에 저장된 엔티티를 수정한다고 보고, merge() 실행

 

 

 

📌 상품 서비스 개발

상품 서비스 코드

🔶 main/.../service/ItemService 

package jpabook.jpashop.service;

import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.repository.ItemRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class ItemService {

    private final ItemRepository itemRepository;

    @Transactional
    public void saveItem(Item item){
        itemRepository.save(item);
    }

    public List<Item> findItems(){
        return itemRepository.findAll();
    }

    public Item findOne(Long itemId){
        return itemRepository.findOne(itemId);
    }
}
  • 상품 서비스는 상품 리포지토리에 단순히 위임만 하는 클래스
  • 상품 기능 테스트는 회원 테스트와 비슷하므로 생략함

 

 

 

<실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발_김영한>을 수강하고 작성한 글입니다

 

 

 

 

 


PREV

 

[스프링 부트와 JPA 활용 1] 3. 애플리케이션 구현 준비, 회원 도메인 개발

📌 구현 요구사항 회원 기능 회원 등록 회원 조회 상품 기능 상품 등록 상품 수정 상품 조회 주문 기능 -상품 주문 -주문 내역 조회 -주문 취소 ✔ 예제를 단순화하기 위해 다음 기능은 구현하지

nyeroni.tistory.com

NEXT

 

[스프링 부트와 JPA 활용 1] 5. 주문 도메인 개발

📌 구현 기능 및 순서 ✔ 구현 기능 상품 주문 주문 내역 조회 주문 취소 ✔ 순서 주문 엔티티 , 주문 상품 엔티티 개발 주문 리포지토리 개발 주문 서비스 개발 주문 검색 기능 개발 주문 기능

nyeroni.tistory.com

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'인프런 Spring 강의 정리 > 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 카테고리의 다른 글

[스프링 부트와 JPA 활용 1] 6. 웹 계층 개발  (1) 2024.01.24
[스프링 부트와 JPA 활용 1] 5. 주문 도메인 개발  (0) 2024.01.24
[스프링 부트와 JPA 활용 1] 3. 애플리케이션 구현 준비, 회원 도메인 개발  (0) 2024.01.23
[스프링 부트와 JPA 활용1] 2. 도메인 분석 설계  (4) 2024.01.23
[스프링 부트와 JPA 활용 1] 1. 프로젝트 환경 설정  (1) 2024.01.23
'인프런 Spring 강의 정리/실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 카테고리의 다른 글
  • [스프링 부트와 JPA 활용 1] 6. 웹 계층 개발
  • [스프링 부트와 JPA 활용 1] 5. 주문 도메인 개발
  • [스프링 부트와 JPA 활용 1] 3. 애플리케이션 구현 준비, 회원 도메인 개발
  • [스프링 부트와 JPA 활용1] 2. 도메인 분석 설계
예롱메롱
예롱메롱
  • 예롱메롱
    예롱이의 개발 블로그
    예롱메롱
  • 전체
    오늘
    어제
    • 전체보기 (274)
      • 프로젝트 (35)
        • Wedle (12)
        • 인스타그램 클론 코딩 (13)
        • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (10)
      • 인프런 Spring 강의 정리 (79)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (7)
        • Spring 핵심 원리 - 기본편 (9)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 (8)
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편 (11)
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리.. (6)
        • 실전! 스프링 부트와 JPA 활용2 - API 개.. (5)
        • 실전! 스프링 데이터 JPA (7)
        • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (7)
        • 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 (11)
        • 실전! Querydsl (8)
      • Cloud (3)
      • Spring (6)
        • spring boot (5)
        • 소셜로그인 (1)
      • Docker (2)
      • DevOps (0)
      • Coding Test (114)
        • Programmers (37)
        • Baekjoon (76)
      • KB It's Your Life 6기 (1)
      • CS (18)
        • 알고리즘 (13)
        • 컴퓨터 구조 (1)
        • Operating System (0)
        • Network (0)
        • Database (4)
      • git (1)
      • Language (15)
        • Java (5)
        • C++ (6)
        • Python (4)
    • GITHUB GITHUB
    • INSTAGRAM INSTAGRAM
  • hELLO· Designed By정상우.v4.10.3
예롱메롱
[스프링 부트와 JPA 활용 1] 4. 상품 도메인 개발
상단으로

티스토리툴바