티스토리 뷰
RESTful
RESTful 웹 서비스의 CRUD
RESTful 웹 서비스를 위한 장바구니 CRUD 만들기
web.xml [GiddenHttpMethodFilter 필터 설정하기]
<!-- chap14 -->
<filter>
<filter-name>httpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpMethodFilter</filter-name>
<servlet-name>appServlet</servlet-name>
</filter-mapping>
Cart.java [장바구니에 도서 등록하기]
public void addCartItem(CartItem item)
{
//현재 등록하기 위한 도서 ID 가져오기
String bookId = item.getBook().getBookId();
//도서 ID가 cartItems 개게에 등록되어 있는지 여부 확인
if(cartItems.containsKey(bookId))
{
CartItem cartItem = cartItems.get(bookId);
cartItem.setQuantity(cartItem.getQuantity()+item.getQuantity());
cartItems.put(bookId, cartItem);
}
else
{
cartItems.put(bookId, item);
}
updateGrandTotal();
}
CartRepository [interface Method 선언]
void update(String cartId, Cart cart);
CartRepositoryImpl.java [Method 구현]
@Override
public void update(String cartId, Cart cart) {
// TODO Auto-generated method stub
if(!listOfCarts.keySet().contains(cartId))
{
throw new IllegalArgumentException(String.format("장바구니 목록에 갱신할 수 없습니다. 장바구니 id(%)가 존재하지 않습니다.", cartId));
}
listOfCarts.put(cartId, cart);
}
CartService [interface Method 선언]
void update(String cartId, Cart cart);
CartServiceImpl.java [Method 구현]
@Override
public void update(String cartId, Cart cart) {
// TODO Auto-generated method stub
cartRepository.update(cartId, cart);
}
CartController.java [장바구니에 등록하는 addCartByNewItem() 메서드 추가 작성]
@Autowired
private BookService bookService;
@PutMapping("/add/{bookId}")
@ResponseStatus(value=HttpStatus.NO_CONTENT)
public void addCartByNewItem(@PathVariable String bookId, HttpServletRequest request)
{
String sessionId = request.getSession(true).getId();
// String sessionId = request.getSession(false).getId();
// if(sessionId == null)
// {
// return "redirect:/login";
// }
//소지하신 카드가 있으십니까??
Cart cart = cartService.read(sessionId);
//없으면 만듭시다.
if(cart == null)
{
cart = cartService.create(new Cart(sessionId));
}
//상품 존재하는지 확인
Book book = bookService.getBookById(bookId);
if(book == null)
{
throw new IllegalArgumentException(new BookIdException(bookId));
}
//해당 책을 장바구니에 추가
cart.addCartItem(new CartItem(book));
//카트 레파지토리에 있는 카트를 업데이트 하겠다.
cartService.update(sessionId, cart);
}
controllers.js - 장바구니에 등록하는 addToCart() 메서드 작성
function addToCart(action)
{
console.log("dsa");
document.addForm.action = action;
document.addForm.submit();
alert("도서가 장바구니에 추가되었습니다");
}
book.jsp 장바구니 잠는 jsp page 수정
<script src="${pageContext.request.contextPath}/resources/js/controllers.js"></script>
<form:form name="addForm" method="put">
<p><a href="javascript:addToCart('../cart/add/${book.bookId }')" class="btn btn-primary">도서주문 »</a>
</form:form>
장바구니에 등록된 도서 항목별 삭제하기
Cart.java
public void removeCartItem(CartItem item)
{
String bookId = item.getBook().getBookId();
cartItems.remove(bookId);
updateGrandTotal();
}
CartController.java - 장바구니에 등록된 도서 항목을 삭제하는 removeCartByItem()메서드를 추가.
@PutMapping("/remove/{bookId}")
@ResponseStatus(value=HttpStatus.NO_CONTENT)
public void removeCartByItem(@PathVariable String bookId, HttpServletRequest request)
{
String sessionId = request.getSession(true).getId();
Cart cart = cartService.read(sessionId);
if(cart == null)
cart = cartService.create(new Cart(sessionId));
Book book = bookService.getBookById(bookId);
if(book == null)
throw new IllegalArgumentException(new BookIdException(bookId));
cart.removeCartItem(new CartItem(book));
cartService.update(sessionId, cart);
}
controllers.js - 등록된 도서 항목을 삭제하는 removeFromCart() 메서드를 추가
function removeFromCart(action)
{
alert("ttt");
document.removeForm.action = action;
document.removeForm.submit();
setTimeout(function () {window.location.reload();}, 500);
}
cart.jsp - 장바구니에 등록된 도서 항목을 삭제를 위한 수정.
<script src="<c:url value="/resources/js/controllers.js" />"></script>
<form:form name="removeForm" method="put">
<c:forEach items="${cart.cartItems}" var="item">
<...>
</c:forEach>
</form:form>
장바구니에 등록된 모든 도서 삭제하기
CartRepository.java 인터페이스에 delete() 메서드 선언
void delete(String cartId);
CartRepositoryImpl.java 클래스에 delete()메서드 구현
@Override
public void delete(String cartId) {
// TODO Auto-generated method stub
if(!listOfCarts.keySet().contains(cartId))
{
throw new IllegalArgumentException(String.format("장바구니 목록을 삭제할 수 없습니다.. 장바구니 id(%)가 존재하지 않습니다.", cartId));
}
listOfCarts.remove(cartId);
}
CartService.java 인터페이스에 delete() 메서드 선언
void delete(String cartId);
CartServiceImpl.java 클래스에 delete() 메서드 구현
@Override
public void delete(String cartId) {
// TODO Auto-generated method stub
cartRepository.delete(cartId);
}
CartController.java 장바구니에 등록된 모든 도서를 삭제하는 deleteCartList() 메서드를 추가.
@DeleteMapping("/{cartId}")
@ResponseStatus(value=HttpStatus.NO_CONTENT)
public void deleteCartList(@PathVariable(value="cartId") String cartId)
{
cartService.delete(cartId);
}
Contorllers.js 저장된 모든 도서 항목을 삭제하는 clearCart() 메서드 작성.
function clearCart()
{
alert("dsa");
document.clearForm.submit();
setTimeout(function () {window.location.reload();}, 500);
}
cart.jsp 내용 수정.
</div>
<div class="container">
<div>
<form:form name="clearForm" method="delete">
<a href="javascript:clearCart()" class="btn btn-danger pull-left">삭제하기</a>
</form:form>
<a href="#" class="btn btn-success float-right">주문하기</a>
</div>
<div style="padding-top : 50px">
<table class="table table-hover">
웹 플로우
웹 플로우
스트링 웹 플로우
스프링 웹 플로우의 특징
웹 플로우를 적용하는 주문 처리의 기본 구조 만들기
Book.java / Cart.java / CartItem.java Serializable을 구현하도록 수정. + Long 타입의 serialVersionUID 상수를 추가
Address.java [DTO]
package com.springmvc.domain;
import java.io.Serializable;
public class Address implements Serializable{
private static final long serialVersionUID = 613846598817670033L;
private String detailName;
private String addressName;
private String country;
private String zipCode;
public String getDetailName() {
return detailName;
}
public void setDetailName(String detailName) {
this.detailName = detailName;
}
public String getAddressName() {
return addressName;
}
public void setAddressName(String addressName) {
this.addressName = addressName;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime*result + ((detailName == null) ? 0 : detailName.hashCode());
result = prime*result + ((addressName == null) ? 0 : addressName.hashCode());
result = prime*result + ((country == null) ? 0 : country.hashCode());
result = prime*result + ((zipCode == null) ? 0 : zipCode.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Address other = (Address) obj;
if(addressName == null)
{
if(other.addressName != null)
{
return false;
}
}
else if( !addressName.equals(other.addressName))
{
return false;
}
if(detailName == null)
{
if(other.detailName != null)
{
return false;
}
}
else if( !detailName.equals(other.detailName))
{
return false;
}
if(country == null)
{
if(other.country != null)
{
return false;
}
}
else if( !country.equals(other.country))
{
return false;
}
if(zipCode == null)
{
if(other.zipCode != null)
{
return false;
}
}
else if( !zipCode.equals(other.zipCode))
{
return false;
}
return true;
}
}
Customer.java [DTO]
package com.springmvc.domain;
import java.io.Serializable;
import java.util.Objects;
public class Customer implements Serializable{
private static final long serialVersionUID = 363683112319820235L;
private String customerId;
private String name;
private Address address;
private String phone;
public Customer() {
super();
// TODO Auto-generated constructor stub
}
public Customer(String customerId, String name) {
super();
this.customerId = customerId;
this.name = name;
}
public String getCustomerId() {
return customerId;
}
public void setCustomerId(String customerId) {
this.customerId = customerId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public int hashCode() {
return Objects.hash(customerId);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Customer other = (Customer) obj;
return Objects.equals(customerId, other.customerId);
}
}
Shipping.java [DTO]
package com.springmvc.domain;
import java.io.Serializable;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
public class Shipping implements Serializable{
/**
*
*/
private static final long serialVersionUID = -2160698988514896735L;
private String name;
@DateTimeFormat(pattern="yyyy/MM/dd")
private Date date;
private Address address;
public Shipping() {
this.address = new Address();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
Order.java [DTO]
package com.springmvc.domain;
import java.io.Serializable;
import java.util.Objects;
public class Order implements Serializable{
private static final long serialVersionUID = 4221771602900107933L;
private Long orderId;
private Cart cart;
private Customer customer;
private Shipping shipping;
public Order() {
this.customer = new Customer();
this.shipping = new Shipping();
}
public Long getOrderId() {
return orderId;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
public Cart getCart() {
return cart;
}
public void setCart(Cart cart) {
this.cart = cart;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public Shipping getShipping() {
return shipping;
}
public void setShipping(Shipping shipping) {
this.shipping = shipping;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public int hashCode() {
return Objects.hash(orderId);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Order other = (Order) obj;
return Objects.equals(orderId, other.orderId);
}
}
도서 주문 처리 정보를 관리하는 퍼시스턴스 계층인 저장소 객체 구현하기
OrderRepository.java 인터페이스 생성 후 내용작성
package com.springmvc.repository;
import com.springmvc.domain.Order;
public interface OrderRepository {
Long saveOrder(Order order);
}
OderRepositoryImpl.java 메서드 구현 및 내용 작성
package com.springmvc.repository;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.springmvc.domain.Order;
@Repository
public class OrderRepositoryImpl implements OrderRepository {
private Map<Long, Order> listOfOrders;
private long nextOrderId;
public OrderRepositoryImpl()
{
listOfOrders = new HashMap<Long, Order>();
nextOrderId = 2000;
}
@Override
public Long saveOrder(Order order) {
order.setOrderId(getNextOrderId());
listOfOrders.put(order.getOrderId(), order);
return order.getOrderId();
}
private Long getNextOrderId() {
// TODO Auto-generated method stub
return nextOrderId++;
}
}
도서 장바구니 정보를 반환하는 서비스 계층인 서비스 객체 구현하기
CartException.java
package com.springmvc.exception;
public class CartException extends RuntimeException{
private static final long serialVersionUID = 6457077274469537785L;
private String cartId;
public CartException(String cartId)
{
this.cartId = cartId;
}
public String getCartId()
{
return cartId;
}
}
CartService.java 인터페이스에 장바구니의 예외 처리를 위한 validateCart() 메서드를 추가
Cart validateCart(String cartId);
CartServiceImpl.java 클래스에 장바구니의 예외 처리를 위한 validateCart() 메서드를 추가.
@Override
public Cart validateCart(String cartId) {
// TODO Auto-generated method stub
Cart cart = cartRepository.read(cartId);
if(cart == null || cart.getCartItems().size() == 0)
{
throw new CartException(cartId);
}
return cart;
}
OrderService.java 인터페이스를 생성하고 내용작성
package com.springmvc.service;
import com.springmvc.domain.Order;
public interface OrderService {
void confirmOrder(String bookId, long quantity);
Long saveOrder(Order order);
}
OrderServiceImpl.java 내용 작성 및 메서드 구현
package com.springmvc.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.springmvc.domain.Book;
import com.springmvc.domain.Order;
import com.springmvc.repository.BookRepository;
import com.springmvc.repository.OrderRepository;
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private BookRepository bookRepository;
@Autowired
private OrderRepository orderRepository;
@Autowired
private CartService cartService;
@Override
public void confirmOrder(String bookId, long quantity) {
// TODO Auto-generated method stub
Book bookById = bookRepository.getBookById(bookId);
if(bookById.getUnitsInStock()< quantity)
{
throw new IllegalArgumentException("품절입니다. 사용가능한 재고수 :" + bookById.getUnitsInStock());
}
bookById.setUnitsInStock(bookById.getUnitsInStock() - quantity);
}
@Override
public Long saveOrder(Order order) {
// TODO Auto-generated method stub
Long orderId = orderRepository.saveOrder(order);
cartService.delete(order.getCart().getCartId());
return orderId;
}
}
MVC를 담당하는 프레젠테이션 계층인 컨트롤러 구현하기
OrderController.java (이 컨트롤러는 실제 작동을 하지 않고 웹 플로우가 주문 처리를 작동합니다.)
package com.springmvc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.springmvc.service.OrderService;
@Controller
public class OrderController {
@Autowired
private OrderService orderService;
@RequestMapping("/order/ISBN1234/2")
public String process()
{
orderService.confirmOrder("ISBN1234", 2);
return "redirect:/books";
}
}
'정리 노트 > Spring' 카테고리의 다른 글
Spring Chapter17 [17-5] (0) | 2024.02.02 |
---|---|
Spring[17-4] (0) | 2024.02.01 |
Spring JSON [17-2] (0) | 2024.01.30 |
Spring Chapter13~Chapter14 [17-1] (0) | 2024.01.29 |
Spring이 사용하는 객체&어노테이션 Chapter 총 정리 (0) | 2024.01.26 |