[Spring Boot 쇼핑몰] CRUD - User 클래스 ③ - 주문

개발자·2022년 1월 31일

Spring boot 쇼핑몰

목록 보기
10/14

드디어 구매자 장바구니 구현까지 끝냈다!!!!!!!

장바구니를 구현하였으면 장바구니를 통해 주문을 하고 그 주문을 관리하도록하여야한다!!!

따라서 이번에는 주문을 구현해보도록 하겠다..

1. Entity 설계

Order.java

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name="orders")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id; // order_id

    private String status; // 상황

    private int price; // 총 금액

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id")
    private User user;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Order_item> order_items = new ArrayList<>();

    @DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private LocalDateTime createDate; // 날짜

    public void addOrderItem(Order_item order_item){
        order_items.add(order_item);
        order_item.setOrder(this);
    }

    public static Order createOrder(User user, List<Order_item> orderItemList){
        Order order = new Order();
        order.setUser(user);
        for(Order_item order_item : orderItemList){
            order.addOrderItem(order_item);
        }
        order.setStatus("주문 완료");
        order.setCreateDate(LocalDateTime.now());
        return order;
    }

    public int getTotalPrice(){
        int totalPrice = 0;

        for(Order_item order_item : order_items){
            totalPrice += (order_item.getPrice() * order_item.getCount());
        }

        return totalPrice;
    }
}

주문

  • 한 명의 User에게 여러개의 주문내역이 존재한다.
  • 주문에는 주문내역에 포함된 여러개의 아이템이 존재한다.

OrderRepository.java

public interface OrderRepository extends JpaRepository<Order,Integer> {
    Order findByUserId(int userId);
}

Order_item.java

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
public class Order_item {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id; // Order_item_id

    private int count; // 개수

    private int price; // 금액

    @ManyToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    @JoinColumn(name = "order_id")
    private Order order; // 주문 연결

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "item_id")
    private Item item; // 아이템 연결

    public static Order_item createOrderItem(Item item, int count){

        Order_item order_item = new Order_item();
        order_item.setItem(item);
        order_item.setCount(count);
        order_item.setPrice(item.getPrice());

        return order_item;
    }
}

Order_itemRepository.java

public interface Order_itemRepository extends JpaRepository<Order_item,Integer> {
}

2. Service 설계

주문의 기능은 다음과 같다.

  • 주문 생성
  • 주문내역 추가
  • 전체 주문 조회
  • 특정 주문 조회
  • 주문 수정

OrderService.java

주문 생성

public void createOrder(User user){
        Order order = new Order();
        order.setUser(user);
        orderRepository.save(order);
    }

주문내역 추가

public void order(User user, List<Cart_item> cart_items){
        List<Order_item> order_items = new ArrayList<>(); // 주문내역에 추가할 아이템리스트

        for(Cart_item cart_item : cart_items){
            Order_item order_item = Order_item.createOrderItem(cart_item.getItem(),cart_item.getCount());
            order_items.add(order_item);
        }

        Order order = Order.createOrder(user,order_items);
        order.setPrice(order.getTotalPrice());
        orderRepository.save(order);
    }

전체 주문 조회

public List<Order> orderList(){
        return orderRepository.findAll();
    }

특정 주문 조회

public Order orderView(Integer id){
        return orderRepository.findById(id).get();
    }

주문 수정

public void orderUpdate(Integer id, Order order){
        Order tempOrder = orderRepository.findById(id).get();
        tempOrder.setStatus(order.getStatus());

        orderRepository.save(tempOrder);
    }

3. Controller 설계

주문 또한 User의 기능중 하나이므로 UserPageController 에 추가하였다.

UserPageController.java

내 주문내역 조회

@Transactional
    @GetMapping("/user/{id}/order")
    public String myOrderPage(@PathVariable("id") Integer id,Model model,@AuthenticationPrincipal PrincipalDetails principalDetails){
        // 로그인 User == 접속 User
        if(principalDetails.getUser().getId() == id){
            // User의 주문내역을 가져온다.
            User user = userPageService.findUser(id);
            List<Order> orderList = user.getOrders();

            model.addAttribute("orderList",orderList);
            model.addAttribute("user",user);

            return "/user/order";
        }else{
            return "redirect:/main";
        }
    }

4. View 단계

주문을 하게되면 다음과 같이 주문한 날짜와 주문내용의 상태를 볼수있다.

5. 마무리

구매자의 주문기능을 구현하였다!!!!

이제 해야할 일은 무엇인가?? 당연히 구매자의 주문을 판매자가 처리하는 기능을 구현하여야한다.

따라서 다음 시간에는 판매자의 판매내역을 구현하도록 하겠다 ><

0개의 댓글