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

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

반응형

프로젝트 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 bookId, bookPrice, bookDiscount from vam_book where bookId = #{bookId}

그림 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 into vam_order(orderId, addressee, memberId, memberAddr1, memberAddr2, memberAddr3, orderState, deliveryCost, usePoint) values(#{orderId},#{addressee}, #{memberId}, #{memberAddr1}, #{memberAddr2}, #{memberAddr3}, '배송준비', #{deliveryCost}, #{usePoint})

그림 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 into vam_orderItem(orderId, bookId, bookCount, bookPrice, bookDiscount, savePoint) values(#{orderId}, #{bookId}, #{bookCount}, #{bookPrice}, #{bookDiscount}, #{savePoint})

그림 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 book_member set money = #{money}, point = #{point} where memberid = #{memberId}

그림 2-8

deductStock()

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

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

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

그림 2-9

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

update vam_book set bookStock = #{bookStock} where bookId = #{bookId}

그림 2-10

2.2 CartMapper

deleteOrderCart()

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

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

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

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

delete from vam_cart where memberId = #{memberId} and bookId = #{bookId}

그림 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 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

반응형

from http://kimvampa.tistory.com/279 by ccl(A) rewrite - 2021-12-20 10:27:15