본문 바로가기

Java

그냥 한번 생각해보는 글. - 1 -

보통 DTO 나 VO 를 사용 할 때

(사실 저는 DTO나 VO나 Domain에 대한 정의가 명확하지 않아서...그냥 이후 Domain 클래스라고 할게요...)

일반적으로 필드를 정의하고 나서 getter,setter 메소드를 준 상태로

사용하는 경우를 많이 봤습니다.

어떠한 로직도 들어가지 않는 경구가 많고, 단순히 값을 전달하기 위한 객체로 사용하기도 합니다.

그렇기 때문에 굳이 Domain 클래스를 새로운 클래스로 만들지 않고, Map으로 사용하는 경우도 있습니다.

만약에 주문에 대한 정보를 관리하는 뭔가를 만든다고 해보면..



OrderInfoDomain.java

대략 요런 모양이 나올겁니다.

카테고리는 Id와 이름이 한쌍으로 이루어집니다.

그리고 소트키는 나중에 표에서 나오는 정렬 순서를 결정 할 때 사용되고
뒤에서 또 카테고리별로 domain 객체를 grouping 할때도 사용하려고 합니다.

다른 정렬순서도 많을거고, 그에 따라 구현방법도 달라지겠지만 일단 이 포스트에서는
카테고리명이나 카테고리Id 둘 중 하나로 정렬하는 것으로 가정하려고 합니다.

그러면 이제 DAO에서 쿼리를 돌리고 Spring의 JDBCTemplate을 사용하던 뭐 다른걸 사용하던 DB로 부터 값을 가져와서
setter메서드를 사용해서 값을 넣을 것입니다.

만약에 group by 카테고리 로 쿼리를 하게 되면 카테고리별 주문정보를 얻을 수 있을 것 입니다.

SELECT SUM(총주문액), SUM(클릭수) ... , 첫번째카테고리, 두번째카테고리
FROM TABLE
WHERE 기준날짜 BETWEEN '1월1일' and '1월31일'
GROUP BY 첫번째카테고리, 두번째카테고리


이런식으로 쿼리를 하게 되면 카테고리별 1일부터 31일까지의 주문정보가 나올거구요...

1. 합계와 소계는?
일반적으로 이러한 정보를 카테고리별로 보는 이유는 그 각각의 데이터도 의미가 있지만
카테고리별 소계, 그리고 1일부터 31일까지의 총 합계등을 보고 싶은 것이 이유입니다.
일반적으로 표의 모양은 아래와 같은 모양을 띄게됩니다.

카테고리 총주문액 클릭수 이익액 ... ... ... ... 주문율
합계                
의류 소계                
점퍼                
바지                
셔츠                
티셔츠                
라운드티                
청바지                
치마                
가전 소계                
TV                
냉장고                
김치냉장고                
카메라                
오디오                
전화기                
전자레인지                
스포츠 소계                
운동화              

그럼 합계와 소계는 어떻게 할까요?

우선 쿼리에서 가져오는 방법이 있습니다. 쿼리시에 WITH ROLLUP이나 기타 다른 방법을 사용하면
위 표와 비슷한 모양으로 Result Set을 가져 올 수 있습니다. 이때 일반적으로 소계나 합계가 위의 표 모양처럼 상단에 나오는 것이 아니라 각 카테고리의 하단에 나오기 때문에 이 Result Set을 위 표 모양대로 화면에 뿌려주기 위해서는
View에서 뭔가 작업을 해줘야 합니다.

또 하나의 방법은 쿼리에서 합계,소계를 내지 않고
Application에서 합계, 소계를 내는 것입니다.
당연한 것이지만, 합계나 소계도 다른 카테고리의 주문정보를 가지고 있는 Domain 객체와 마찬가지로 똑같이
주문액, 클릭수, 이익액, 첫번째카테고리, 두번째 카테고리에 대한 정보를 가지고 있는 또 하나의 Domain 객체일 뿐이라고 생각했습니다.

[첫번째카테고리 = 가전, 두번째 카테고리 = 소계] 인 하나의 Domain 객체일 뿐이라고..
소계나 합계라고 해서 다른 Domain 객체가 가지고 있지 않은 뭔가를 혼자 가지고 있지 않습니다.

일단, 쿼리로는 단순히 그룹핑된 데이터만을 가지고 왔습니다.

소트키는 일단 Id로 소트하기 위해서 Id로 select를 했구요..

아마 이런 모양이겠지요..

<Result Set-1>
 첫번째카테고리명 두번째카테고리명  첫번째카테고리Id  두번째카테고리Id  첫번째소트키  두번째소트키  주문액  이익액  클릭수  ... 
 의류  청바지  A0  B0  A0  B0  000  000  000  
 의류  치마  A0  B1  A0  B1  000  000  000  
 의류  셔츠  A0  B2  A0  B2  000  000  000  
 의류  면티  A0  B3  A0  B3  000  000  000  
 의류  점퍼  A0  B4  A0  B4  000  000  000  
 의류  슈트  A0  B5  A0  B5  ...  ...  ...  
 가전  TV  A1  B6  A1  B6        
 가전  냉장고  A1  B7  A1  B7        
 가전  오디오  A1  B8  A1  B8        
 가전  세탁기  A1  B9  A1  B9        
 가전  김치냉장고  A1  B10  A1  B10        

일단, 소계부터 생각해볼게요..

소계는 첫번째 카테고리에 해당되는 것들의 합입니다.
그러면 일단 쿼리를 돌려서 위와 같은 Result Set을 얻고, Domain 객체의 리스트로 결과를 얻어온다고 해보겠습니다.

대략 요런 모양새가 되겠죠.

List<OrderInfoDomain> resultList = dao.getOrderInfoDomainList();

 위 resultList를 loop로 돌리면서 찍어내면 , 아마 바로 위의 <Result Set-1>의 모양과 똑같은 모양으로 찍힐 것입니다.

그러면 이제 소계를 구해야 할텐데.. 소계는 위에 잠깐 언급했듯이 각 첫번째 카테고리에 해당되는 것들의 합입니다.

소계를 구하기 위해서 Table클래스를 하나 만들어보겠습니다. 이 Table클래스는 View에

표를 그릴때 사용 할 결과 리스트를 만들어 낼 클래스로, dao에서 resultList를 받아서 소계와 합계를 만들어 넣고

정렬등의 역할을 하게 될 것입니다. 그렇게 만들어낸 List를 View에서는

table.getResultList() 이런식으로 받아와서 사용하게 될 것입니다.

- 계속.. -