티스토리 뷰

Chapter15. 스프링 웹 플로우 : 주문 처리 페이지 만들기

 

 

15.1.3 웹 플로우를 적용하는 주문 처리의 기본 구조 만들기

 

 


도서 주문 처리 정보가 담긴 도메인 객체 생성하기

 

 

Book.java

public class Book implements Serializable
{
	@BookId
	
	private static final long serialVersionUID = -7715651009026349175L;

 

 

Cart.java

package com.springmvc.domain;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

public class Cart implements Serializable{
	
	private static final long serialVersionUID = -2155125089108199199L;

 

 

CartItem.java

package com.springmvc.domain;

import java.io.Serializable;

public class CartItem implements Serializable{
	
	private static final long serialVersionUID = -2155125089108199199L;

 

 

 

 

 

com.springmvc.domain 패키지에서 Address 크래스를 생성하고 내용을 작성한다.

 

Address.java

package com.springmvc.service;

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

import com.springmvc.domain.Cart;
import com.springmvc.exception.CartException;
import com.springmvc.repository.CartRepository;

@Service
public class CartServiceImpl implements CartService {
	
	@Autowired
	private CartRepository cartRepository;

	@Override
	public Cart create(Cart cart) {
		// TODO Auto-generated method stub
		return cartRepository.create(cart);
	}

	@Override
	public Cart read(String cartId) {
		// TODO Auto-generated method stub
		return cartRepository.read(cartId);
	}

	@Override  //update메서드에서 cartRepository의 update 메서드로 이동
	public void update(String cartId, Cart cart) {
		cartRepository.update(cartId, cart);
		
	}

	@Override
	public void delete(String cartId) {
		cartRepository.delete(cartId);
		
	}

	@Override
	public Cart validateCart(String cartId) {
		Cart cart = cartRepository.read(cartId);
		if(cart == null || cart.getCartItems().size() == 0) {
			throw new CartException(cartId);
		}
		return cart;
	}
	
	
}

 

 

 

 

 

com.springmvc.domian 패키지에서 Cusomer 클래스를 생성하고 내용 작성

 

Customer.java

package com.springmvc.domain;

import java.io.Serializable;

public class Customer implements Serializable{

	private static final long serialVersionUID = 3636831123198280235L;
	
	private String customerId;
	private String name;
	private Address address;
	private String phone;
	
	public Customer() {
		this.address = new Address();
	}
	
	public Customer(String customerId, String name) {
		this();
		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;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((customerId == null) ? 0 : customerId.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;
		Customer other = (Customer) obj;
		if (customerId == null) {
			if (other.customerId != null)
				return false;
		} else if (!customerId.equals(other.customerId))
			return false;
		return true;
	}
	
	
	
	
}

 

 

 

com.springmvc.domain 패키지에서 Shipping 클래스를 생성하고 내용 작성

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 = 8121814661110003493L;
	
	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;
	}
	
	
}

 

 

 

 

 

com.springmvc.domain 패키지에 Order 클래스를 생성하고 내용 작성

 

Order.java

package com.springmvc.domain;

import java.io.Serializable;

public class Order implements Serializable{
	
	private static final long serialVersionUID = 2659461092139119863L;

	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;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((orderId == null) ? 0 : orderId.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;
		Order other = (Order) obj;
		if (orderId == null) {
			if (other.orderId != null)
				return false;
		} else if (!orderId.equals(other.orderId))
			return false;
		return true;
	}
	
	
}

 

 

 

 

 


도서 주문 처리 정보를 관리하는 퍼시스턴스 계층인 저장소 객체 구현하기

 

 

com.springmvc.repository 패키지에서 OrderRepository 인터페이스를 생성 후 내용 작성한다. 그리고 OrderRepositoryImpl 클래스를 생성해 구현한다.

 

 

OrderRepository.java

package com.springmvc.repository;

import com.springmvc.domain.Order;

public interface OrderRepository {
	
	Long saveOrder(Order order);

}

 

 

 

OrderRepositoryImpl.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 synchronized long getNextOrderId() {
		return nextOrderId++;
	}

}

 

 

 

 

 

 

 


도서 장바구니 정보를 반환하는 서비스 계층인 서비스 객체 구현하기

 

 

 

com.springmvc.exception 패키지에서 CartException 클래스를 생성하여 내용 작성

 

CartException.java

package com.springmvc.exception;

public class CartException extends RuntimeException{
	
	private static final long serialVersionUID = 3800725230807627148L;
	private String cartId;
	
	public CartException(String cartId) {
		this.cartId = cartId;
	}
	
	public String getCartId() {
		return cartId;
	}
}

 

 

 

CartService 인터페이스에 장바구니의 예외 처리를 위한 validateCart() 메서드를 추가한다. 추가한 후 CartServiceImpl 클래스에서 구현한다.

 

CartService.java

package com.springmvc.service;

import com.springmvc.domain.Cart;

public interface CartService {
	Cart create(Cart cart);
	Cart read(String cartId);
	
	//update를 위한 update() 메서드 선언
	void update(String cartId, Cart cart);
	
	void delete(String cartId);
	
	//15.1.3 추가 장바구니 예외 처리를 위한 메서드 추가
	Cart validateCart(String cartId);
}

 

 

CartServiceImpl.java

	@Override
	public Cart validateCart(String cartId) {
		Cart cart = cartRepository.read(cartId);
		if(cart == null || cart.getCartItems().size() == 0) {
			throw new CartException(cartId);
		}
		return cart;
	}
	
	
}

 

 

 

 

 

com.springmvc.service 패키지에서 OrderServiceImpl 클래스를 생성하고 내용을 작성한다. 그후 OrderServiceImpl 인터페이스 구현체 클래스에서 작성한 메서드를 구현한다.

 

 

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) {
		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) {
		Long orderId = orderRepository.saveOrder(order);
		cartService.delete(order.getCart().getCartId());
		return orderId;
	}

}

 

 

 

 

 


MVC를 담당하는 프레젠테이션 계층인 컨트롤러 구현하기

 

 

com.springmvc.controller 패키지에서 OrderController를 생성한 후 내용을 작성한다.

OrderController 컨트롤러는 실제로 작동하지 않고 웹 플로우가 주문 처리를 작동한다.

 

 

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";
	}
}

 

 

 

 

 


출력 결과

url에 /order/ISBN1234/2 를 입력 후 이동한다.

그 후 상세정보를 클릭해 재고수를 보면 기존 재고수에서 -2가 된 것을 볼 수 있다.

 

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday