[Spring Boot] 8. Spring Boot Project (Store v2)_10.Order - Save

김미숙's avatar
Mar 31, 2025
[Spring Boot] 8. Spring Boot Project (Store v2)_10.Order - Save

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

parangdajavous