소프트웨어/C# & ASP.NET

엔터프라이즈 서비스 With ASP

falconer 2009. 8. 7. 17:03

ASP는 스크립트 언어라는 사실은 다 아실것입니다. ASP자체로는 간단한 일 외에 좀 복잡한 일을 하기는 어렵습니다. 그래서,  ActiveX Data Object (ADO) 와 같이 많이 사용합니다. 또, 특정의 비즈니스 환경에서는 COM 객체를 직접 만들어 ASP로 이 COM을 이용해 웹어플리케이션을 만드는 일은 요즘에도 많이 이용하는 방법입니다.

 

기왕이면 최신기술인 Enterprise Services 를 이용해 특정환경에서 유용한 컴포넌트를 만들어 보도록 하겠습니다.

 

이렇게 해서 얻는 장점은 기존에 .NET Framework를 이용해 어셈블리를 만들어 다른 .NET 어플리케이션에서 참조해 재사용하던 것을 ASP 나 VB 6.0 등에서도 사용할 수 있게 된다는 것입니다.

 

물론, 더 유연하고 성능좋은 컴포넌트를 만들기 위해서는 더 많은 개념을 익혀야 하고, 더 신경써서 만들어야 겠지만 이번에는 개념만 이런게 있구나 정도만 익히는 수준에서 지난번 아티클의 프로그램을 살짝 수정해 보겠습니다. 아마도 인터넷에 물려있지않은 소단위의 비즈니스 환경이라면 유용한 것입니다.

 

지난번 프로그램에서 확장하기

지난번 프로그램과 이번 프로그램의 다른점은 지난번 프로그램은 형태가 라이브러리의 형태이고, 이번 프로그램은 형태가 서버 형태입니다. 단순히 AssemblyInfo.cs 파일에서 [assembly: ApplicationAvtivation(ActivationOption.Library)] 를 [assembly: ApplicationAvtivation(ActivationOption.Server)] 로 바꾸어 주기만 하면 됩니다.

 

하지만, 기존의 프로그램을 그냥 사용하기는 허전하무로 몇가지 기능을 넣어 보도록하겠습니다. 만들 객체는 두개로 하나는, DB와 연결을 생성하고 쿼리를 보내 데이터테이블 객체를 얻어는 컴포넌트이고, 다른 하나는 데이터 테이블을 받아 데이터 테이블 객체내의 값은 반환하는 역할을 하는 컴포넌트 입니다.

 

먼저, 클라이언트 프로그램을 보도록 하겠습니다.

 

<%

Dim objCon, objReader
Set objCon = Server.CreateObject("Pastoral.Connection")
Set objReader = Server.CreateObject("Pastoral.DataReader")

objCon.Open("Password=****;Persist Security Info=True;User ID=sa;Initial Catalog=pubs;Data Source=.")
objReader.Open( objCon.Exec("SELECT TOP 100 * FROM member") )
%>
<% Do While objReader.Read() %><% Loop %>
<%= objReader("UserID") %> <%= objReader("UserName") %>


<%
objReader.Close()
objCon.Close()

Set objReader = Nothing
Set objCon = Nothing
%>

 

위 프로그램을 보시면 Connection 객체와 Reader 객체를 보실수 있습니다. 이들이 우리가 많들 컴포넌트 입니다.

 

다음은 각 객체의 인터페이스 입니다.

    public interface IConnection

    {

        void Open(string connectionstring);

        DataTable Exec(string sqlquery);

        void Close();

    }

 

    public interface IDataReader

    {

        void Open(DataTable data);

        string this[string columnname] { get; }

        bool Read();

        void Close();

    }

 

ASP 예제에서도 보셨듯이 네임스페이스는 Pastoral 입니다. (제가 임의로 정해봤습니다. 유목민이란 의미에서 이렇게 정해봤습니다.)

 

이쯤되면 대충 감 잡으셨으리라 생각 됩니다. 다음은 이를 구현했습니다. 모든 구문을 다 적어보도록 하겠습니다.

 

//Connection.cs 파일

using System;

using System.Collections.Generic;

using System.Text;

using System.EnterpriseServices;

using System.Runtime.InteropServices;

using System.Data;

using System.Data.SqlClient;

 

namespace Pastoral

{

    [EventTrackingEnabled]

    public class Connection : ServicedComponent, IConnection

    {

        private SqlConnection con;

 

        public void Open(string connectionstring)

        {

            this.con = new SqlConnection(connectionstring);

            this.con.Open();

        }

 

        public DataTable Exec(string sqlquery)

        {

            SqlDataAdapter da = new SqlDataAdapter(sqlquery, con);

            DataTable dt = new DataTable();

            da.Fill(dt);

            return dt;

        }

 

        public void Close()

        {

            if (this.con != null && this.con.State == ConnectionState.Open) this.con.Close();

        }

 

    }

}

 

// DataReader.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.EnterpriseServices;
using System.Runtime.InteropServices;
using System.Data;
using System.Threading;

namespace Pastoral
{
    [EventTrackingEnabled]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class DataReader : ServicedComponent, IDataReader
    {
        private DataTable data;
        private int count;

        public void Open(DataTable data)
        {
            this.data = data;
            this.count = -1;
        }

        public string this[string columnname]
        {
            get
            {
                if (this.data == null) throw new Exception("데이터테이블이 빈 객체 입니다.");
                return this.data.Rows[count][columnname].ToString();
            }
        }

        public bool Read()
        {
            this.count++;

            if (data.Rows.Count > count) return true;
            else return false;
        }

        public void Close()
        {
           
        }
    }
}

 

이렇게 구현해주신 후, 구성요소 서비스로 등록해 주시면 등록이 됩니다. 물론, 이 컴포넌트는 타 장비에서는 접근이 불가능 합니다.

 

정리

간단하게 Enterprise Services 를 ASP (또는 Visual Basic 6.0 등) 에서 사용하는 방법을 보았습니다. 많이 사용 될지는 모르겠지만, 어떤 컴포넌트를 상용으로 만들때에 .NET 환경만 고려해 주는 것보다 더 많은 개발자가 이용할 수 있는 컴포넌트를 개발하는 것이 더 괜찮은 아이디어 입니다.

 Enterprise Services는 쉽지 않은 기술입니다. 더 안정적이며 유용하고 성능좋은 컴포넌트를 만들기 위해서는 많은 내공을 쌓아야 할 것입니다.

출처 : http://hoons.kr/Board.aspx?Name=cshaptip&Mode=2&BoardIdx=1035&Key=&Value=