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

[Spring][쇼핑몰 프로젝트][42] 주문 구현 - 2

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

 

목표

주문 구현 - 서버 구현

 

 "주문"요청을 처리하는 핵심 비즈니스 로직(Service 로직)을 짜기 앞서, 작업에 필요한 Mapper 메서드를 만드는 것이 목표입니다.

 

순서

1. 개요

2. 기본 틀

3. 회원정보

4. 배송지 정보

 

1. 개요

  포스팅의 "목표"에서 말한 바와 같이 서버에서 "주문"처리 작업에 필요로 한 Mapper 메서드를 만드는 것이 목표입니다. 우리가 만들 Mapper 메서드는 6개입니다. 각 Mapper 메서드의 역할을 구현 순서 때 짤막히 설명하고 진행하겠습니다.

 

 "주문"을 처리하는 Service에서 Mapper 메서드가 6개를 사용 할 것인데 이는 하나의 "주문" 요청이 들어왔을 때 6개 이상의 쿼리문이 나간다는 말과 동일합니다. 이렇게 많은 쿼리가 나가는 것은 성능면에서 좋지 못합니다. 하지만 지금 이 시점에선 오직 기능을 구현하는 것이 목표이기 때문에 많은 쿼리문이 나가는 것은 신경 쓰지 않고 진행하겠습니다.

 

※ 많은 쿼리문이 나가는 점을 개선하기 위해 리팩터링 할 때 여러 방법이 있을 것입니다. 예를 들면  for문을 도는 수만큼 Mapper 메서드가 동작하는 코드 경우는 쿼리 문의 IN연산자가 실행되도록 하여 한 번의 쿼리로 모든 데이터를 가져오도록 개선시킬 수 있을 것입니다. 

 

 

2. Mapper.java

2.1 OrderMapper.java

getOrderInfo()

 상품의 아이디, 가격, 할인율을 가져와 주는 메서드입니다.

 

 com.vam.mapper 패키지에 잇는 OrderMapper인터페이스에 메서드 선언부를 추가합니다.

 

	/* 주문 상품 정보(주문 처리) */	
	public OrderItemDTO getOrderInfo(int bookId);

 

그림 2-1

 

 

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

 

	<select id="getOrderInfo" resultType="com.vam.model.OrderItemDTO">
	
		select bookId, bookPrice, bookDiscount
		from vam_book where bookId = #{bookId}
	
	</select>

 

그림 2-2

 

 

enrollOrder()

 vam_order 테이블에 데이터를 등록하는 메서드입니다.

 

 com.vam.mapper 패키지에 잇는 OrderMapper인터페이스에 메서드 선언부를 추가합니다.

 

	/* 주문 테이블 등록 */
	public int enrollOrder(OrderDTO ord);

 

그림 2-3

 

 

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

 

	<!-- 주문 테이블 등록 -->
	<insert id="enrollOrder">
	
		insert into vam_order(orderId, addressee, memberId, memberAddr1, memberAddr2, memberAddr3, orderState, deliveryCost, usePoint)
    	values(#{orderId},#{addressee}, #{memberId}, #{memberAddr1}, #{memberAddr2}, #{memberAddr3}, '배송준비', #{deliveryCost}, #{usePoint})
	
	</insert>

 

그림 2-4

 

 

enrollOrderItem()

vam_orderItem 테이블에 데이터를 등록하기 위한 메서드입니다.

 

 com.vam.mapper 패키지에 잇는 OrderMapper인터페이스에 메서드 선언부를 추가합니다.

 

	/* 주문 아이템 테이블 등록 */
	public int enrollOrderItem(OrderItemDTO orid);

 

그림 2-5

 

 

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

 

	<!-- 주문 아이템 테이블 등록 -->
	<insert id="enrollOrderItem">
	
		insert into vam_orderItem(orderId, bookId, bookCount, bookPrice, bookDiscount, savePoint)
		values(#{orderId}, #{bookId}, #{bookCount}, #{bookPrice}, #{bookDiscount}, #{savePoint})
	
	</insert>

 

그림 2-6

 

 

deductMoney()

 vam_member 테이블에서 회원의 돈, 포인트를 차감하기 위한 메서드입니다.

 

 com.vam.mapper 패키지에 잇는 OrderMapper인터페이스에 메서드 선언부를 추가합니다.

 

	/* 주문 금액 차감 */
	public int deductMoney(MemberVO member);

 

그림 2-7

 

 

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

 

	<!-- 주문 금액 차감 -->
	<update id="deductMoney">
	
		update book_member set money = #{money}, point = #{point} where memberid = #{memberId}
		
	</update>

 

그림 2-8

 

 

deductStock()

 회원이 주문한 상품의 개수만큼 '상품 재고'를 차감하기 위한 메서드입니다.

 

 com.vam.mapper 패키지에 잇는 OrderMapper인터페이스에 메서드 선언부를 추가합니다.

 

	/* 주문 재고 차감 */
	public int deductStock(BookVO book);

 

그림 2-9

 

 

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

 

	<!-- 주문 재고 차감 -->
	<update id="deductStock">
	
		update vam_book set bookStock = #{bookStock} where bookId = #{bookId}
	
	</update>

 

그림 2-10

 

 

 

2.2 CartMapper

deleteOrderCart()

 회원이 장바구니 경로를 통해서 주문을 한경우 주문 상품에 대한 장바구니 상품 정보는 삭제하기 위한 메서드입니다.

 

 com.vam.mapper 패키지에 잇는 CartMapper인터페이스에 메서드 선언부를 추가합니다.

 

	/* 카트 제거(주문) */
	public int deleteOrderCart(CartDTO dto);

 

 

 

 src/main/resources/com/vam/mapper 디렉토리의  CartMapper.xml 파일에 선언한 메서드가 실행할 쿼리문을 작성합니다.

 

	<delete id="deleteOrderCart">
	
		delete from vam_cart where memberId = #{memberId} and bookId = #{bookId}
	
	</delete>

 

그림 2-12

 

 

3. 테스트

 OrderMapper 메서드를 테스트하기 위해 src/test/java 경로에서 com.vam.mapper 패키지에 OrderMapperTests 클래스를 생성하였습니다.

 

그림 3-1

 

 

 테스트 용도로 사용하기 위한 기본 코드를 클래스 선언부에 추가해주었고 OrderMapper 객체를 의존성 주입해주었습니다.

 

 

 

 아래 코드는 OrderMapperTests.java 클래스에서 OrderMapper 메서드를 테스트하기 위해 작성한 코드입니다.

 

	/* 상품 정보(주문 처리) */
	@Test
	public void getOrderInfoTest() {
		
		 OrderItemDTO orderInfo = mapper.getOrderInfo(61);
		 
		 System.out.println("result : " + orderInfo);
	}
	
	/* vam_order 테이블 등록 */
	@Test
	public void enrollOrderTest() {
		
		OrderDTO ord = new OrderDTO();
		List<OrderItemDTO> orders = new ArrayList();
		
		OrderItemDTO order1 = new OrderItemDTO();
		
		order1.setBookId(61);
		order1.setBookCount(5);
		order1.setBookPrice(70000);
		order1.setBookDiscount(0.1);
		order1.initSaleTotal();
		
		
		
		ord.setOrders(orders);
		
		ord.setOrderId("2021_test1");
		ord.setAddressee("test");
		ord.setMemberId("admin");
		ord.setMemberAddr1("test");
		ord.setMemberAddr2("test");
		ord.setMemberAddr3("test");
		ord.setOrderState("배송중비");
		ord.getOrderPriceInfo();
		ord.setUsePoint(1000);
		
		mapper.enrollOrder(ord);		
		
	}
	
	/* vam_itemorder 테이블 등록 */
	@Test
	public void enrollOrderItemTest() {
		
		OrderItemDTO oid = new OrderItemDTO();
		
		oid.setOrderId("2021_test1");
		oid.setBookId(61);
		oid.setBookCount(1);
		oid.setBookPrice(70000);
		oid.setBookDiscount(0.1);
				
		oid.initSaleTotal();
		
		mapper.enrollOrderItem(oid);
		
	}	
	
	/* 회원 돈, 포인트 정보 변경 */
	@Test
	public void deductMoneyTest() {
		
		MemberVO member = new MemberVO();
		
		member.setMemberId("admin");
		member.setMoney(500000);
		member.setPoint(10000);
		
		mapper.deductMoney(member);
	}
	
	/* 상품 재고 변경 */
	@Test
	public void deductStockTest() {
		BookVO book = new BookVO();
		
		book.setBookId(61);
		book.setBookStock(77);
		
		mapper.deductStock(book);
	}

 

 

 아래 코드는 CartMapperTests.java 클래스에서 CartMapper 메서드를 테스트하기 위해 작성한 코드입니다. 

 

	/* 장바구니 제거(주문 처리) */
	@Test
	public void deleteOrderCart() {
		String memberId = "admin";
		int bookId = 3201;
		
		CartDTO dto = new CartDTO();
		dto.setMemberId(memberId);
		dto.setBookId(bookId);
		
		mapper.deleteOrderCart(dto);
		
	}

 

 

REFERENCE

  •  

 

 

DATE

  • 2020.12.20

 

728x90
반응형