수업(국비지원)/Spring
[Spring] (MVC 2) 상품 주문하기(checkout, CartController, UserLoginAspect, CartAspect)
byeolsub
2023. 4. 21. 00:07
📌 checkout.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%-- /springmvc1/src/main/webapp/WEB-INF/view/cart/checkout.jsp --%>
<!DOCTYPE html><html><head><meta charset="UTF-8">
<title>주문 전 상품 목록 보기</title></head>
<body><h2>배송지 정보</h2>
<table><tr><td width="30%">주문아이디</td>
<td width="70%">${sessionScope.loginUser.userid}</td></tr>
<tr><td>이름</td><td>${sessionScope.loginUser.username}</td></tr>
<tr><td>우편번호</td><td>${sessionScope.loginUser.postcode}</td></tr>
<tr><td>주소</td><td>${sessionScope.loginUser.address}</td></tr>
<tr><td>전화번호</td><td>${sessionScope.loginUser.phoneno}</td></tr>
</table><h2>구매 상품 </h2>
<table><tr><th>상품명</th><th>가격</th><th>수량</th><th>합계</th></tr>
<c:forEach items="${sessionScope.CART.itemSetList}" var="itemSet" varStatus="stat">
<tr><td>${itemSet.item.name}</td>
<td><fmt:formatNumber value="${itemSet.item.price}" pattern="###,###"/></td>
<td><fmt:formatNumber value="${itemSet.quantity}" pattern="###,###"/></td>
<td><fmt:formatNumber value="${itemSet.item.price *itemSet.quantity}" pattern="###,###"/></td></tr>
</c:forEach>
<tr><td colspan="4" align="right">
총 구입 금액 : <fmt:formatNumber value="${sessionScope.CART.total}" pattern="###,###"/>원</td></tr>
<tr><td colspan="4"><a href="end">주문확정</a>
<a href="../item/list">상품 목록</a>
</td></tr></table></body></html>
📌 CartController.java 내용 추가
package controller;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import logic.Cart;
import logic.Item;
import logic.ItemSet;
import logic.ShopService;
import logic.User;
@Controller
@RequestMapping("cart")
public class CartController {
@Autowired
private ShopService service;
//http://localhost:8088/springmvc1/cart/cartAdd?id=1&quantity=1
@RequestMapping("cartAdd")
public ModelAndView add(Integer id, Integer quantity, HttpSession session) {
ModelAndView mav = new ModelAndView("cart/cart"); //뷰 이름
Item item = service.getItem(id); //상품 정보를 db에서 읽어 오기
//session의 "CART" 속성에 장바구니 정보를 저장.
Cart cart = (Cart)session.getAttribute("CART");
if(cart == null) {
cart = new Cart();
session.setAttribute("CART", cart); //CART 객체를 속성에 등록
}
//cart의 itemSetList에 추가
//itemSetList 존재하는 상품이 추가 되는 경우 수량만 증가시킴
cart.push(new ItemSet(item, quantity));
mav.addObject("cart",cart);
mav.addObject("message", item.getName() + ":" + quantity + "개 장바구니 추가");
return mav;
}
//http://localhost:8088/springmvc1/cart/cartDelete?index=0
@RequestMapping("cartDelete")
public ModelAndView delete(int index, HttpSession session) {
//index : cart.getItemSetList()의 인덱스.
ModelAndView mav = new ModelAndView("cart/cart");
Cart cart = (Cart)session.getAttribute("CART");
//요소 List.remove(index) : 삭제되는 해당 요소를 전달(리턴)
//delSet : 삭제되는 ItemSet 객체
ItemSet delSet = cart.getItemSetList().remove(index);
mav.addObject("cart", cart);
mav.addObject("message", delSet.getItem().getName() + " 이(가) 장바구니에서 삭제.");
return mav;
}
//http://localhost:8088/springmvc1/cart/cartView
@RequestMapping("cartView")
public ModelAndView view(HttpSession session) {
ModelAndView mav = new ModelAndView("cart/cart");
Cart cart = (Cart)session.getAttribute("CART");
mav.addObject("cart", cart);
return mav;
}
**/*
* AOP 클래스 : CartAspect 클래스
* 로그인이 되어야 실행 가능하도록 AOP 부분 추가하기
* 장바구니에 주문상품이 없는 경우 실행 불가 AOP 부분 추가하기
*/
@RequestMapping("checkout")
public String checkout(HttpSession session) {
return null;
}**
}
📌 UserLoginAspect.java 내용 추가
package aop;
import javax.servlet.http.HttpSession;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import exception.LoginException;
import logic.User;
@Component //객체화
@Aspect //AOP 기능의 클래스
public class UserLoginAspect {
/*
* Pointcut : 핵심메서드의 선택 기준 설정
*
* execution(* controller.User*.loginCheck*(..)) && args(..,session) :
* controller 페키지의 클래스 중 User로 시작하는 클래스의 메서드 중 longinCheck로 시작하는 (..) 매개변수와 상관없이 모든 메서드
*
* args(..,session) :
* 매서드의 매개변수의 마지막 변수의 자료형이 HttpSession인 메서드를 선택.
* .. : 아무거나 상관없음
*
* Advice : AOP 메서드의 실행되는 시점 설정.
* 1. @Around : 핵심(Pointcut) 메서드 실행 전 후 AOP 메서드 실행
* ProceedingJoinPoint를 이용하여 전 후 를 구분함
* 2. @Before : 핵심 메서드 실행 전 AOP 메서드 실행
* 3. @After : 핵심 메서드 실행 후 AOP 메서드 실행
* 4. @AfterReturning : 핵심 메서드 실행 정상 종료 후 AOP 메서드 실행
* 5. @AfterThrowing : 핵심 메서드 실행 오류 종료 후 AOP 메서드 실행
*/
@Around("execution(* controller.User*.loginCheck*(..)) && args(..,session)")
public Object userLoginCheck(ProceedingJoinPoint joinPoint, HttpSession session) throws Throwable {
//joinPoint : 실행되어야 하는 메서드들의 순서를 관리 할 수 있는 객체
//session : Pointcut 메서드의 마지막 매개변수
User loginUser = (User)session.getAttribute("loginUser");
if(loginUser == null) { //로그인이 안된 경우
throw new LoginException("[userlogin]로그인 후 거래 하세요.", "login");
}
return joinPoint.proceed(); //다음번 메서드로 진행. 실행 전과 후를 나눠주는 역할
}
📌 CartAspect.java 생성
package aop;
import javax.servlet.http.HttpSession;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import exception.LoginException;
import logic.Cart;
import logic.User;
@Component
@Aspect
public class CartAspect {
@Before("execution(* controller.Cart*.check*(..)) "
+ " && args(..,session)")
public void cartCheck(HttpSession session)
throws Throwable {
User loginUser = (User)session.getAttribute("loginUser");
if(loginUser == null) { //로그아웃된 경우.
throw new LoginException
("회원만 주문 가능합니다.로그인 하세요","../user/login");
}
Cart cart = (Cart)session.getAttribute("CART");
if(cart == null || cart.getItemSetList().size() == 0) {
throw new LoginException
("장바구니에 주문 상품이 없습니다.","../item/list");
}
}
}