티스토리 뷰

반응형

처음에 Streamlined Operation의 맛을 보았을 때 황당했었는데.. 마치 유주얼서스팩트의 마지막을 보는 듯한..느낌이였죠, 그런데, 그걸 글로 표현해서 보여줄려면 어떻게 해야 할까..고민하다가 제목의 주제로 추가 작성을 하기로 했다.


1. 서버사이드 기술과 클라이언트 사이드 기술
정리를 하고 시작해 보자.

1-1. SL5_BOARD.Web 프로젝트에서 사용되는 기술
: SQL Server Compact 4.0 + Entity Framework 4.1 (Streamlined Database)
: 서버단에서는 SL5_BOARD_DBCONTEXT를 통해 모든 데이터를 관리, 그렇기 때문에 LINQ쿼리를 통해서 마음대로 불러내고 저장하고 떡주무르듯 할 수 있음

1-2. SL5_BOARD 프로젝트에서 사용되는 기술
: WCF RIA Service Support EF4.1
: 서버에 있는 데이터를 일단은 클라이언트까지 전송하는 기능, 전송된 데이터를 관리하는 기능, 하지만, 역시 데이터가 서버에 존재 하기 때문에 클라이언트까지 가지고 오는 것이 선행되어야 함


2. 짐승같은 코딩과 인간같은 코딩

위의 둘은 요렇게 서로 연결이 되어있다..(이렇게 연결시키기 위해서 열심히 이것 저것 했으니..되어야징..) 그런데 연결을 왜 해 놓은걸까? 방금 전 소스상에서 연결해 놓은 덕을 보았나? 그렇게 할려면 뭐한다고 연결하는 것인가? 음음음...그러게..여태까지 짐승같은 코딩을 해 놓은 거내~~~~~~~~~~~~~이제 짐승코딩에서 인간코딩으로 바꿔보자..그래서 인간이 되어야 인간답게 살 수 있는 거다.


2-2. 짐승같은 코딩
BOARD_MAIN에 셀렉트 채인지 이벤트 발생시마다, 해당 데이터를 조해서 다시 뿌려주는..코딩

//그리드 셀렉션 체인지 이벤트 처리
private void bOARD_MAINDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    //컨테이너에 데이터가 존재 한다면
    if (dsContext.EntityContainer != null)
    {
        //리스트의 내용을 지워놓고
        dsContext.BOARD_LISTs.Clear();
        //선택된 BOARD_MAIN을 일단 넣궁
        BOARD_MAIN bm = e.AddedItems.Cast<BOARD_MAIN>().FirstOrDefault();

        //BOARD_MAIN에 속해있는 BOARD_LIST만 조회
        dsContext.Load(dsContext.GetBoardListByBoardMainQuery(bm.BOARD_MAIN_IDX), LoadBehavior.RefreshCurrent, true);
    }
}

2-3. 인간같은 코딩
: 딱 필요할 때만 데이터를 서버에서 불러오고, 그 외에는 자체 해결~

수정 포인트 1

MainPage.xaml.cs

private void bOARD_MAINDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

    //선택된 BOARD_MAIN을 넣구
    BOARD_MAIN bm = e.AddedItems.Cast<BOARD_MAIN>().FirstOrDefault();

    //BOARD_MAIN에 속해있는 BOARD_LIST의 카운트가 0이거나, BOARD_MAIN이 변경되었을 경우
    if (bm.BoardLists.Count == 0 || bm.HasChanges == true)
    {

        //BOARD_MAIN_IDX가 들어있는 BOARD_LIST 조회
        dsContext.Load(dsContext.GetBoardListByBoardMainQuery(bm.BOARD_MAIN_IDX), LoadBehavior.RefreshCurrent, true);
    }
}


수정 포인트 2

MainPage.xaml

<sdk:DataGrid AutoGenerateColumns="False" Grid.Row="3"
              ItemsSource="{Binding SelectedItem.BoardLists, ElementName=bOARD_MAINDataGrid}"
              Name="bOARD_LISTDataGrid"
              RowDetailsVisibilityMode="VisibleWhenSelected">

바인딩 항목이 바뀌었다. 전에는 ItemsSource="{Binding Path=BOARD_LISTs}" 라는 항목을 바인딩 했었지만 지금은 BOARD_MAIN이 표시되는 그리드의 선택된 내용에 있는 BoardLists라는 항목을 바인딩 한다. 무슨 차이가 있을까??

지금부터 5분간 머리속으로 상상을 해보기 바란다. 그 차이를 찾는다면 왜 이게 인간같은 코딩인지 알 수 있을 것이다.


2. 열심히 로딩과 게으른 로딩(Eagerly loading and Lazy loading)
위와 같은 인간같은 코딩의 기본에는 열심히 로딩과 게으른 로딩(명시적 로딩과 비명시적 로딩 혹은 동기, 비동기 로딩)이란 베이스 기술이 필요하다.

Using DbContext in EF 4.1 Part 6: Loading Related Entities

http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

BOARD_MAIN은 이미 BOARD_LIST 중 어떤 넘이 자신을 찍었는지 알고 있다..다만 어떤 넘인지 표현 하려면, BOARD_LIST가 로딩이 되어야 가능하고, 로딩하는 시간과 방법에 따라 2가지로 구분을 한것이다. 좀 더 자세히 살펴 보면, BOARD_MAIN.cs 파일을 보면 아래와 같은 내용이 있었는데..

public virtual ObservableCollection<BOARD_LIST> BoardLists { get; set; }

여기서 virtual을 사용해준것이 게으른 로딩 방식을 사용하겠다는 뜻이다. 즉, 처음에 로딩할때 데이터 없이 그냥 로딩이 된다 하더라도, 나중에 데이터가 Context로 로딩이 되어 들어온다면 그 때 바인딩을 하겠다는 것이다.

3. 결과는 4회차 강좌나 5회차 강좌나 동일하다.
하지만, 그 내용적인 측면에서는 큰 의미를 가지고 있이며, 그걸 가지고 가기를 원한다. MS사의 개발 철학은 Decouple, Asynchronous, Loosely, Lazy 로 이동 중이며, Windows 8이 발표 되면서 정점을 찍을 것으로 생각된다.

반응형
댓글