본문 바로가기

DevStory

프로젝트를 진행하며 - 3 -

쿼리를 해서 받아온 DTO List에는 각각의 DTO가



이 각 ROW에 대응하여 값들을 가지고 있는 상태입니다.
즉, List에 DTO 15개가 들어가 있는 상태이지요. 만약, 뷰에서 보여질 테이블에 소계나 합계가 없다고 한다면
이 상태 그대로 뷰에서 loop를 돌면서 뿌려주면 됩니다.

하지만, 소계 합계가 필요하기 때문에 이를 구해줘야 하죠.. 제가 최종적으로 그려야 할 표는 아래와 같은 모양이었습니다.
카테고리 총주문액 목표주문액 주문이익액 이익목표액 총주문건수 방문자수 이익율 주문율
합계                
의류 소계                
점퍼                
바지                
셔츠                
티셔츠                
라운드티                
청바지                
치마                
가전 소계                
TV                
냉장고                
김치냉장고                
카메라                
오디오                
전화기                
전자레인지                
스포츠 소계                
운동화                


그리고 합계는 맨 윗줄에서 보여져야 합니다. 그리고 그 합계는 소계 DTO의 값은 제외한 상태에서 더해져야 하죠.
안그러면 값이 2배가 될테니까요.

그래서 현황 테이블을 그리기 위한 (기본적인 resultSet에 소계와 합계가 중간중간에 추가 되어 있는 테이블)
StatusTable 클래스 만들었습니다.

이 StatusTable 클래스는 최종적으로 resultDtolist라는 List를 만들어내는데 이 resultDtolist는 위 표의 순서대로

합계, (의류카테고리의 소계), 점퍼, 바지, 셔츠, 티셔츠, ... (가전 카테고리의 소계), TV, 냉장고, 김치냉장고, ... (스포츠 카테고리의 소계), 운동화

이렇게 dto를 가지고 있는 ArrayList입니다. 이것을 가지고 view에서 loop를 돌면서 그냥 순서대로 찍어주면 되는 것이죠..


일단, DB에서 받아온 dto list로 아래의 과정을 거칩니다.

1. 일단 결과로 받아온 dto list의 loop를 돌면서 비어있는 소계 dto를 하나 생성하여
새로운 list를 만들어 냅니다. 그리고 이것을 map에 집어 넣습니다.
이때의 키는 첫번째 depthid가 키가 됩니다. 즉 map객체는  각 그룹 (위의 경우에는 가전, 스포츠, 의류) 별로 자기가 소유한
dto의 리스트를 가지고 있는 형식이 됩니다.

Map<String,ArrayList<T>> dtoListGroupByDepth1 = new HashMap<String,ArrayList<T>>();

//String은 첫번째 category의 id, ArrayList<T>는 해당 category의 dto list

의류 = 소계,점퍼,바지,셔츠...
가전 = 소계,TV,냉장고,김치냉장고,카메라
스포츠 = 소계, 운동화

대략 위와 같은 형식의 Map 객체가 만들어집니다.
물론 이때의 소계 dto에는 아무값도 들어가 있지 않습니다. 단지
firstDepthId와 firstDepthName에는 자기 상위의 이름 (의류,가전,스포츠)을 가지고 있고, secondDepthName에는
"소계"라고 들어가 있습니다.

의사 코드로 표현하면 대략 이런식이겠죠..

대략 위와 같은 과정을 거쳐서 dto list를 다시 만들게 됩니다. 기본적으로 쿼리의 결과로 받아온 dto의 레퍼런스를 그대로 사용하고 다만 소계에 해당되는 dto를 만들기 위해서 getInitailizedDto(); 메소드를 사용해서 새로운 객체를 생성합니다. 위 과정을 거치면 위에서 작성한대로

의류 = 소계,점퍼,바지,셔츠...
가전 = 소계,TV,냉장고,김치냉장고,카메라
스포츠 = 소계, 운동화


이런 모양의 Map 객체가 만들어집니다. 여기서 keySet를 뽑아내면 의류,가전,스포츠가 나오게 되고 이 keySet과 Map 객체를 이용해 좌측의 메뉴를 그릴 수 있습니다.

합계
의류 소계
점퍼
바지
셔츠
티셔츠
라운드티
청바지
치마
가전 소계
TV
냉장고
김치냉장고
카메라
오디오
전화기
전자레인지
스포츠 소계
운동화

이런 좌측모양을 그릴 수 있을 것입니다.

이 keySet은 좌측 메뉴를 그릴때 카테고리의 순서를 정의하고 있는 것이기도 하지만
우측으로 dto를 뿌리기 위해 resultDtolist를 만들때 좌측 메뉴와 우측의 dto들을 서로 연결시켜주기도 합니다.
이 순서가 맞지 않으면 의류-셔츠의 메뉴 옆에 스포츠-운동화의 dto에 해당되는 값이 나올 수도 있겠죠.

그래서 이 하나의 keySet으로 좌측 메뉴와 우측 값을 일관성있게 만들어주는 것이 중요합니다.

dtoListGroupByDepth1 에 map 객체에 들어가있는 각 list의 순서를 바꾸지 않는 것도 중요하죠.

좌측메뉴는

keySet을 comparator등을 이용해 정렬 시키면 좌측 메뉴의 순서도 바꿀 수 있을 것입니다.

메뉴를 만드는 방식은 대략 위와 같이 될 것이고..keySet을 이용해서 이제 좌측 메뉴와 같은 순서대로 resultDtolist를 만들고 처음 빈 값으로 넣어줬던 소계 dto에 값을 더해주고 마지막으로는 합계 dto를 만들어서 resultDtolist 맨 처음에 추가해야 합니다.

합계가 맨 위에 나와야 하니까요..