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>

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();
}




Share article