Kim VamPa

[Spring][쇼핑몰 프로젝트][44] 주문 취소 - 1 본문

스프링 프레임워크/쇼핑몰 프로젝트

[Spring][쇼핑몰 프로젝트][44] 주문 취소 - 1

Kim VamPa 2021. 12. 29. 13:00
728x90
반응형
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188

 

목표

주문 취소

 

 주문 취소 기능 구현을 목표로 합니다.

순서

1. 개요

2. Mapper

3. dto클래스

4. Service

 

 

 

1. 개요

 주문 취소의 경우 회원이 하는 경우, 관리자가 하는 경우가 있을 것입니다. 이번 구현은 이러한 각각의 이해관계자가 사용하도록 만든 기능이라기보다는, '주문취소' 자체가 수행할 로직을 짜 보기 위해 추가한 기능입니다.

 

 구현하고자 하는 '주문 취소'기능의 전체적인 흐름은 다음과 같이 할 생각입니다.

 

 - '주문 현황' 페이지에서 주문 상태가 "배송준비"인 주문에만 '주문취소' 버튼이 보인다.

 - 버튼을 누르게 되면 서버에 '주문취소' 요청을 요청하게 된다.

 - 서버에서는 주문 금액, 포인트, 재고를 반환하게 된다.

 - 주문 관련 테이블의 데이터는 지워지지 않고 단지 vam_order 테이블의 '주문상태'의 값이 변한다.

 - 서버에서는 '주문취소'가 완료되면 '주문 현황'페이지로 리다이렉트 한다.

 

 위에서 언급한 동작을 수행하도록 구현을 해보겠습니다. 

 

2. Mapper

 vam_order 테이블의 주문 상태 컬럼 값을 '주문취소'로 변경하는 쿼리, 회원이 주문한 vam_order 테이블의 데이터를 가져오는 쿼리, vam_orderItem 테이블의 데이터를 가져오는 쿼리를 수행하는 총 3개의 Mapper 메서드를 만들어 주겠습니다.

 

OrderMapper 인터페이스

 

 com.vam.mapper 패키지에 있는 OrderMapper 인터페이스에 3개의 메서드 선언부를 추가해줍니다. orderId를 조건으로 테이블의 데이터를 변경하고, 가져올 것이기 때문에 파라미터로 String 타입을 부여해주었습니다.

 

	/* 주문 취소 */
	public int orderCancle(String orderId);
	
	/* 주문 상품 정보(주문취소) */
	public List<OrderItemDTO> getOrderItemInfo(String orderId);
	
	/* 주문 정보(주문취소) */
	public OrderDTO getOrder(String orderId);

 

그림 2-1

 

 

OrderMapper.xml

 

 src/main/resources/com/vam/mapper 경로의 OrderMapper.xml 파일에 앞서 선언한 3개의 메서드가 실행할 쿼리문을 작성합니다.

 

	<!-- 주문취소 -->
	<update id="orderCancle">
		update vam_order set orderState = '주문취소' where orderId = #{orderId}
	</update>	

	<!-- 주문 상품 정보(주문취소) -->
	<select id="getOrderItemInfo" resultType="com.vam.model.OrderItemDTO">
	
		select * from vam_orderItem
		where orderId = #{orderId}
	
	</select>
	
	<!-- 주문 정보(주문 취소) -->
	<select id="getOrder" resultType="com.vam.model.OrderDTO">
	
		select * from vam_order
		where orderId = #{orderId}
	
	</select>

 

그림 2-2

 

 

3. dto 클래스

 Service를 만들어주기 전 뷰가 요청을 하며 전송할 데이터를 담는 그릇 역할을 할 DTO 클래스를 먼저 만들겠습니다.

com.vam.model 패키지에 OrderCancelDTO 클래스를 생성합니다.

 

그림 3-1

 

 

 '주문 취소' 기능에 '회원아이디(memberId)', '주문아이디(orderId)' 가 필요로 하기 때문에 두 속성(변수)을 추가해줍니다.

 

	private String memberId;
	
	private String orderId;

 

 

 '주문 취소' 완료 후 사용자가 있었던 페이지로 리다이렉트 하도록 할 것인데, 기존 있었던 페이지로 가기 위해서는 페이징 정보가 필요로 합니다. 따라서 페이징 정보 속성(변수)을 추가해줍니다.

 

	private String memberId;
	
	private String orderId;
	
	private String keyword;
	
	private int amount;
	
	private int pageNum;

 

 

 추가 해준 변수들에 대한 getter/setter/toStirng 메서드를 추가해주었습니다.

 

 

 

 

4. Service

  AdminService, OrderService 어디에 주문 취소 Service 메서드를 만들어 줄지 고민을 했는데 그냥 OrderSrevice에 만들어주겠습니다. 어떠한 기준을 세워놓지 않고 그때그때 만들어가다 보니 코드가 중구난방인 점 양해 부탁드립니다.

 

 '주문 취소'의 흐름의 전체적인 흐름은 '주문'과 크게 다르지 않습니다. 단지 '주문'과 달리 장바구니 테이블 데이터 삭제를 하지 않고, '돈, 포인트, 재고'를 차감하는 것이 아니라 가산해준다는 점이 다릅니다. 전체적인 흐름은 다음과 같습니다.

 

 - DB에 저장된 주문, 주문상품 정보를 꺼내온다.

 - 꺼내온 정보를 통해 회원이 지불한 금액, 포인트, 받았던 포인트 값들을 구한다.

 - 앞서 꺼내고 만들어둔 데이터를 활용하여 회원이 사용한 '돈', '포인트'를 가산해준다.

 - 회원이 상품을 구매함으로써 받은 포인트를 회수한다.

 - 차감했던 재고를 다시 가산한다

 

위의 흐름대로 한번 구현해보겠습니다.

 

OrderService 인터페이스

 

 com.vam.service 패키지의 OrderService 클래스에 '주문취소' 메서드 선언부를 작성합니다. 주문결과에 따라 숫자, 혹은 문자열 값을 반환하도록 만들 수 있지만 단순하게 만들기 위해 void로 지정하였습니다. 파라미터는 뷰에서 전달해주는 데이터가 담길 OrderCancelDTO 클래스를 지정해주었습니다.

 

	/* 주문 취소 */
	public void orderCancle(OrderCancelDTO dto);

 

그림 4-1

 

 

OrderServiceImpl.java

 

 com.vam.srevice 패키지의 OrderServiceImpl 클래스에서 앞서 인터페이스에서 선언한 메서드를 오버라이딩 해줍니다. 그리고 여러 쿼리가 실행이 되기 때문에 하나의 단위로 동작할 수 있도록 @Transactional 어노테이션을 추가해줍니다.

 

	/* 주문취소 */
	@Override
	@Transactional
	public void orderCancle(OrderCancelDTO dto) {
		
		
	}

 

그림 4-2

 

 

 구현부에 '주문 취소' 로직을 차근히 진행해보겠습니다. 먼저 회원 정보, 주문 정보, 주문 상품 정보를 가져와서 Member, OrderDTO, OrderItemDTO 객체에 담아줍니다. 더불어 주문, 주문 상품 정보의 경우 OrderDTO, OrderItemDtO에 판매 가격 관련 정보를 만들어내는 메서드를 호출하여 가격 관련 값들 또한 세팅해줍니다.

 

	/* 주문, 주문상품 객체 */
		/*회원*/
			MemberVO member = memberMapper.getMemberInfo(dto.getMemberId());
		/*주문상품*/
			List<OrderItemDTO> ords = orderMapper.getOrderItemInfo(dto.getOrderId());
			for(OrderItemDTO ord : ords) {
				ord.initSaleTotal();
			}
		/* 주문 */
			OrderDTO orw = orderMapper.getOrder(dto.getOrderId());
			orw.setOrders(ords);
			
			orw.getOrderPriceInfo();

 

 

  주문 테이블의 '주문상태' 컬럼값이 "주문취소" 로 변경해주는 Mapper 메서드를 호출합니다.

 

	/* 주문, 주문상품 객체 */
		/*회원*/
			MemberVO member = memberMapper.getMemberInfo(dto.getMemberId());
		/*주문상품*/
			List<OrderItemDTO> ords = orderMapper.getOrderItemInfo(dto.getOrderId());
			for(OrderItemDTO ord : ords) {
				ord.initSaleTotal();
			}
		/* 주문 */
			OrderDTO orw = orderMapper.getOrder(dto.getOrderId());
			orw.setOrders(ords);
			
			orw.getOrderPriceInfo();
			
	/* 주문상품 취소 DB */
			orderMapper.orderCancle(dto.getOrderId());

 

 

 주문 취소로 인해서 회원이 소유하게 될 '돈', '포인트' 값들을 계산한 후 Member 객체의 money, point 변수에 넣어 줍니다.

 

	/* 주문, 주문상품 객체 */
		/*회원*/
			MemberVO member = memberMapper.getMemberInfo(dto.getMemberId());
		/*주문상품*/
			List<OrderItemDTO> ords = orderMapper.getOrderItemInfo(dto.getOrderId());
			for(OrderItemDTO ord : ords) {
				ord.initSaleTotal();
			}
		/* 주문 */
			OrderDTO orw = orderMapper.getOrder(dto.getOrderId());
			orw.setOrders(ords);
			
			orw.getOrderPriceInfo();
			
	/* 주문상품 취소 DB */
			orderMapper.orderCancle(dto.getOrderId());
			
	/* 돈, 포인트, 재고 변환 */
			/* 돈 */
			int calMoney = member.getMoney();
			calMoney += orw.getOrderFinalSalePrice();
			member.setMoney(calMoney);
			
			/* 포인트 */
			int calPoint = member.getPoint();
			calPoint = calPoint + orw.getUsePoint() - orw.getOrderSavePoint();
			member.setPoint(calPoint);

 

 

 회원 테이블의 '돈', '포인트' 컬럼의 값을 변경하는 쿼리인 deductMoney 메서드를 호출합니다. 인자는 최신화 한 '돈', '포인트' 값을 가진 Member객체입니다.

 

※ deductMoney Mapper 메서드를 만들 때 단순히 구매로 인하여 돈과 포인트를 차감한다는 생각에 감소시킨다는 의미의 deduct를 메서드의 이름으로 지었습니다.  하지만 '주문 취소' 기능에서는 해당 Mapper 메서드가 가산을 하는 역할도 하기에 메서드 명을 updateMoney로 해주는 것이 더 좋을 거 같습니다.

 

	/* 주문, 주문상품 객체 */
		/*회원*/
			MemberVO member = memberMapper.getMemberInfo(dto.getMemberId());
		/*주문상품*/
			List<OrderItemDTO> ords = orderMapper.getOrderItemInfo(dto.getOrderId());
			for(OrderItemDTO ord : ords) {
				ord.initSaleTotal();
			}
		/* 주문 */
			OrderDTO orw = orderMapper.getOrder(dto.getOrderId());
			orw.setOrders(ords);
			
			orw.getOrderPriceInfo();
			
	/* 주문상품 취소 DB */
			orderMapper.orderCancle(dto.getOrderId());
			
	/* 돈, 포인트, 재고 변환 */
			/* 돈 */
			int calMoney = member.getMoney();
			calMoney += orw.getOrderFinalSalePrice();
			member.setMoney(calMoney);
			
			/* 포인트 */
			int calPoint = member.getPoint();
			calPoint = calPoint + orw.getUsePoint() - orw.getOrderSavePoint();
			member.setPoint(calPoint);
			
				/* DB적용 */
				orderMapper.deductMoney(member);

 

 

 주문 취소로 인해 변동될 재고 값을 구하고 vam_book 테이블의 '재고'컬럼의 값이 변경되도록 Mapper 메서드를 호출해줍니다. 

 

	/* 주문, 주문상품 객체 */
		/*회원*/
			MemberVO member = memberMapper.getMemberInfo(dto.getMemberId());
		/*주문상품*/
			List<OrderItemDTO> ords = orderMapper.getOrderItemInfo(dto.getOrderId());
			for(OrderItemDTO ord : ords) {
				ord.initSaleTotal();
			}
		/* 주문 */
			OrderDTO orw = orderMapper.getOrder(dto.getOrderId());
			orw.setOrders(ords);
			
			orw.getOrderPriceInfo();
			
	/* 주문상품 취소 DB */
			orderMapper.orderCancle(dto.getOrderId());
			
	/* 돈, 포인트, 재고 변환 */
			/* 돈 */
			int calMoney = member.getMoney();
			calMoney += orw.getOrderFinalSalePrice();
			member.setMoney(calMoney);
			
			/* 포인트 */
			int calPoint = member.getPoint();
			calPoint = calPoint + orw.getUsePoint() - orw.getOrderSavePoint();
			member.setPoint(calPoint);
			
				/* DB적용 */
				orderMapper.deductMoney(member);
				
			/* 재고 */
			for(OrderItemDTO ord : orw.getOrders()) {
				BookVO book = bookMapper.getGoodsInfo(ord.getBookId());
				book.setBookStock(book.getBookStock() + ord.getBookCount());
				orderMapper.deductStock(book);
			}

 

REFERENCE

  •  

 

 

DATE

  • 2020.12.29

 

728x90
반응형
Comments