티스토리 뷰

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">도서주문 &raquo;</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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함