on
[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