7.springBoot/1)개념_springBoot

springBoot_개념_Day_14

구이제이 2024. 4. 15. 20:05

 

ㅡㅡㅡ




●1.

 

 

#





#

파일만들기

 












●2.페이징처리

 

 






●3.상품상세페이지





#OrderItem(entity) 

 

 

#Order(entity)

 

#OrderStatus(constant)

 

●4

 

Item과 Order OrderItem

 

#Order

package com.cshop.entity;

 

import lombok.Getter;

import lombok.Setter;

import jakarta.persistence.*;

import java.time.LocalDateTime;

import com.cshop.constant.OrderStatus;

import java.util.ArrayList;

import java.util.List;

 

@Entity

@Table(name = "orders") //테이블이름 설정

@Getter @Setter

public class Order extends BaseEntity {

 

   @Id

   @GeneratedValue(strategy = GenerationType.AUTO)

   @Column(name = "order_id")

   private Long id;

 

   //관계 매핑, 다대 일의 관계, 지연로딩(데이터를 가져오는 방식 중 하나),

   //fetch : 데이터를 가져오는 방식

   //지연로딩 : 사용시점에 쿼리문이 실행

   //즉시로딩 :

   @ManyToOne(fetch = FetchType.LAZY)

   @JoinColumn(name = "member_id") //연결 컬럼

   private Member member; //참조 테이블

 

   private LocalDateTime orderDate;    //주문일

 

   @Enumerated(EnumType.STRING)    //이넘타입의 스트링 타입

   private OrderStatus orderStatus;

 

   // @OneToMany : 일대다

   //mappedBy : "order" 에 맵핑한다.

   //cascade : 부모 엔티티에 대한 모든 변경이 자식 엔티티에 적용 (연속된 처리)

   //orphanRemoval : 고아 제거(참조되지 않는 자식 엔티티들을 자동으로 삭제할지 여부를 설정) true면 자동삭제, false면 자동삭제 안됨

   @OneToMany(mappedBy = "order", cascade = CascadeType.ALL

           , orphanRemoval = true,

           fetch = FetchType.LAZY)

   private List<OrderItem> orderItems = new ArrayList<>();

   // OrderItem과 order

 

   //주문 상품 정보를 담아 놓음

   public void addOrderItem(OrderItem orderItem) {

       orderItems.add(orderItem);

       orderItem.setOrder(this);

       //Order엔티티와 OrderItem 엔티티가 단방향*2 (양방향 참조 관계) 이므로

       //orderItem 객체에도 order 객체를 설정

       //this order엔티티하고 item은

 

   }

 

   //static으로 바로 사용 할 수 있도록 설정

   //Member와, orderItemList의 정보를 입력받아서 order에 추가하고 있습니다.

   public static Order createOrder(Member member, List<OrderItem> orderItemList) {

       Order order = new Order();

       order.setMember(member); // 상품을 주문한 회원의 정보 설정

 

       for(OrderItem orderItem : orderItemList) {

           order.addOrderItem(orderItem);

       }

 

       order.setOrderStatus(OrderStatus.ORDER); //주문상태를 ORDER로 설정

       order.setOrderDate(LocalDateTime.now()); //현재 주문 시간으로 설정

       return order;

   }

   //넘겨 받은 것을 order에 추가하고 있습니다.

 

   public int getTotalPrice() { // 주문 총 금액 구하기

       int totalPrice = 0;

       for(OrderItem orderItem : orderItems){

           totalPrice += orderItem.getTotalPrice();

       }

       return totalPrice;

   }

 

   public void cancelOrder() { //주문 취소

       this.orderStatus = OrderStatus.CANCEL;

       for (OrderItem orderItem : orderItems) {

           orderItem.cancel();

       }

   }

 

}




#OrderItem

package com.cshop.entity;

 

import com.cshop.entity.BaseEntity;

import com.cshop.entity.Item;

import lombok.Getter;

import lombok.Setter;

import jakarta.persistence.*;

 

@Entity //테이블과 매핑시킴

@Getter

@Setter

public class OrderItem extends BaseEntity { //BaseEntity : 날짜 시간 처리

 

   @Id //프라이머리키로 사용한다.

 //  @GeneratedValue // 기본값을 알아서 처리하게 한다.

   @GeneratedValue(strategy = GenerationType.AUTO) // 오토인크리먼트

 //  @GeneratedValue(strategy = GenerationType.IDENTITY) //

//   @GeneratedValue(strategy = GenerationType.SEQUENCE) //

 //  @GeneratedValue(strategy = GenerationType.IDENTITY) //

 //  @GeneratedValue(strategy = GenerationType.IDENTITY) //

   @Column(name = "order_item_id") //컬럼을 사용한다.

   private Long id;

 

 

 

   /*

   #

   즉시로딩 : ???????????????????????????????????

 

   #

   지연로딩 :

   조인할떄,

    */

 

   //관계 맵핑 @ManyToOne(fetch = FetchType.LAZY) : 관계

   @ManyToOne(fetch = FetchType.LAZY) //지연로딩

   @JoinColumn(name = "item_id") //조인컬럼(레퍼런스) : 연결할 테이블 ,참조할 레퍼런스 테이블 ,

   private Item item//Item테이블이랑 관계 설정(아이템테이블은 부모테이블) 연결한다.

 

   @ManyToOne(fetch = FetchType.LAZY)

   @JoinColumn(name = "order_id")

   private Order order; //???????????????????????????????????

   //JPA는 단방향 설정이라고하는데,

   //우리 구조는 Order.java에서 설정이 한번 더이루어집니다. 그래서 양방향 됩니다.

 

   private int orderPrice;

 

   private int count; //주문 수량

 

   //스타틱 타입으로 만들어놔서 바로 불러올수잇게 했습니다.

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

       OrderItem orderItem = new OrderItem();

      

       orderItem.setItem(item);    //주문할 상품 설정

       orderItem.setCount(count);  //주문 수량 설정

       orderItem.setOrderPrice(item.getPrice()); // 현재 시간을 기준으로 상품 가격을 주문가격으로 설정하겠다.

 

       //Item 엔티티의 removeStock 메소드 호출

       item.removeStock(count);    //주문 수량 만큼 상품의 재고 수량을 감소

       return orderItem;

   }

 

   public int getTotalPrice(){ // 해당 상품을 주문한 총 가격

       return orderPrice*count;

   }

 

   public void cancel() {  //취소 시 재고 수량 증가

       this.getItem().addStock(count);

   }

 

}



#OderService(service)생성



#OrderDto생성

 




●5

#OrderRepository생성

#OrderRepository 내용추가

 



#OrderController(controller)

 

 

package com.cshop.controller;

 

import com.cshop.dto.OrderDto;

import com.cshop.service.OrderService;

import lombok.RequiredArgsConstructor;

import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

import org.springframework.stereotype.Controller;

import org.springframework.validation.BindingResult;

import org.springframework.validation.FieldError;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.ResponseBody;

 

import jakarta.validation.Valid;

import java.security.Principal;

import java.util.List;

 

 

//동기(나일하니깐, 기다려)

//비동기(같이하자)

 

 

 

//비동기(같이하자) 방식으로 처리

   @Controller

   @RequiredArgsConstructor

   public class OrderController {

 

       private final OrderService orderService;

 

       @PostMapping(value = "/order")

 

       public @ResponseBody ResponseEntity order(@RequestBody @Valid OrderDto orderDto

               , BindingResult bindingResult, Principal principal){

 

           if(bindingResult.hasErrors()){

               StringBuilder sb = new StringBuilder();

               List<FieldError> fieldErrors = bindingResult.getFieldErrors();

 

               for (FieldError fieldError : fieldErrors) {

                   sb.append(fieldError.getDefaultMessage());

               }

 

               return new ResponseEntity<String>(sb.toString(), HttpStatus.BAD_REQUEST);

 

           }

 

           String userid = principal.getName();

 

           Long orderId;

 

           try {

               orderId = orderService.order(orderDto, userid);

 

           } catch(Exception e){

               return new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);

           }

 

           return new ResponseEntity<Long>(orderId, HttpStatus.OK);

       }

 

   }

 

비동기의 예시(주로 Ajax로) 처리




●6 클릭시 주문하기 처리

 

Ajax 옆에 

 



●7 오늘 배운것 정리



#

mainItemDto. 




#ItemRepositoryCustomlmpl.java



 

#ItemService

 



#Maincontroller

 

#index.html



#ItemController.java



#itemDtl.html





'7.springBoot > 1)개념_springBoot' 카테고리의 다른 글

springBoot_개념_Day_16  (0) 2024.04.29
springBoot_개념_Day_15  (0) 2024.04.26
springBoot_개념_Day_13  (0) 2024.04.12
springBoot_개념_Day_12  (0) 2024.04.11
springBoot_개념_Day_11  (0) 2024.04.09