[Spring] 3) BOOKORDER_Back(2)

진주·2022년 3월 23일
0

Spring

목록 보기
29/29

목표

name, address를 입력하고 Charge 클릭 했을 때 ORDER TABLE에 저장하기


Front 부분의 Cart.jsx에서

line91~ 103 부분이 POST 요청이므로 body에 담아서 데이터를 보낸다.

JSON.stringfy()를 통해 객체를 문자열화 한다. (직렬화와 관련되어있음)


OrderDTO.java 생성

dto - 파일 명 : OrderDTO.java

package dev.book.bookorder.model.dto;

import dev.book.bookorder.model.entity.Book;

public class OrderDTO {

  private String userName;

  private String address;

  private String bookTitle;

  private String bookAuthor;

  private int totalPrice;

  // ????
  private Book book;

  // 오버로딩
  public OrderDTO(String userName, String address, String bookTitle, int totalPrice){
    this.userName = userName;
    this.address = address;
    this.bookTitle = bookTitle;
    this.totalPrice = totalPrice;
  }

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public String getBookTitle() {
    return bookTitle;
  }

  public void setBookTitle(String bookTitle) {
    this.bookTitle = bookTitle;
  }

  public String getBookAuthor() {
    return bookAuthor;
  }

  public void setBookAuthor(String bookAuthor) {
    this.bookAuthor = bookAuthor;
  }

  public int getTotalPrice() {
    return totalPrice;
  }

  public void setTotalPrice(int totalPrice) {
    this.totalPrice = totalPrice;
  }

  public Book getBook() {
    return book;
  }

  public void setBook(Book book) {
    this.book = book;
  }
}

OrderController.java (미완성)

package dev.book.bookorder.controller;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import dev.book.bookorder.model.dto.OrderDTO;

@CrossOrigin(origins="*") // 어떤 오류를 해결하기 위한 것..
@RestController 
@RequestMapping("/api/v1/orders") 
// // localhost:8090/api/v1/orders, Front의 Cart.jsx의 28Line BASE_URL 확인
public class OrderController {


  @PostMapping() // @PostMapping()내에 아무것도 넣지 않으면, localhost:8090/~/api/v1/orders 에 해당함
  public void insertOrder(@RequestBody OrderDTO orderDTO){
    // 🙄 Cart.jsx에서 90~103line을 통해 front에서 보낸 데이터를 제대로 받기 위해서는 어떻게 해야할까? = OrderDTO 형식으로 받는다,,,,
    // Cart.jsx에서 넘어온 데이터의 형태가 OrderDTO의 형태와 일치하므로 자동으로 Controller에서 DTO로 만들어준다.
    System.out.println(orderDTO);

  }
}

서버 재실행 하고 장바구니에서 charge 해보기

콘솔에 주소값이 출력되면 OK 😊


OrderService.java

class를 interface로 변경,

OrderService의 구현은 OrderServiceImpl.java 에다 작성한다.

OrderService는 인터페이스이므로 insertOrder()만 작성해놓고,
이를 구현하는 코드OrderServiceImpl.java에 작성한다.

service - 파일 명 : OrderServiceImpl.java 생성 후
@Override 를 통해 insertOrder() 메서드 구현하기


OrderRepository.java 생성

extends JpaRepository<Order,Long> 을 제대로 적어주는 것이 중요!!


findByName()

OrderServiceImpl.java에서
findById 밖에 존재하지 않는데, findByName으로 찾고싶을 때?

BookRepository.java에다가 findByName()을 추가하는데,
camelcase 잘 지키면서 Book이 갖고있는 필드 값으로 지정해줘야한다!!

BookRepository interface에 선언만 해줘도 Book findByName(String name); 구현은 spring jpa가 findByName을 알아서 만들어준다.


OrderController.java 완성 코드

package dev.book.bookorder.controller;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import dev.book.bookorder.model.dto.OrderDTO;
import dev.book.bookorder.service.OrderService;

@CrossOrigin(origins="*") 
@RestController 
@RequestMapping("/api/v1/orders") 
// localhost:8090/api/v1/orders, Front의 Cart.jsx의 28Line BASE_URL 확인
public class OrderController {
  // @Controller이므로 bean에 등록되고, OrderService를 사용하기 위해 OrderService또한 bean으로 등록되어있어야한다.
  // OrderService의 구현체인 OrderServiceImpl가 @Service Annotation으로 인해 bean으로 등록된다.
  private final OrderService orderService;

  public OrderController(OrderService orderService){
    this.orderService = orderService;
  }


  @PostMapping() // @PostMapping()내에 아무것도 넣지 않으면, localhost:8090/~/api/v1/orders 에 해당함
  public void insertOrder(@RequestBody OrderDTO orderDTO){
    orderService.insertOrder(orderDTO);

  }
}

OrderServiceImpl.java 완성 코드

package dev.book.bookorder.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import dev.book.bookorder.model.dto.OrderDTO;
import dev.book.bookorder.model.entity.Book;
import dev.book.bookorder.model.entity.Order;
import dev.book.bookorder.repository.BookRepository;
import dev.book.bookorder.repository.OrderRepository;

@Service
public class OrderServiceImpl implements OrderService {

  @Autowired
  OrderRepository orderRepository;

  @Autowired
  BookRepository bookRepository;

  @Override
  public void insertOrder(OrderDTO orderDTO) {

    // bookRepository.findByName(bookTitle)
    Book book = bookRepository.findByName(orderDTO.getBookTitle());

    // Order 엔티티 생성
    // ModelMapper라는 외부 라이브러리도 존재 (알아서 Mapping해준다)
    Order order = new Order();
    order.setUserName(orderDTO.getUserName());
    order.setAddress(orderDTO.getAddress());
    order.setTotalPrice(orderDTO.getTotalPrice());

    // 연관 관계 설정 = 맵핑
    order.setBook(book);

    // 저장 = save(entity)
    orderRepository.save(order);
  }
}

전체 파일은 이렇다


😵 결과 확인

결과값 확인을 위해 서버 재실행!

charge클릭

MySQL에서 SELECT * FROM ORDERS를 통해 확인

실수한(Address랑 Name을 적지 않음) ORDER까지 제대로 DB에 등록되었다!!! 🤗

profile
진주의 코딩일기

0개의 댓글