ㅡㅡㅡ
●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 |