수업(국비지원)/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>&nbsp;
     <a href="../item/list">상품 목록</a>&nbsp;
  </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");
		}
	}
}