티스토리 뷰

반응형

간단하게 한가지만 추가할려고 한다.

대량의 데이터를 한번에 불러오는 경우 불러오는데 시간이 오래 걸리고, 그 데이터가 불러오기 전까지는 화면에 출력되는 내용이 없다. 그래서, 주로 사용하는 방식이 페이징 방식인데.. 페이징 방식의 경우에는 모든 데이터를 한번에 볼 수 없기 때문에..울나라 사람들이 조아하는 엑셀로 한방에 출력하기시에 문제가 있다..

그런 문제의 해답으로 점진적 로드 방식이 있는데, 한번에 20-40개 정도의 로우만을 여러번 불러오는 것이다. 그럼 일단 화면에 데이터가 출력되어있기 때문에 프로그램이 느리다는 이야기는 듣지 않을 것이고, 좀 시간을 두고 기다리면 모든 데이터가 어느세 꽉~ 차고, 마음도 한결 가벼워 질 것이다.


1. DomainService1.cs 수정
일단 WCF RIA에 함수를 하나 추가한다. 조건을 인수로 받아서 해당대는 데이터를 ID 순으로 소트해서 반환하는 함수이다.
여기서 중요한 사항은 꼭 orderby문이 포함되어 있어야 한다는 것이다.

//날짜를 인수로 받아서 해당 조건에 만족하는 데이터만 반환한다.
public IQueryable<Order> GetOrders_By_Condition(DateTime FromDate, DateTime ToDate)
{
    var query = from order in this.ObjectContext.Orders
                where order.Order_Date >= FromDate && order.Order_Date <= ToDate
                orderby order.Order_ID
                select order;

    return query.AsQueryable();
}

작성이 완료되었으면 웹 프로젝트를 빌드한다. 빌드를 해줘야 추가된 함수를 실버라이트에서 사용 할 수 있다.


2. SL4_RIA_Sample 프로젝트에 Silverlight User Control을 하나 추가한다.
이름은 Orders.xaml로 한다.
Data Sources 메뉴를 클릭한다.

Order에 콤보박스 다운 버튼을 클릭하면 위와 같이 나온다.(한번에 앙나오면 다시 컴파일 하고 다시 열어본다) 여기서 GetOrders_By_ConditionQuery를 선택하고 드레그 드롭으로 Orders.xaml에 컨트롤을 만들고, 약간의 작업을 더해주어 아래와 같은 화면을 만든다.

일단 컨트롤을 만들어서 화면에 출력될 수 있는 기본은 만들었고, 실버라이트가 시작되었을 때 맨 처음으로 이 화면을 사용하도록 수정한다.

App.xaml.cs
private void Application_Startup(object sender, StartupEventArgs e)
{
     this.RootVisual = new Orders();
}

실행해보자

데이터가 1991년 부터 1995년까지 있기 때문에..1년간의 날짜를 입력한 후 Load버튼을 눌러서 조회를 해봤다.
모든 데이터가 한번에 쫘악 펼쳐지며 보인다. 아주 만은 데이터는 아니라서 빠르게 표시가 된다. 그러나 날자를 1995년까지로 변경하고 조회하면 처음에 화면 뜨는 속도가 무척 느리다는 것을 알 수 있다.


3. 점진적 로드 방식으로 변경

Orders.xaml

//WCF RIA Service 데이터 컬렉션을 로드, 필터링, 그룹화 및 정렬하기 위한 개체

//http://msdn.microsoft.com/ko-kr/library/system.windows.controls.domaindatasource_members(v=vs.91).aspx


<riaControls:DomainDataSource AutoLoad="False"
                              d:DesignData="{d:DesignInstance my:Order, CreateList=true}" Height="0"
                              LoadedData="orderDomainDataSource_LoadedData"
                              Name="orderDomainDataSource" LoadSize="40" LoadInterval="00:00:04"
                              QueryName="GetOrders_By_ConditionQuery"
                              Width="0" Margin="0,0,400,29">
    <riaControls:DomainDataSource.DomainContext>
        <my:DomainService1 />
    </riaControls:DomainDataSource.DomainContext>
    <riaControls:DomainDataSource.QueryParameters>
        <riaControls:Parameter ParameterName="FromDate" Value="{Binding ElementName=fromDateTextBox, Path=Text}" />
        <riaControls:Parameter ParameterName="ToDate" Value="{Binding ElementName=toDateTextBox, Path=Text}" />
    </riaControls:DomainDataSource.QueryParameters>
</riaControls:DomainDataSource>

위의 LoadSize와 LoadInterval을 이용하면 한번에 몇개씩 몇 초후에 가지고 오는 지를 지정해서 순서대로 데이터를 가지고 올 수 있다.

(시작 - 스크롤 바의 크기를 보면 된다.)

(로딩 중 - 스크롤 바의 크기가 줄어 들었다)



4. WCF로 전송되는 데이터량 늘리기
한번에 전송되는 양이 생각보다 적어서, 좀더 늘릴 필요가 있을 때 사용한다.

Web.config

  <system.serviceModel>
    <domainServices>
      <endpoints>
        <add name="OData" type="System.ServiceModel.DomainServices.Hosting.ODataEndpointFactory, System.ServiceModel.DomainServices.Hosting.OData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </endpoints>
    </domainServices>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="True" />
          <serviceDebug includeExceptionDetailInFaults="True" />
          <dataContractSerializer maxItemsInObjectGraph="655360" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>


5. 실버라이트는
스트림라인드 오퍼레이션이 기본이기 때문에, 모든 데이터를 한번에 다 불러와야 보여지는 그런 화면은 좋은 화면이 아니다. 개발시에는 꼭 참고 하기 바란다. 그리고, 추가 강의 요청이 없어서..그냥 생각 날때 마다 하나씩 올려 놓을려고 한다.(요청은 환영)

반응형
댓글