name
, address
를 입력하고 Charge
클릭 했을 때 ORDER TABLE에 저장하기
Front 부분의 Cart.jsx
에서
line91~ 103 부분이 POST 요청
이므로 body에 담아서 데이터를 보낸다.
JSON.stringfy()를 통해 객체를 문자열화 한다. (직렬화와 관련되어있음)
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;
}
}
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 😊
class를 interface
로 변경,
OrderService의 구현은 OrderServiceImpl.java
에다 작성한다.
OrderService는 인터페이스이므로 insertOrder()
만 작성해놓고,
이를 구현하는 코드는 OrderServiceImpl.java에 작성한다.
service - 파일 명 : OrderServiceImpl.java
생성 후
@Override
를 통해 insertOrder()
메서드 구현하기
extends JpaRepository<Order,Long>
을 제대로 적어주는 것이 중요!!
OrderServiceImpl.java에서
findById
밖에 존재하지 않는데, findByName
으로 찾고싶을 때?
BookRepository.java
에다가 findByName()을 추가하는데,
camelcase 잘 지키면서 Book이 갖고있는 필드 값으로 지정해줘야한다!!
BookRepository interface에 선언만 해줘도 Book findByName(String name);
구현은 spring jpa가 findByName
을 알아서 만들어준다.
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);
}
}
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에 등록되었다!!! 🤗