블로그 이미지
내게 능력 주시는 자 안에서 내가 모든것을 할수 있느니라 - 빌립보서 4 : 13 - happydong

카테고리

Happydong (1363)
프로그래밍 (156)
MUSIC (16)
인물 (3)
Utility (10)
세미나 소식&내용 (22)
IT뉴스 (18)
운동 (830)
CAFE (10)
Life (282)
Total
Today
Yesterday




ㅁ 통신의 목적

 통신하는 상대방 사이에 정확하고, 효율적이며, 안전한 정보의 전송을 목적으로 한다.

 

-->데이터 전송의 흐름.

1.     에러 없이 정보를 수신하였으면 ACK를 보낸다.

2.     에러가 있었으면 NAK를 보낸다.

3.     NAK를 받으면 이전에 보내 온 정보를 다시 보낸다.

4.     16회 이상 계속해서 에러가 발생하면 통신도 중단한다.

 

ㅁ 통신의 불완전성

 통신하려는 상대방이 정보를 전송하기 위해 통신 채널을 통해 전송할 때 정상적인 정보를 훼방 놓는 여러가지 현상이 있다. 이러한 훼방 해위는 통칭하여 불완전성(impairment,전송에러)이라고 한다.

 통신의 불완전성이 초래하는 결과로는 신호의 감쇄, 왜곡 등을 초래하며 이와 함께 통신 채널에 존재하는 잡음과 더불어 에러의 원인이 된다.

 

ㅁ 에러제어와 동기

-à 에러제어 : 통신 프로토콜에서는 이러한 에러가 발생하였을 때 어떻게 에러의 발생 사실을 알아내고 손실된 정보를 회복할 것인가에 대한 엄밀한 절차, 즉 에러제어가 사전에 약속되어 있어야 한다. 이렇게 되어 있어야만이 통신의 불완전성을 극복할수 있는 방법이다.

 

-à 동기(synchronization) : 정보를 정확하게 전송하기 위해서는 동기(synchronization)의 개념 필요!

 

ㅁ 흐름제어

 정보의 양을 조절하는 흐름제어(flow control)방법도 사전에 미리 약속되어야 한다. , 흐름 제어는 정보의 송신 측에서 너무 빠르게 정보를 보내는 바람에 수신 측에서 이를 미처 소화하지 못함으로써 정보의 손실을 가져오는 사태를 막기 위한 방법을 말한다.

 

 

ㅁ 프로토콜의 기본 개념

 서로 다른 시스템에 있는 두 실체(entity)간의 신뢰성 있고, 효율적인 정보를 주고 받기 위해서 정보의 송.수신측 또는 네트워크 내에서 사전에 약속된 규약 또는 규범이다. (정보를 정확하게, 효율적으로, 안정하게 주고받기 위해 사전에 약속됨)


[그림1]

 

 ㅁ 프로토콜의 구성요소

 프로토콜들의 효과적인 정리를 위해서 프로토콜 계층화의 사고 방식이 도입되었다. 계층화의 개념은 구조화 프로그래밍(Structured programming)의 개념과 유사하다.

 

[그림2 – TCP/IP 계층구조]

 

프로토콜의 각 계층은 구조화 프로그래밍의 모듈(Module)과 같다. 또한, 프로토콜의 각 계층은 수직적으로 상하 관계를 갖는 것은 모듈들을 수직적으로 배치하여 모듈 사이의 인터페이스(interface)가 최소화되도록 하는 개념과 흡사하다.

 계층화된 네트웍 프로토콜을 총칭하여 네트웍 구조(Network Architecture)라고 부른다.

“나누어 정복하라(Divide and conquer)” : 모듈화를 통해 각계층에 종속이 되지 안게.

 

ㅁ 프로토콜의 종류

. TCP/IP(Transmission Control Protocol/Internet Protocol)

. OSI(Open System Interconnection) 참조모델(Reference Model)

. SNA(System Network Architecture)

  -IBM사의 네트워크 아키텍처 계층 개념

  -7계층으로 구성되어 있음.

. X.25 : 패킷 교환 공중망(Packet Switched Public Data Network)을 통한 데이터 전송을 정의하며 Wan에서 가장 널리 채택.

 

Posted by happydong
, |



이 내용은 월간 Web에 2010년 03월호에 기고했던 내용 입니다!!

[바로가기]
실전활용!! - WCF RIA Services 알아보자 (1)
실전활용!! - WCF RIA Services 알아보자 (2)
실전활용!! - WCF RIA Services 알아보자 (3)



ㅁ 도메인 서비스 호출

 

 이제 실버라이트 프로젝트에서 도메인 서비스를 호출하고, 데이터를 받아서 해당 컨트롤에 뿌려주는 작업에 대해서 알아 보도록 하겠다. 기존에 WCF 서비스를 이용하였거나, WebService를 통해서 작업을 해보셨던 분들이라면 금방 익숙해질 것이라고 생각이 든다.

 

<UserControl x:Class="Demo.RIAServiceApplication.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    xmlns:Data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"

    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">

    <Grid x:Name="LayoutRoot">

        <Data:DataGrid x:Name="DataGrid1"></Data:DataGrid>

    </Grid>

</UserControl>

[코드 3] MainPage.xaml

 

MainPage.xaml DataGrid 컨트롤은 간단하게 데이터를 호출해서 뿌려주기위해 올려놓은 것이다. 호출 내용은 아래 코드와 같다.

 

 

// using 추가

using Demo.RIAServiceApplication.Web;

using System.Windows.Ria;

 

namespace Demo.RIAServiceApplication

{

    public partial class MainPage : UserControl

    {

        public MainPage()

        {

            InitializeComponent();

 

            // 도메인 서비스 생성

            Currency_DS service = new Currency_DS();

            // 도메인 서비스 로드 및 콜백(Callback)지정

            service.Load<Currency>(service.GetCurrencyQuery(), new Action<LoadOperation<Currency>>(Currency_LoadCompleted), null);

        }

 

// 콜백메소드

private void Currency_LoadCompleted(LoadOperation<Currency> operation)

        {

            // 에러가 있는지 확인

            if (operation.HasError == false)

            {

                // DataGrid ItemSource로 지정

                this.DataGrid1.ItemsSource = operation.Entities;

            }

        }

    }

}

[코드 3] MainPage 코드 비하인드

 

위 코드를 간단하게 설명하자면,

 

- 생성자에서 도메인서비스로 지정한 Currency_DS를 생성후 로드메소드를 구현해 주었다.

 

- service.Load메소드는 해당 서비스를 호출하고 받은 반환값 엔티티쿼리(EntityQuery)를 해당 엔티티클래스로 로드를 해주는 역할을 하는데, 위 코드에서 첫번째 파라미터로 GetCurrencyQuery 메소드를 호출하고 있는 것을 확인 할수 있을 것이다. 이 메소드는 도메인서비스의 GetCurrency메소드와 같다. 두번재 파라미터로는 콜백함수를 지정하였다. 세번재 파라미터는 userstate를 지정하는 것인데 null 지정해도 무관하다.

 

- Currency_LoadCompleted는 콜백메소드로 파라미터로는 LoadOperation<Currency>를 받는다.

LoadOperation<Currency>Entities속성을 DataGird 컨트롤의 ItemsSource로 지정해 주어 데이터를 채워주었다.

 

[그림 7] 프로젝트 실행모습

 

[그림 7]은 지금까지의 작업을 실행해본 모습으로, 도메인 서비스에서 데이터를 잘 받아서 뿌려주고  있음을 보여준다.

 

지금까지 작업을 기존에 서비스참조해서 작업하는 거하고, 얼마나 편해졌는지 대충 감이 왔을 것이라 생각이 든다. 위에서도 말했듯 WCF RIA Service에서는 서비스 참조 같은 작업이 없어서, 서비스를 수정하거나 했을 때 서비스 업데이트하는 번거로운이 일이 없다. 그래서 유지 보수가 편하고, 개발하기가 편하다고 하는 이유이다. 또한, 도메인서비스에서 기본적인 CRUD 작업을 만들어주니 개발해야할 부분이 일부, 약간 줄어든 샘이다. 하지만, 필요에 따라 도메인 서비스부분도 수정되어야 할때도 있을 것이다. 이를 적절이 이용해서 사용하면 개발하기 편리한 서비스가 될 것이다.

Posted by happydong
, |



이 내용은 월간 Web에 2010년 03월호에 기고했던 내용 입니다!!

[바로가기]
실전활용!! - WCF RIA Services 알아보자 (1)
실전활용!! - WCF RIA Services 알아보자 (2)
실전활용!! - WCF RIA Services 알아보자 (3)



DB(Data base) 세팅 및
 
도메인 서비스(Domain Service) 생성

 위에서 프로젝트를 생성하고, WCF RIA Service를 사용하기 위해서 설정하는 방법에 대해서 알아 보았다. 이제는 본격적으로 어떻게 통신을 하며, 어떻게 데이터를 주고 받는지 살펴볼 것 이다. 그러기 위해서는 또한 데이터가 필요한데, 필자 같은 경우는 따로 관리하는 DB가 없기 때문에 SQL Server 2008 Sample DB(AdventureWorksDB) 받아서 사용하였다.

 

웹 프로젝트에 엔티티(Entity)를 지정해주어야 하기 때문에 추가 아이템으로 ADO.NET Entity Data Model를 지정해 주어야 한다. 이 부분은 ASP.NET 개발을 해보셨던 분들이라면 능숙하게 설정하실수 있을 것이라 생각이 든다. 하지만, 처음 접하는 분들을 위해 간단하게 아래 그림을 통해서 생성 및 설정 내용을 설명하도록 하겠다.

 

1.  추가 아이템 창을 열어 ADO.NET Entity Data Model를 선택하고, 적절한 이름을 짖고, 추가를 하면 DB관련 설정 창들이 나타날 것이다.

[
그림5-1] 추가 아이템 창

 

 

2.  미리 만들어 놓은 MS-SQL DB로 연결할 것이기 때문에 Generate from database로 선택을 한후 Next버튼을 클릭한다.

[그림5-2] Entity Data Model 설정 관련 창

 

 

3.  어떤 데이터베이스를 설정할 것인지 선택을 해야하며, 처음 설정하는 것이면 New Connection 버튼을 클릭해서 해당 데이터베이스에 연결을 하도록 한다. 그리고 아래 Connection settings에서는 적절한 이름으로 지정해 주면된다. 나중에 이름 변경할때에는 Web.config 파일에서 수정하면된다. 모든 설정이 끝났으면 Next 버튼을 클릭한다.


[그림5-3] Entity Data Model 설정 관련 창

 

 

4.  다음은, 테이블(Table),(View) ,프로시저(Procedure) 중에서 사용할 것들을 체크로 표시하면 된다. 원하는 내용을 체크후 Finish버튼을 클릭한다.

[그림5-4] Entity Data Model 설정 관련 창

 

 

5.  내가 선택한 데이터들을 확인한다.


[그림5-5] DB테이블 불러온 모습

 

 

[그림5-5]에서와 같이 해당 DB테이블을 불어와서 엔티티를 준비해 두었다면은 이제 도메인 서비스 클래스(Domain Service Class)를 만들어 실버라이트 애플리케이션과 통신할 수 있도록 해야 한다. 도메인서비스는 WCF RIA Service에서 아주 핵심적인 클래스 이며, 생성방법은 아래 그림과 같다.

 

[그림6-1] 추가 아이템 창

 

 [그림6-1]과 같이 추가 아이템 창을 열어서 Domain Service Class를 선택하고 적당한 이름을 주어 추가한다.

 

[그림6-2] 도메인 서비스 설정 창

 

[그림6-2]는 해당 도메인 서비스에서 다룰 엔티티를 설정하는 것이다. 만약 이창에서 DataContexts가 안뜨는 경우, 프로젝트 빌드후 다시 확인하면 보일것이다.여기서 원하는 엔티티를 체크후 Enable client access부분에 체크를 해야한다.(기본적으로 체크되어 있음.) 이 설정으로 인해 클라이언트(실버라이트)가 도메인서비스에 접근이 가능하며, 해당 엔티티 내용이 클라이언트쪽에 생성이 된다. 그리고 Enable editing 체크박스는 기본적인 CRUD(Create, Read, Update, Delete)에 대한 작업을 수행하고 싶다 하면 체크해 주면된다. 필자는 일단 Read, 데이터를 불러 오기만 할 것이므로 체크를 하지 않았다.

 

using문 생략

 

// Implements application logic using the AdventureWorksEntities context.

// TODO: Add your application logic to these methods or in additional methods.

// TODO: Wire up authentication (Windows/ASP.NET Forms) and uncomment the following to disable anonymous access

// Also consider adding roles to restrict access as appropriate.

    // [RequiresAuthentication]

    [EnableClientAccess()]

    public class Currency_DS : LinqToEntitiesDomainService<AdventureWorksEntities>

    {

        // TODO: Consider

        // 1. Adding parameters to this method and constraining returned results, and/or

        // 2. Adding query methods taking different parameters.

        public IQueryable<Currency> GetCurrency()

        {

            return this.ObjectContext.Currency;

        }

    }

[코드 1] 도메인 서비스 코드

 

도메인 서비스 설정 창에서 설정을 다하고 OK버튼을 클릭하면 자동으로 위와 같이 코드가 생성이 된다. 코드를 간단하게 살펴보도록 하자면,

 

- LinqToEntitiesDomainService라는 WCF RIA Service에서 제공하는 추상 클래스를 상속받고, 이는 위에서 만들었던 DataEntities(ADO.NET Entity Data Model)를 사용하고 있는 것을 알수 있을 것이다.

- [EnableClientAccess()]라는 어트리뷰트(Attribute)를 지정해 주어, 클라이언트에서 사용이 가능하도록 설정해 주고 있다.

- GetCurrency()라는 메소드가 자동으로 생성이 되며, 해당 데이터를 리스트형식으로 반환해 준다.

 

[그림6-3] 실버라이트 프로젝트 파일

 

 실버라이트 프로젝트에서 숨겨진 파일까지 보기로 설정후 보면 [그림6-3]과 같이 Generated_Code폴더가 보일 것이다. 이 폴더안에 있는 프록시클래스를 확인해 보면 엔티티클래스가 생성되어 있는 것을 확인할 수 있을 것이다. 또 하나 WCF RIA Service도 알고보면 내부적으로는 WCF 서비스를 사용하고 있다는 것이다. 이를 확인하는 방법은 프록시클래스 코드를 보면 될 것이다.

 

public sealed partial class Currency_DS : DomainContext

{

       

        #region Extensibility Method Definitions

 

        /// <summary>

        /// This method is invoked from the constructor once initialization is complete and

        /// can be used for further object setup.

        /// </summary>

        partial void OnCreated();

 

        #endregion

       

       

        /// <summary>

        /// Default constructor.

        /// </summary>

        public Currency_DS() :

                this(new WebDomainClient<ICurrency_DSContract>(new Uri("Demo-RIAServiceApplication-Web-Currency_DS.svc", UriKind.Relative)))

        {

        }

}

[코드 2] 프록시 클래스 내부 코드

 

위 코드를 보면 Demo-RIAServiceApplication-Web-Currency_DS.svc라는 .svc파일을 호출하고 있음을 알수 있다. 이를 호출해 보면 서비스가 뜨는 것을 확인 할수도 있다.

 

[그림7] 서비스 호출 모습


Posted by happydong
, |