Store
package com.metacoding.storev2.store;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Getter
@Table(name = "store_tb")
@Entity
public class Store {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer stock;
private Integer price;
public void 재고감소(int qty){
this.stock = this.stock - qty;
}
}
OrderController
package com.metacoding.storev2.order;
import com.metacoding.storev2.user.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@RequiredArgsConstructor
@Controller
public class OrderController {
private final OrderService orderService;
private final HttpSession session;
@GetMapping("/order/list")
public String orderList(HttpServletRequest request) {
List<OrderResponse.OrderListPage> OrderListPage = orderService.구매목록();
request.setAttribute("models", OrderListPage);
return "order/list";
}
@PostMapping("order/save")
public String save(@RequestParam("storeId") int storeId, @RequestParam("qty") int qty) {
orderService.구매(storeId,qty);
return "redirect:/order/list";
}
}
OrderService
package com.metacoding.storev2.order;
import com.metacoding.storev2.store.Store;
import com.metacoding.storev2.store.StoreRepository;
import com.metacoding.storev2.store.StoreRequest;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@RequiredArgsConstructor
@Service
public class OrderService {
private final OrderRepository orderRepository;
private final StoreRepository storeRepository;
public List<OrderResponse.OrderListPage> 구매목록() {
return orderRepository.findAllJoinStore();
}
@Transactional
public void 구매(int storeId, int qty) {
// 재고조회
Store store = storeRepository.findById(storeId);
// 업데이트
store.재고감소(qty);
storeRepository.update(store.getId(),store.getName(),store.getStock(),store.getPrice());
// 구매기록
orderRepository.save(storeId,qty,qty*store.getPrice());
}
}
OrderRepository
package com.metacoding.storev2.order;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
@RequiredArgsConstructor
@Repository
public class OrderRepository {
private final EntityManager em;
public List<OrderResponse.OrderListPage> findAllJoinStore() {
List<OrderResponse.OrderListPage> orderListPages = new ArrayList<>();
String sql = "select ot.id, st.name, ot.qty, ot.total_price from order_tb ot inner join store_tb st on ot.store_id=st.id order by ot.id desc";
Query query = em.createNativeQuery(sql);
List<Object[]> objList = (List<Object[]>) query.getResultList();
for (Object[] obj : objList) {
OrderResponse.OrderListPage olp = new OrderResponse.OrderListPage(
(Integer) obj[0],
(String) obj[1],
(Integer) obj[2],
(Integer) obj[3]
);
orderListPages.add(olp);
}
return orderListPages;
}
public void save(int storeId, int qty, int totalPrice) {
Query query = em.createNativeQuery("insert into order_tb(store_id,qty,total_price) values(?,?,?)");
query.setParameter(1, storeId);
query.setParameter(2, qty);
query.setParameter(3, totalPrice);
query.executeUpdate();
}
}
detail
{{> layout/header}}
<div class="container mt-2">
<div class="mt-4 p-5 bg-light text-dark rounded-4">
<p>번호 : {{model.id}}</p>
<p>상품명 : {{model.name}}</p>
<p>상품가격 : {{model.price}}</p>
<p>상품재고 : {{model.stock}}</p>
</div>
<div class="mt-3 mb-3">
<a href="/store/{{model.id}}/update-form" class="btn btn-outline-primary">수정</a>
<form action="/store/{{model.id}}/delete" method="POST" class="d-inline">
<button type="submit" class="btn btn-outline-primary">삭제</button>
</form>
</div>
<div class="mt-4 p-5 bg-light text-dark rounded-4">
<form action="/order/save" method="post">
<input type="hidden" value="{{model.id}}" name="storeId">
<input type="text" placeholder="개수를 입력하세요" name="qty">
<button type="submit" class="btn btn-outline-primary">구매</button>
</form>
</div>
</div>
</body>
</html>
Share article