스프링으로 주문목록 만들기

KEH·2021년 2월 22일
1
post-thumbnail

스프링을 활용해 쇼핑몰을 만들고 있다. 오늘은 주문목록을 만들었던 과정에 대해 얘기하고자 한다. 먼저 완성된 화면을 공개한다!(프론트 쪽은 많이 신경을 쓰지 않았습니다 :))

현재 주문목록에서는 주문이 완료된 목록들만 확인할 수 있고,

1. 주문번호(order_code)
2. 주문날짜(order_date)
3. 배송상태(delivery_status)
4. 이미지 썸네일 url(thumbnail_url)
5. 상품명(product_name)
6. 주문한 갯수(product_quantity)

를 확인할 수 있도록 구현하였다.
테이블은 주문(order), 배송(delivery), 상품(product), 주문상세(order_detail) 테이블을 활용했다.

1. 주문, 배송 테이블을 조인하여 주문번호, 주문날짜, 주문상태, 배송상태를 검색했고,
2. 상품, 주문상세 테이블에서 주문번호, 상품번호, 주문수량, 상품명, 상품 썸네일 url을 검색하였다.


(위의 ERD 사진은 이해를 돕기 위해 제가 진행하는 프로젝트 ERD의 일부만 가져온 사진입니다.)


DB(MySQL)

<select id="getOrderDone" resultType="HashMap" parameterType="Integer">
	SELECT o.order_code, o.order_date, o.order_status, d.delivery_status
	FROM `order` as o INNER JOIN delivery as d
		ON o.order_code=d.order_code
	WHERE o.customer_code=#{customerCode} and o.order_status="done";
</select>

getOrderDone은 주문 테이블과 배송 테이블을 조인하여 해당 고객의 주문 완료된 주문코드, 주문날짜, 주문 상태, 배송 상태를 검색한 쿼리문이다.

<select id="getDoneProOdInfo" resultType="HashMap" parameterType="int">
	SELECT o.order_code, o.product_code, o.product_quantity, p.product_name, p.thumbnail_url
	FROM product as p INNER JOIN order_detail as o
		ON p.product_code=o.product_code
	WHERE o.order_code=#{orderCode}
</select>

getDoneProOdInfo는 상품 테이블과 주문 상세 테이블을 조인해 위에서 알게 된 주문코드들에 해당하는 상품 코드, 주문 수량, 상품명, 썸네일url을 검색하는 쿼리문이다.


최종 목표

주문 코드 하나 당 여러 개의 상품이 담길 수 있다. 따라서 나는 위의 두 쿼리문을 통해 얻은 두 결과를 합쳐 아래와 같이 JSON 형태로 만드는 서비스 함수를 작성했다.

[{"order_code": , 	
  "order_date": ,
  "order_status": ,
  "odProInfo":[
  	{"order_code": ,
    	 "product_code": ,
    	 "thumbnail_url": ,
         "product_name": ,
         "product_quantity": 
     	}, 
        {"order_code": ,
         "product_code": ,
    	 "thumbnail_url": ,
         "product_name": ,
         "product_quantity":
     	}, ...
   ], 
   "delivery_status":
  },
  {"order_code": ,	
  "order_date": ,
  "order_status": ,
  "odProInfo":[
  	{"order_code": ,
    	 "product_code": ,
    	 "thumbnail_url": , 
         "product_name": ,
         "product_quantity":
     	}, 
        {"order_code": , 
         "product_code": , 
    	 "thumbnail_url": , 
         "product_name": , 
         "product_quantity": 
     	}, ...
   ], 
   "delivery_status":
  },...
 ]
   

하나의 주문코드와 관련된 데이터는 getOrderDone, 하나의 주문코드에 담긴 각각의 상품과 관련된 데이터는 getDoneProOdInfo 쿼리를 통해 얻을 수 있다.


Service 함수

나는 고객코드를 전달받아 위와 같은 JSON 데이터 구조로 변환시키는 함수를 작성했다. (아직 초보라 코드가 많이 지저분해 보이고 깁니다. 열심히 작성한 코드니 많은 피드백 부탁드립니다.)

public List<HashMap<String, Object>> getOrderDone(Integer customerCode) {
	//마지막으로 리턴할 List 객체(위의 JSON 형태의 데이터)
	List<HashMap<String, Object>> orDoneInfoLi = new ArrayList<HashMap<String, Object>>();
	//고객코드를 통해 해당 고객의 주문완료된 리스트를 얻어옵니다.(JSON 데이터에서 odProInfo를 제외한 모든 데이터를 검색합니다.)
	List<HashMap<String, Object>> ordeliInfoes = orderMapper.getOrderDone(customerCode);
		
	for (HashMap<String, Object> ordeliInfo:ordeliInfoes) {
		//하나의 주문코드에 대한 정보를 담고 있는 해시맵 객체입니다.
		HashMap<String, Object> orDoneInfoHm = new HashMap<String, Object>();
			
		//하나의 주문코드에 담기는 정보들 중 상품과 관련된(odProInfo) 데이터를 제외한 모든 데이터를 해당 해시맵 객체에 저장합니다.
		orDoneInfoHm.put("order_code", ordeliInfo.get("order_code"));
		orDoneInfoHm.put("order_date", ordeliInfo.get("order_date"));
		orDoneInfoHm.put("order_status", ordeliInfo.get("order_status"));
		orDoneInfoHm.put("delivery_status", ordeliInfo.get("delivery_status"));
		log.info(orDoneInfoHm.toString());	//출력 결과 1번
			
		//하나의 주문코드에 담기는 모든 상품들에 대한 데이터를 가지는 List 객체를 생성합니다.
		List<HashMap<String, Object>> odProInfoLi = 
					odMapper.getDoneProOdInfo(Integer.parseInt(ordeliInfo.get("order_code").toString()));
		log.info(odProInfoLi.toString());	//출력 결과 2번
			
		//주문코드에 담기는 정보들 중 아까 담지 못했던 상품에 관한 정보를 저장합니다.
		orDoneInfoHm.put("odProInfo", odProInfoLi);
		log.info(orDoneInfoHm.toString());	//출력 결과 3번
			
		//최종 리턴되는 List 객체에 하나의 주문정보를 저장합니다.
		orDoneInfoLi.add(orDoneInfoHm);
	}
	log.info(orDoneInfoLi.toString());	//최종 리턴되는 결과
    
	return orDoneInfoLi;
}

출력 결과 1번 예시

{order_code=208, 
 order_date=2021-02-21 10:01:10.0, 
 order_status=done, 
 delivery_status=preparing}

해당 주문코드에 포함된 상품과 관련된 정보(odProInfo)를 제외하고 모두 저장돼 있는 것을 확인할 수 있다.

출력 결과 2번 예시

[
 {order_code=208, 
  product_code=6, 
  thumbnail_url=none.png, 
  product_name=나이키 볼캡, 
  product_quantity=5}, 
 {order_code=208, 
  product_code=17, 
  thumbnail_url=none.png, 
  product_name=카파 롱패딩, 
  product_quantity=1}, 
 {order_code=208, 
  product_code=16, 
  thumbnail_url=none.png, 
  product_name=아디다스 비니, 
  product_quantity=1}
]

주문번호가 208번에 해당하는 상품들의 정보가 모두 저장돼 있는 것을 확인할 수 있다.

출력 결과 3번 예시

{order_code=208, 
 order_date=2021-02-21 10:01:10.0, 
 order_status=done, 
 odProInfo=[
 	{order_code=208, 
 	 product_code=6, 
     	 thumbnail_url=none.png, 
     	 product_name=나이키 볼캡, 
     	 product_quantity=5}, 
    	{order_code=208, 
         product_code=17, 
         thumbnail_url=none.png, 
         product_name=카파 롱패딩, 
         product_quantity=1}, 
        {order_code=208, 
         product_code=16, 
         thumbnail_url=none.png, 
         product_name=아디다스 비니, 
         product_quantity=1}
        ], 
delivery_status=preparing}

주문번호 208번에 해당되는 모든 데이터를 저장하고 있는 것을 확인할 수 있다.

최종 리턴되는 결과

[{order_code=208, 
 order_date=2021-02-21 10:01:10.0, 
 order_status=done, 
 odProInfo=[
 	{order_code=208, 
  	 product_code=6, 
   	 thumbnail_url=none.png, 
  	 product_name=나이키 볼캡, 
  	 product_quantity=5}, 
 	{order_code=208, 
 	 product_code=17, 
 	 thumbnail_url=none.png, 
  	 product_name=카파 롱패딩, 
  	 product_quantity=1}, 
  	{order_code=208, 
	 product_code=16, 
 	 thumbnail_url=none.png, 
 	 product_name=아디다스 비니, 
  	 product_quantity=1}], 
 delivery_status=preparing}, 
{order_code=211, 
 order_date=2021-02-21 11:23:30.0, 
 order_status=done, 
 odProInfo=[
 	{order_code=211, 
 	 product_code=18, 
  	 thumbnail_url=none.png, 
  	 product_name=컨버스 신발, 
   	 product_quantity=1}], 
 delivery_status=preparing}, 
{order_code=214, 
 order_date=2021-02-22 08:12:46.0, 
 order_status=done, 
 odProInfo=[
 	{order_code=214, 
  	 product_code=3, 
   	 thumbnail_url=none.png, 
   	 product_name=FILA 운동화, 
   	 product_quantity=2}], 
 delivery_status=preparing}
]

이렇게 주문목록 페이지 구현이 완료되었다..!
제 글을 보시는 분들 중에 더 좋은 방법이 생각나시면 꼭 댓글이나 메일 부탁드립니다 :)

profile
개발을 즐기고 잘하고 싶은 안드로이드 개발자입니다 :P

0개의 댓글