! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

DataEngine vs LINQ - 데이터 변환 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

DataEngine vs LINQ - 데이터 변환

페이지 정보

작성자 GrapeCity 작성일 2020-07-17 00:00 조회 4,455회 댓글 0건

본문

ComponentOne DataEngine 라이브러리에는 데이터 분석 및 탐색을 가속화하는 열 지향적 파일 기술 및 메모리 매핑 파일 기술과 같이 즉시 사용 가능한 비즈니스 인텔리전스 기능이 있습니다. DataEngine(C1DataEngine)은 비즈니스 요구 사항과 관련이 있으므로 여러 소스의 데이터를 변환하는 데 도움을 줍니다.

그럴듯하게 들리지만, DataEngine이 나오기 전에는 어떻게 했을까요? LINQ, IEnumerable 메서드 또는 SQL을 조합했을 가능성이 가장 큽니다. ComponentOne DataEngine은 데이터 변환을 더 쉽게 할 의도로 만들어진 것은 아닙니다(일부 상황에서는 실제로 그러하지만). LINQ는 C# 언어에 바로 통합된 쿼리 기능 집합이며, 데이터 변환을 매우 쉽게 만드는 데 크게 일조했습니다. DataEngine의 진정한 가치는 일체형 작업 영역 방법론 및 LINQ에 비해 개선된 성능에서 확인할 수 있습니다.

이 게시글에서는 ComponentOne DataEngine을 사용하여 공통 데이터 변환을 어떻게 수행하는지를 모두에게 친숙한 공통 솔루션인 LINQ 쿼리와 비교하여 설명하겠습니다. 데이터를 선택, 그룹화 및 필터링하여 일부 공통 데이터 변환을 해결하는 과정을 살펴봅니다.


JSON 연결 및 선택

우선 JSON 데이터를 공용 Northwind OData 서비스에서 쿼리 가능한 개체 컬렉션으로 가져오겠습니다. 이 단계는 LINQ, IEnumerable 메서드, C1DataEngine 중 어떤 것을 사용하든 동일합니다.

이 코드는 Newtonsoft.Json 라이브러리를 사용하여 JSON 데이터를 구문 분석하고 사용자 정의 Invoice 개체 목록에 채웁니다. 유사한 샘플을 당사 서비스 컴포넌트를 통해 다운로드하거나 온라인에서 찾아볼 수 있습니다.

// get NorthWind Invoice JSON data  
WebClient wc = new WebClient();  
string download = wc.DownloadString("https://services.odata.org/v4/Northwind/Northwind.svc/Invoices");  
JObject root = JObject.Parse(download);  
JArray values = (JArray)root["value"];  
List<Invoice> collection = JsonConvert.DeserializeObject<List<Invoice>>(values.ToString());  


DataEngine 작업 영역 만들기

LINQ 또는 표준 데이터 변환 기술을 사용하는 경우에는 각 변환 및 이를 통해 생성된 컬렉션에 대한 관리를 책임져야 합니다. 다시 말하면 데이터가 메모리에 저장되는 방식을 효율적으로 관리해야 합니다.

DataEngine에서는 앱이 사용자에게 요구하는 각종 쿼리를 모두 ‘workspace’ 패러다임을 사용하여 유지하고 관리합니다. 이를 위해 시작 부분에 코드 몇 줄이 추가로 필요하지만 그럴 만한 가치가 있습니다. 작업 영역에는 메타데이터를 저장하기 위한 로컬 파일 공간(앱에 따라 다름)이 있어 열 매핑 및 캐싱에 도움을 주며, 더 많은 작업 데이터의 성능을 개선합니다.

다음은 작업 공간을 설정하는 데 필요한 코드입니다.

string path = "workspace"; // absolute or relative path to the workspace folder  
Workspace workspace = new Workspace();  
workspace.Init(path);  
workspace.Clear(); 


가져온 사용자 정의 개체 컬렉션에 DataEngine을 연결하려면 매개 변수를 생성자에 연결하는 것처럼 ObjectConnector 클래스의 인스턴스를 만들고 Workspace 개체 및 앞에서 초기화된 사용자 정의 컬렉션을 전달합니다. GetData 메서드는 가져온 데이터를 포함하는 DataEngine 테이블을 만듭니다.

var connector = new ObjectConnector<Invoice>(workspace, collection);  
connector.GetData("Invoices");  
workspace.Save(); 

작업 공간을 비우고 저장하면 변경 내용이 로컬 저장된 파일에 커밋됩니다.


LINQ 및 DataEngine에서 쿼리 그룹화

연결이 되었으면, 다음 단계는 데이터를 그룹화하고 양을 집계하는 것입니다. LINQ를 사용하는 경우에는 그룹화하고 집계하려는 필드에서 group 연산자와 sum 확장자를 사용합니다. 이 연산으로 새 목록이 생성되므로, 전체 데이터 집합에서 새로 그룹화된 데이터 집합으로 가져오려는 열도 모두 지정해야 합니다.

이 코드는 Salesperson별로 그룹화되고 LINQ를 사용하여 ExtendedPrice 필드를 집계합니다. 그런 다음에 목록으로 변환되면 데이터 그리드를 채울 수 있습니다.

var results = (from inv in collection  
            group inv by inv.Salesperson into g  
            select new Invoice  
            {  
                Salesperson = g.Key,  
                ExtendedPrice = g.Sum(pc => pc.ExtendedPrice)  
            }).ToList();  


DataEngine을 사용하는 경우에도 유사한 기술을 사용하게 되지만, 새 개체 목록을 정의할 필요는 없습니다. 대신 새로운 작업 공간 뷰를 정의하고 이름을 “SalesByEmployee”로 지정합니다. 이 뷰는 두 가지 필드로 정의됩니다. 즉 ExtendedPrice 값의 합계인 Salesperson 및 Sales입니다.

dynamic invoices = workspace.table("Invoices");
​
dynamic query = workspace.query("SalesByEmployee", new  
{  
  invoices.Salesperson,  
  Sales = Op.Sum(invoices.ExtendedPrice)  
});
​
query.Query.Execute();  

LINQ 및 C1DataEngine 예제 모두에서 집계 메서드의 사용 방법은 유사하지만, 결정적 차이는 DataEngine이 작업 공간 쿼리를 정의하고 있다는 점입니다. 그것이 추가 뷰의 정의를 아주 쉽게 만듭니다. 예를 들어 고유한 Salesperson 및 Country 페어링을 각각 그룹화하도록 그룹을 수정해 보겠습니다. 그러면 각 country.Using DataEngine별로 각자 판매한 총계를 알 수 있으므로, 새 쿼리를 작업 공간에 추가하고(이때 이름은 “SalesByEmployeeCountry”) Country 필드를 쉽게 추가할 수 있습니다. DataEngine은 지금은 더 복잡해진 그룹화 로직을 처리합니다.

dynamic query = workspace.query("SalesByEmployeeCountry", new  
{  
  invoices.Salesperson,  
  invoices.Country,  
  Sales = Op.Sum(invoices.ExtendedPrice)  
});
​
query.Query.Execute();  


DataEngine의 쿼리로 데이터 그리드를 채우기 위해 작업 공간에서 GetQueryData를 호출하고 여기서 필요한 쿼리를 쉽게 바꿉니다.

dataGridView1.DataSource = workspace.GetQueryData("SalesByEmployeeCountry");

LINQ를 사용하여 같은 작업을 수행할 수 있을까요? LINQ 쿼리에서 개체별로 더 복잡한 그룹을 정의하면 가능합니다. 이것은 더 복잡해지기 시작하는 지점입니다. 구문에서만 참조(Google 검색)가 필요합니다. 따라서 어떤 면에서는 DataEngine이 복잡한 변환을 더 쉽게 코드화할 수 있도록 만듭니다.

var results = (from inv in invoices  
              group inv by new { inv.Salesperson, inv.Country } into g  
              select new Invoice  
              {  
                  Salesperson = g.Key.Salesperson,  
                  Country = g.Key.Country,  
                  ExtendedPrice = g.Sum(pc => pc.ExtendedPrice)  
              }).ToList();  
dataGridView1.DataSource = results;

LINQ 및 DataEngine에서 쿼리 필터링

한 특정 국가(영국)에 대한 레코드만 표시하기 위해 데이터 집합에 대해 다음으로 수행하려는 데이터 변환은 필터입니다.

LINQ를 사용하는 경우에는 아래와 같이 where 연산자를 group 연산자 앞에 추가합니다.

var results = (from inv in invoices  
              where inv.Country.Equals("UK")  
              group inv by new { inv.Salesperson, inv.Country } into g  
              select new Invoice  
              {  
                  Salesperson = g.Key.Salesperson,  
                  Country = g.Key.Country,  
                  ExtendedPrice = g.Sum(pc => pc.ExtendedPrice)  
              }).ToList();  

DataEngine을 사용하여 필터를 설정하기 위해 아래와 같이 다시 새 이름으로 쿼리를 정의하고 _filter 구성원을 설정합니다. 쿼리의 이름은 “SalesByEmployeeUK”처럼 적절히 지정되며, 앞의 예제와 같이 Salesperson, Country별로 그룹화되고 ExtendedPrice를 집계합니다.

dynamic query = workspace.query("SalesByEmployeeUK", new  
{  
  \_filter = invoices.Country.Eq("UK"),  
  invoices.Salesperson,  
  invoices.Country,  
  Sales = Op.Sum(invoices.ExtendedPrice)  
}); 


DataEngine 필터링은 ColumnCondition 클래스의 And 메서드뿐만 아니라 Or 메서드를 사용하여 수행할 수 있습니다. 이로써 더 복잡한 필터를 빌드할 수 있습니다.

예: _filter = invoices.Country.Eq("UK").Or().Eq("Spain")


LINQ 및 DataEngine에 대한 결론

위 예제들은 공통 데이터 변환을 위한 LINQ와 DataEngine의 코드가 얼마나 비슷한지를 보여줍니다. 중요한 차이라면, DataEngine은 데이터 뷰 컬렉션을 빌드할 수 있는 작업 공간 패러다임을 사용한다는 점입니다.

DataEngine은 여러 열 또는 연결된 필터 식으로 그룹화하는 등의 복잡한 변환일 때 내부적으로 대량 작업을 수행합니다. 그리고 내부 메모리 덕분에, 데이터 용량이 커질수록 캐싱을 통해 성능을 개선할 수 있습니다.

  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그1

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.