티스토리 뷰
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가 된 것을 볼 수 있다.
'코딩 > spring' 카테고리의 다른 글
[17주 4일차] 스프링 웹 플로우 : 주문 처리 페이지 만들기 (2) (0) | 2024.02.01 |
---|---|
[17주 3일차] 스프링 웹 플로우 (1) (0) | 2024.01.31 |
[17주 3일차] RESTful 웹 서비스 (2) (0) | 2024.01.31 |
[17주 3일차] RESTful 웹 서비스 : 장바구니 페이지 만들기 (2) (2) | 2024.01.31 |
REST API 연습 (0) | 2024.01.30 |
- Total
- Today
- Yesterday