[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);
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>
enrollOrder()
vam_order 테이블에 데이터를 등록하는 메서드입니다.
com.vam.mapper 패키지에 잇는 OrderMapper인터페이스에 메서드 선언부를 추가합니다.
/* 주문 테이블 등록 */
public int enrollOrder(OrderDTO ord);
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>
enrollOrderItem()
vam_orderItem 테이블에 데이터를 등록하기 위한 메서드입니다.
com.vam.mapper 패키지에 잇는 OrderMapper인터페이스에 메서드 선언부를 추가합니다.
/* 주문 아이템 테이블 등록 */
public int enrollOrderItem(OrderItemDTO orid);
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>
deductMoney()
vam_member 테이블에서 회원의 돈, 포인트를 차감하기 위한 메서드입니다.
com.vam.mapper 패키지에 잇는 OrderMapper인터페이스에 메서드 선언부를 추가합니다.
/* 주문 금액 차감 */
public int deductMoney(MemberVO member);
src/main/resources/com/vam/mapper 디렉토리의 OrderMapper.xml 파일에 선언한 메서드가 실행할 쿼리문을 작성합니다.
<!-- 주문 금액 차감 -->
<update id="deductMoney">
update book_member set money = #{money}, point = #{point} where memberid = #{memberId}
</update>
deductStock()
회원이 주문한 상품의 개수만큼 '상품 재고'를 차감하기 위한 메서드입니다.
com.vam.mapper 패키지에 잇는 OrderMapper인터페이스에 메서드 선언부를 추가합니다.
/* 주문 재고 차감 */
public int deductStock(BookVO book);
src/main/resources/com/vam/mapper 디렉토리의 OrderMapper.xml 파일에 선언한 메서드가 실행할 쿼리문을 작성합니다.
<!-- 주문 재고 차감 -->
<update id="deductStock">
update vam_book set bookStock = #{bookStock} where bookId = #{bookId}
</update>
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>
3. 테스트
OrderMapper 메서드를 테스트하기 위해 src/test/java 경로에서 com.vam.mapper 패키지에 OrderMapperTests 클래스를 생성하였습니다.
테스트 용도로 사용하기 위한 기본 코드를 클래스 선언부에 추가해주었고 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