[스프링부트] 16. Storev2 : 주문 기능

문정준's avatar
Mar 28, 2025
[스프링부트] 16. Storev2 : 주문 기능
✏️

상품 조회, 주문 등은 로그인 한 유저만 열람 가능해야 함

  • session에 유저의 정보 저장 (HttpSession session)
 

1. 주문내역 전체 조회

Codes
OrderController
@GetMapping("/order/list") public String orderList(HttpServletRequest request, HttpSession session) { // TODO : 유저 정보 확인하기 (세션 : 부가 로직) User validatedUser = (User) session.getAttribute("sessionUser"); if (validatedUser == null) throw new RuntimeException("로그인 세션이 만료되었습니다. 다시 로그인해 주세요."); // TODO : 주문 내역 id 역순으로 받아서 model(request)에 담아서 보내기 List<OrderResponse.OrderDTO> orderList = orderService.주문내역(); request.setAttribute("models", orderList); return "order/list"; }
OrderService
public List<OrderResponse.OrderDTO> 주문내역() { return orderRepository.findAllOrders(); }
OrderRepository
public List<OrderResponse.OrderDTO> findAllOrders() { 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 q = em.createNativeQuery(sql); List<Object[]> orderList = q.getResultList(); List<OrderResponse.OrderDTO> orderDTOList = new ArrayList<>(); for(Object[] o : orderList) { OrderResponse.OrderDTO dto = new OrderResponse.OrderDTO( ((Number) o[0]).intValue(), (String) o[1], ((Number) o[2]).intValue(), ((Number) o[3]).intValue() ); orderDTOList.add(dto); } return orderDTOList; }
OrderResponse
@AllArgsConstructor @Data public static class OrderDTO { private Integer id; private String name; private Integer qty; private Integer totalPrice; }
Form
{{> layout/header}} <div class="container mt-2"> <div class="mt-4 p-5 bg-light text-dark rounded-4"> <h1>구매목록 페이지</h1> <hr> <table class="mt-4 table table-hover"> <thead> <tr> <th>주문번호</th> <th>상품명</th> <th>구매개수</th> <th>총 가격</th> </tr> </thead> <tbody> {{#models}} <tr> <td>{{id}}</td> <td>{{name}}</td> <td>{{qty}}개</td> <td>{{totalPrice}}원</td> </tr> {{/models}} </tbody> </table> </div> </div> </body> </html>
notion image

2. 상품 주문

Codes
OrderController
// TODO : order @PostMapping("/order/save") public String order(@RequestParam int storeId, @RequestParam int qty, HttpSession session) { // TODO : 유저 정보 확인하기 (세션 : 부가 로직) User validatedUser = (User) session.getAttribute("sessionUser"); if (validatedUser == null) throw new RuntimeException("로그인 세션이 만료되었습니다. 다시 로그인해 주세요."); orderService.상품주문(storeId, qty, validatedUser.getId()); return "redirect:/order/list"; }
OrderService
@Transactional public void 상품주문(int storeId, int qty, int userId) { // 1. 상품 조회 Store product = storeRepository.findDetailByID(storeId); // 1-1. 상품의 남은 재고가 qty보다 작을 경우 break if(product.getStock() < qty) throw new RuntimeException("재고가 부족합니다."); // 2. 계산 int remainStock = product.getStock() - qty; int totalPrice = product.getPrice() * qty; // 3. 구매 orderRepository.updateStock(storeId, remainStock); orderRepository.saveOrder(storeId, userId, qty, totalPrice); }
OrderRepository
public void saveOrder(int storeId, int userId, int qty, int totalPrice) { Query q = em.createNativeQuery("insert into order_tb(store_id, user_id, qty, total_price) values(?, ?, ?, ?);"); q.setParameter(1, storeId); q.setParameter(2, userId); q.setParameter(3, qty); q.setParameter(4, totalPrice); q.executeUpdate(); } public void updateStock(int storeId, int stock) { Query q = em.createNativeQuery("update store_tb set stock = ? where id = ?;"); q.setParameter(1, stock); q.setParameter(2, storeId); q.executeUpdate(); }
notion image
notion image
notion image
notion image
 
Share article

sxias