C# DB 코딩 강좌 2008. 11. 14. 21:10

    이상하게 6번글을 적을때 익스플로워가 버그가 생겨서 글이 날라가거나 또는 적지 못하게 되는 상황이 발생했다.

    아쉽다.. 내가 적은 6번글에 아쉬움을 뒤로하며

    다시 적기도 싫고..

    그냥 이번글에는 아래 강현철님 덕분에 그냥 dataset이야기를 잠시 적어보자.

    DataSet이란…

    게 뭔지는 몰라도 이글을 적는 사람의 입장에서는 거의 예찬론을 펴고 싶다.

    이것은 MVC 의 한몫을 하는 매우 중요한 개념을 지니고 있고 또한 그렇게 설계되고 사용되어지고 있다.

    (누누히 이야기 했지만 난 MVC가 뭔지 모른다.)

    게다가 이 개념덕분에 닷넷의 모든 컨포넌트들이 이것을 지원하기 위해서 다시 만들어지고 또한 잘 지원하고 있다.

    게다가 이녀석이 나올때부터 개인적 느낌인지 몰라도 Linq가 나올것을 예언하지 않았나 한다.

    다들 잘 알고 있듯이 자바의 하이버네이트라는 ORmapper의 등장이 있음으로 닷넷에 추가될 기능이라든지 자바의 Vector를 좀 색다르게 사용하는 느낌의 dataset이라고 생각할수도 있으나 그것은 아니지 않나 하는 느낌을 많이 가진다.(어라 표현이 이상하다.)

    하여간 DataSet의 닷넷의 핵심적인것중 하나임에는 분명한것 같다.

    아님 DB코딩에서 그런것이던지..

    어디 강좌나 또는 PPT 세미나 등등을 다녀보면 무수히 마샬링과 언마샬링 또는 시리얼라이징

    아님 닷넷리모팅 같은 이야기를 하는데

    당최 못 알아 들을 이야기들이고..

    지금 적는것은 3티어란 글이 아래에 있으니 그냥 하나의 컴퓨터에서 다른 컴퓨터로 이 데이타셋을 넘기는 법을 살펴보자.

    이건 계획에 없던글이다. 그러니 대충 대충 적어보자.

    http://msdn.microsoft.com/ko-kr/library/system.data.dataset(VS.80).aspx

    MSDN에 보면

    이런 문구가 있다.

    DataSet 및 DataTable 개체는 MarshalByValueComponent에서 상속되며 원격 서비스를 위한 ISerializable 인터페이스를 지원합니다. 이 두 개체는 원격화할 수 있는 유일한 ADO.NET 개체입니다.

    말 그대로 원격화를 위해서 이녀석을 만들었고(물론 그 이유만 있는것은 아니다.)

    이 녀석을 사용해서 3 tier을 해라는 무언의 암시가 아닌가 싶다.

    그럼 이녀석을 가지고 발음도 이상한 마샬링이란 것을 해볼려면 어떻게 해야하는가?

    대략 일반적으로 3가지 방법있는것 같은데 흔히들 말하는 Com과 Dcom

    그리고 Web Service 같은것들 또는 3.5에서 WCF 를 이용하거나.

    마지막으로 기초적인 TCPClientChannel / TCpServerChannel이 있겠다.

    이미 하드에 다들 보유하고 있는 MSDN에 적혀 있는것이니 그리 유심히 볼 필요도 없는 심풀한것을 구현해 보자.

    http://msdn.microsoft.com/ko-kr/library/system.runtime.remoting.channels.tcp.tcpclientchannel.aspx

    clip_image001

    이건 위의 링크에 있는 MSDN의 소스를 그대로 복사해 둔것이다.

    물론.. 서버도 가동시키고.. 192.168.1.4에는.. TCPServerChannel의 소스를 실행해 두었다.

    이것의 실행화면은

    clip_image002

    이런식이 되는데.. 잘 보듯이 GetCount가 절대로 9를 돌려줄만한 일이 없다는걸 잘 보길 바란다.

    서버쪽의 GetCount는

    clip_image003

    이런식으로 구현이 되어 있다.

    즉 서버의 함수를 실행하는것이다.

    자바를 배운사람들은 스텁과 스캘레톤을 배운적이 있을건데… 잘 모르겠는가?

    그럼 RMI는 ?...

    RMI도 사전에 없긴하지만.. 여기는 c#게시판이니 적어보도록 하자.

    Remote Method Invocation 의 약자가 RMI인데 쉽게 말하자면 원격에 있는 녀석의 매서드 즉.. 함수를 사용하는것이다.

    자 쓸쓸 짜증이 밀려오니.. 다시금.. 다른 생각을 해보자. 은혜를 꼬시던지.

    2강에 적은 여자이름이 뭐였는지 사실 기억이 나지 않기 시작한다. 은영이였나?

    쩝…

    예전에 지금도 있겠지만 이런 프로젝트가 있었다. DES해석을 시도하기 위해서 전세계 PC를 이용하자. 그래서 어쩌고 저쩌고 하는것 말이다.

    (설마 DES ?를 모르지는 않겠지.. 쩝.. 왜 이리 예제도 어려운거야 -_-;;)

    하여간 이 엄청난 암호화 기법을 역공법으로 해석하기 위해서 현재의 CPU의 형태로 안되니 전세계의 PC의 역량을 빌리자는 프로젝트 말이다. 그럼 다른 PC에 있는 계산 능력을 어떻게 사용해야 한단 말인가? 결국 이 기법이란게 핵심적으로 계산을 할 수 있는 함수가 그 피시에 있고 난 그 함수를 호출하면 되는것 아니겠는가?

    조금 어려운가?

    에이.. 막판이다. 이런 생각을 해보자.

    난 지금 피자가 먹고싶다. 그런데 무슨피자를 시킬지 모르겠다

    그래서 피자카타로그를 집어드니

    거기에는 콤비네이션이랑 …. 란 그림과 함께 여러가지가 있었다.

    난 전화를 했다. <-----------

    상대쪽에서 전화를 받았다. 그리고는 나에게 피자를 배달했다.

    여기서 내가 보고 있는 피자카타로그는.. 하나의 내가 원하는것(인터페이스, 또는 스텁)

    이고 피자가게에서 만든 내가 주문한것을 듣고 피자를 만드는 행위를 하는것(스켈레톤)

    그 피자를 나에게 배달하는것 내가 피자를 받는게 결과값을 받는것과 동일하다.

    아.. 어렵다. 뭐야 정말.

    이게 왜 dataset과 관계가 있고 3tier랑 관계가 있는거야?

    그렇다. 아무런 관계가 없다. 그냥.. 심심해서 적어봤다. 하여간 저따구걸 하는 동작을 마샬링이라고 하는데 말이다.

    쩝.. 좀 있다 다시 짜장으로 다시 설명을 해보자.

    근데 3tier를 왜 설명하고 있는지 모르겠네 이렇게 구현할것도 아닌데 쩝..

    괜히 말린것 같다.

    아래에 3tier란 글이 올라오니 그게 뭔지도 모르면서 갑자기 설명하고픈 욕구가 생겨나다니 난 왜 이런단순세포일까..

    -------------------------------------------------

    일단 소스를 이용해서 getCount함수를 이번에는 return값을 DATASET 으로 받아보자.

    Dataset 음.. 하여간 그래야 조금 더 실감이 날 것 같다.

    clip_image004

    자.. 함수를 아래쪽을 봐라.. 리턴값을 수정했다.

    이걸 호출을 해보자.

    clip_image005

    물론 서버에도 수정해야겠지.

    실행결과는

    clip_image006

    이렇게 나온다.

    clip_image007

    호출을 XML형태로 뿌려주게 했기 때문이다.

    서버에서 dataset을 만들어서 데이터를 저렇게 넣어둔것이다.

    이말은 즉.. 서버에서 보내는 dataset을 클라이언트가 받는다는 이야기가 된다.

    조금 이해가 오는가?

    3 tier란게 사실 별게 없다. 중간에 TCP서버같은 일종의 체팅서버가 떡하니 하나가 있고

    다른녀석들이 여기에 접속해서 정보를 받아가는것에 불과하다.

    단지 그 정보를 받아가는것이 Dataset으로 받아갈수 있다는것 그게 핵심이다.

    (물론 이것은 지금만 그렇다는것이고 실제적으로 후벼파다 보면 EJB같은것까지 여러형태로 사용되어진다.

    그러나 지금처럼 DB코딩 그것도 닷넷에서 의 한정적인 입장에서는 dataset을 일종의 다리로 이용해서

    정보를 전달하기 때문에 이렇게 설명을 하고 있다. 물론 닷넷에서는 EJB가 아닌  Dcom을 사용해서 처리하게 될것이다만

    기초를 알면 저런건... 사전을 찾아보면 될것이다. 물론 사전에 EJB가 없긴 하더라만..)

    결과에 나오는정보는 클라이언트 소스의 어디에도 없다는 것이고 결국 저것이 실행된곳은 서버이고 정보를 받는것만 하는것이다.

    그럼 왜 클라이언트에도 Getcount란 함수가 있어야 하는가 말이다.

    그건 내가 짜장면집에 전화를 걸어서 짬뽕 한그릇 했을때 난 이미 짱뽕이란 개체가 어떤건지 알고 있어야 되는것이 아닌가?...

    최소한 그것이 "음식"이란것을 알고 있어야지만 된다는 것이다. 돌려주는 값의 타입을 알아야 시킬것이 아닌가…

    이런 개념들을 자바에서는 RMI라고 이야기 하고

    개체가 왔다 갔다를 위해서 처리되는것을 마샬링 역으로 언마샬링이라고 한다.

    그 내부적인형태를 시리얼라이징 이라고 해서 "개체 직렬화"라고 이야기 하고

    그러기 위해서 가장 적당하다는 XML을 통해서 처리하는게 다반사이다.

    물론 이 이야기를 더 발전시키면 Com+와 Dcom쪽까지 이야기를 전진해야 하므로 다소 이 DB시리즈 낙서와 너무 이야기가 멀어지므로.. 좀 생략하자.(사실 모른다. 흐흐)

    여하튼 3tier라는게 생각외로 그리 어려운건 아니다.(물론 실제적으로 실무에 사용하려면 아직 넘어야 될 산이 많다.)

    자 요약을 하자.

    1. Dataset 은 직렬화가 가능한 개체이다.

    2. 3 tier란게 사실상 비지니스로직을 처리하는 서버에 클라이언트가 접속해서 데이터를 받아오는것에 불과하다.

    이정도가 될듯 하다.

    ---------------------------------------------------------------

    귀차니즘으로 tcpServerChannel을 찾지 않을듯 하여 아래에 적어둔다.

    http://msdn.microsoft.com/ko-kr/library/system.runtime.remoting.channels.tcp.tcpserverchannel.aspx

    using System;

    using System.Runtime.Remoting;

    using System.Runtime.Remoting.Channels;

    using System.Runtime.Remoting.Channels.Tcp;

    using System.Security.Permissions;

    public class Server

    {

        [SecurityPermission(SecurityAction.LinkDemand)]

    public static void Main()

        {

    // Set up a server channel.

    TcpServerChannel serverChannel = new TcpServerChannel(9090);

            ChannelServices.RegisterChannel(serverChannel);   

    // Expose an object for remote calls.

            RemotingConfiguration.RegisterWellKnownServiceType(

                typeof(Remotable), "Remotable.rem", WellKnownObjectMode.Singleton

            );

    // Show the name and priority of the channel.

            Console.WriteLine("Channel Name: {0}", serverChannel.ChannelName);

            Console.WriteLine("Channel Priority: {0}", serverChannel.ChannelPriority);

    // Show the URIs associated with the channel.

            ChannelDataStore data = (ChannelDataStore) serverChannel.ChannelData;

    foreach (string uri in data.ChannelUris)

            {

                Console.WriteLine(uri);

            }

    // Wait for method calls.

            Console.WriteLine("Listening...");

            Console.ReadLine();

        }

    }

    --------------------------

    using System;

    using System.Runtime.Remoting;

    public class Remotable : MarshalByRefObject

    {

    private int callCount = 0;

    public int GetCount()

        {

            callCount++;

    return(callCount);

        }

    }

    원본 위치 <http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1585&page=2>

'C# DB 코딩 강좌' 카테고리의 다른 글

C#을 이용한 DB코딩 11  (0) 2008.11.14
C#을 이용한 DB코딩 10  (0) 2008.11.14
C#을 이용한 DB코딩 9(인터페이스)  (0) 2008.11.14
C#을 이용한 DB코딩 8  (0) 2008.11.14
C#을 이용한 DB코딩 7  (0) 2008.11.14
C#을 이용한 DB코딩 5  (0) 2008.11.14
C#을 이용한 DB코딩 4(Virtual PC)  (0) 2008.11.14
C#을 이용한 DB코딩 3  (0) 2008.11.14
C#을 이용한 DB코딩 2  (0) 2008.11.14
C#을 이용한 DB코딩 1  (0) 2008.11.14
posted by 삶의여유로움
: