첫번째카테고리별로 그룹핑을 해놨습니다.
그리고 그것은 Map<String,ArrayList<OrderInfoDomain>> 객체에 들어가 있습니다.
첫번째 카테고리별로 list를 가지고 있기 때문에, 이제 첫번째카테고리별 소계를 만들어 볼 수 있을 것 같습니ㅣ다.
구현하기 나름이겠지만..
일단, grouping을 했으니까 그것을 가지고 소계와 합계를 가지고 있을 Domain 객체를 새로 만들어서
넣어보겠습니다.
지금까지 작성된 StatusTable.java
현재 domainListGroupByFirstCategory에 그룹핑을 시켜놓은 상태는
첫번째카테고리소트키를 키로 갖고 해당 카테고리의 Domain 객체 리스트가 Map에 들어가 있는 상태입니다.
앞에서 그리려고 했던 표에서는 소계가 각 카테고리의 제일 상단에 나오기 때문에 각각의 첫번째카테고리에 해당되는 리스트의
제일 앞에 소계 domain 객체가 들어가야 합니다.
즉, domainListGroupByFirstCategory 여기에는
의류 = {청바지,치마,셔츠,면티 ... }, 가전 = {냉장고,TV,김치냉장고 ... }
이런식으로 Map형태로 객체들이 들어가 있는데
아래와 같은 식으로 만들어주려고 합니다.
의류 = {소계,청바지,치마,셔츠,면티 ... }, 가전 = {소계,냉장고,TV,김치냉장고 ... }
일단, 빈 값으로 넣어놓고 나중에 계산하려고 하는거죠...
소계를 만들어서 넣는 메서드입니다..
createSubTotalDomainObject()
일단 이정도로 하면 이제 원하는 모양을 만들 수 있게 됩니다.
각첫번째카테고리별로 소계가 맨 앞으로 나와있는 리스트를 얻게 됩니다.
소계 domain 객체의 첫번째카테고리는 자기가 속한 첫번째카테고리의 정보를 가지고 있어야하며
두번째카테고리(즉, 자기 이름... 청바지나 치마나 셔츠나..그런)는 "소계"라고 가지고 있습니다.
그럼 빈 값으로 들어가있는 소계는 어떻게 구할까요?
일단 딱 드는 생각은 위에 첫번째카테고리별로 list가 만들어져있으니까
이 list를 loop 돌면서 해당되는 값을 다 더해서
미리 만들어놓은 소계 Domain object에 넣어주면 될 것 같습니다.
하지만 약간의 문제가 있죠. 모든 필드를 전부 더하도록 해버리면
소트키나 카테고리명 같은 필드는 문자값을 갖기 때문에 더할 수가 없습니다.
그럼 어떻게 할까요.. 저 같은 경우는 Annotation을 사용했습니다.
소계나 합계가 필요한 column에 Annotation을 주고, 그 어노테이션이 적용된 필드에 대해서만
더하기를 하는거죠..
RequiredSum.java
RUNTIME시에 적용되며 그냥 메타정보를 표현하기 위한 것이기 때문에 간단합니다.
그럼 이제, 도메인 클래스에 위 커스텀 어노테이션을 적용합니다.
그럼, 소계를 구해보겠습니다.
일단, 소계를 구하기 위해서는 해당 도메인 클래스의 필드 리스트를 알아야 합니다.
그래야 필드를 돌면서 어노테이션을 체크하고 더할 수가 있습니다.
이를 위한 간단한 메서드를 구현하고, 필드의 리스트를 가지고 있을 fieldList를
StatusTable에 추가합니다.
그러면, 소계를 구해보겠습니다.
sumSubTotal(ArrayList
BeanWrapper 클래스나 PropertyAccessorFactory 클래스는 spring에서 제공되는 클래스들입니다.
이 클래스들이 없으면 저 부분이 전부 자바의 reflection api를 사용해서 구현되어야 합니다.
그 대신에 저 클래스를 사용하면 편리하죠..
일단, 소계 domain obejct를 빼놓고 각 list를 돌면서 어노테이션을 체크합니다.
그리고 어노테이션이 있으면 값을 더하는데, 그 필드의 type을 모르기 때문에 저런 방법을 사용했습니다..
(이부분은 더 좋은 방법이 있을 것 같은데..저는 잘 못 찾겠더라구요..^^)
더하는 방법은 subTotalDomain이 들어있는 값을 가져와서
계속 누적시켜서 더하는 방식입니다.
필드들이 기본적으로 0으로 초기화가 되어있으면 좋겠죠... ^^;
그러면, 이제 소계가 완성되었습니다.
그리고, 소계 domain object에도 다 카테고리별로 더해진 값이 들어가 있습니다.
그럼 이제 합계를 구하고, 최종적으로 화면에 뿌려지기 쉬운 모양으로 만드는 일이 남았습니다.
지금까지의 StatusTable.java입니다.
StatusTable.java
- 계속 -