posted by 알 수 없는 사용자 2007. 5. 21. 00:59

1. window 2000과 2003의 차이
-윈도우 2003서버는 기본적으로 .net프레임워크가 설치되어 있다.

1-1. IIS란?
-Internet Information Server (인터넷정보서버)

2. 닷넷 프레임워크 3.0의 구성요소
WPF(Windows Presentation Foundation)
- 백터 그래픽 기반의 UI 개발통합환경
WCF(Windows Communication Foundation)
- 서비스 지향 어플리케이션을 신속하게 개발하기 위한 통합된 서비스 프로그래밍
- 통일성, 높은 생산성, 상호 운용성
WF(Windows Workflow Foundation)
- WF로 작업하면 워크플로우를 명확하게 정의할 수 있고,
- 워크플로우가 바뀌었을때 코드를 수정하지 않아도
- 간단하게 Drag&Drop 만으로 작업 흐름을 수정할 수 있다.
CardSpace(Windows CardSpace)
- 사용자가 인터넷으로 이용하는 여러 개의 로그인 ID나 패스워드를 관리하는 방법 개선

2-1. 실버라이트란? [FLEX vs Silver Light]
실버라이트(Silverlight)는 Microsoft에서 밀고 있는 Flash와 유사한 웹용 GUI 플러그인이다.
백터방식으로 DVD급 화질을 느낄 수 있고, Windows Media Encoder로 스트리밍이 가능

3. Enterprise Service(인프라 서비스 라이브러리)
. .net 개체가 Com+서비스에 접근할수 있도록 하는 역할
-순서-
. 클래스라이브러리 생성
. using EnterpriseService
. AssemblyInfo.cs에 using EnterpriseService
. 강력한 이름설정(sn -k 파일이름.snk)
. [Assembly:ApplicationActivation[ActivationOption:Server]]
. [Assembly:ApplicatinoName["화일이름“]]
. [Transaction[TransactionOption.NotSupported]]
. 클래스 상송 public class aaa : ServicedComponent
. 등록 regsvcs 이름.dll

4. SOA(Service Oriented Architecture)
SOA는 아키텍처와 인터페이스의 다른점을 신경 쓰지않고 모든 어플리케이션을 네트워크를
경유하여 서비스로서 자유롭게 조합하여 이용할 수 있도록 하기위한 시스템 설계상의 방법입니다.

5. WebService
SOAP(분산 컴포넌트 간의 정보를 교환하기 위한  XML기반의 메시지 프로토콜)
SOAP와  웹서버를 이용한 Remoting
* 자세히
서로 다른 컴퓨팅 환경에서 사용되는 모든 애플리케이션들이 직접 소통하고 실행될 수 있도록 동적 시스템 환경을 구현해 주는 소프트웨어 컴포넌트. 단순 객체 접근 프로토콜(SOAP), 웹 서비스 기술 언어(WSDL), 전역 비즈니스 레지스트리(UDDI) 등의 표준 기술을 사용하여 네트워크에 연결된 다른 컴퓨터 간의 분산 컴퓨팅을 지원하는 소프트웨어 및 기술들이다. 웹 서비스는 논리적 응용 프로그램의 단위로 데이터와 서비스를 다른 응용 프로그램에 제공하고, 응용 프로그램의 작성 시 HTTP, XML, SOAP와 같은 표준화된 웹 프로토콜데이터 형식을 사용함으로써 운영 체계(OS) 등 특정 플랫폼과 상관없이 모든 컴퓨터 간 원활한 데이터의 흐름을 보장해 준다. 웹 서비스를 활용하면 어려운 프로그램 작성 언어를 배우지 않고도 간단하게 여러 가지 웹 서비스들을 조합하여 새로운 애플리케이션을 만들어 낼 수 있다.

5-1. SOAP란?
SOAP은 XML과 HTTP 통신을 기반으로 하여 네트워크 상에 존재하는 각종 컴포넌트간의 호출을
효율적으로 실현하기 위한 방법을 제시하는 규약

6. .net Remoting
RPC(Remote Procedure Call) 클라이언트가 원격지에 존재하는 함수를 호출한 후,
그결과를 원격지로부터 받아내는 기술
[닷넷 환경에서의 개체기반 RPC 모델]
원격서비스에 등록되어 있는 원격 클래스의 함수를 호출하기위한 아키텍쳐
======================================
Marshaling(마샬링), Unmarshaling(언마샬링)
Serilalization(직렬화), Deserilalization(역직렬화)
[보내기 받기]
======================================
네트워크 통신을 하기 위한 채널(TCP, HTTP)
포맷터(SOAP-xml, Binary-바이너리)
바이너리가 속도는 좋지만 이기종간의 토인을 위해서 SOAP를 사용

채널등록
TcpClientChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, flase);

프록시 객체 생성
object obj =
Activator.GetObject(typeof(SaoHello), "tcp:localhost:9009/BaboSaoHello");
SaoHello h = (SaoHello)obj;

원격함수 호출
Console.WriteLine(h.SayHello("홍길동“));

7. Component
. 잘정의된 인터페이스를 가지며
. 그 인터페이스를 통해서만 서비스들을 호출할 수 있고
. 명세화 되어 있고
. 배포될 수 있고
. 독립적인 기능을 수행하는 소프트웨어모듈
. 재사용 가능한 소프트웨어 빌딩 블록

8. MSF/CD
. 컴포넌트 개발 방법론
. 기존방법론에 비하여 물리적인 설계부분에서 강점
 - 개념적(업무프로세스 모델설계)
 - 논리적(클래스와 서비스설계)
 - 물리적

9. CBD란?
CBD (Component Based Development)라는 용어의 약어로 소프트웨어 개발 방법론의 하나로 프로그램의 순서를 따라서 각각의 독립적인 컴포넌트로 구성하고 이를 짜 맞춰 전체 프로그램을 구성하는 것을 말합니다.
이때 컴포넌트는 실행 버튼과 같은 작은 단위에서부터 간단한 프로그램 전체에 이르기까지 그 형태가 다양하며 만들어지며 개발 언어에 비지니스 로직을 접목한 개념이라고도 볼 수가 있습니다.  
CBD를 이용해서 짠 프로그램의 가장 큰 장점은 재사용이 가능하고 다른 프로그램과의 호환성 및 이식성이 우수하다는 것입니다.
따라서 개발 생산성이 전반적으로 높아지는 효과를 가져다 줍니다.
CBD에 입각해서 만들어진 컴포넌트들은 특정 애플리케이션에 구애 받지 않으며 데스크톱용 프로그램이나 웹 브라우저 등 어떤 소프트웨어 환경에서도 표준 프로토콜을 이용해 불러 들일 수가 있습니다. 게다가 한 번 사용한 컴포넌트는 버리는 것이 아니라 다른 종류의 애플리케이션을 만들 때 재사용할 수가 있다는 것입니다.

10. Stored Procedure(저장프로시저)
쿼리를 하나로 묶은 것, 자주 사용하는 SQL 쿼리를 매번 입력하는 것이 귀찮게 여기질 때 유용하게 사용할 수 있다.
저장 프로시저를 만들어 놓으면 이후로는 저장프로시저의 이름을 호출하는 것만으로 SQL쿼리를 실행할 수 있다.
. 어떤 동작을 일괄처리하기 위한 용도
. 저장프로시저도 데이터베이스의 개체
. 프로그램기능, Return, try/catch, 매개변수가 가능
. 수정은 ALTER, 삭제는 DROP Procedure를 사용
Create Proc test
@testValue NVARCH(10),
@outValue INT OUTPUT
AS
Insert Into testTbl Values(@test);
select @OutValue = IDENT_CURRENT('testTbl');
Exec test 'aaa';

11. DB모델링
계획-분석-설계-구현-테스트-유지보수

업무분석
개념적 모델링 - 업무분석을 토대로 엔티티 추출, 속성, 관계정의
논리적 모델링 - 정규화를 통한 스키마설계
물리적 모델링 - 제약조건, 인덱스, 역정규화

12. 정규화 : 자료의 중복성과 비정규성을 제거하고 검색키를 설정하기 위해 데이타베이스의 logical schema를 작성하는 것

제1정규화
 - 반복되는 그룹 속성을 제거한 뒤 기본 테이블의 기본키를 추가해
새로운 테이블을 생성하고 기존테이블과 일대다의 관계를 형성한다.
- 반복되는 그룹의 속성이 존재할 경우 그 그룹을 분리하여 새로운 실체를 추가한 후 기존의 실체와 일대다의 관계를 형성함으로서 속성들의 원래 제자리를 찾아준다.

제2정규화
- 복합키에 전체적으로 의존하지 않는 속성들을 제거한다.
- 복합키의 일부에만 종속되는 속성들을 제거

제3정규화
-기본키에 의존하지 않고 일반컬럼에 의존하는 컬럼들을 제거한다.

기타 정규형
BCNF(Boyce Codd Normal Form)라고도 하는 제 4 정규형과 제 5 정규형도 있지만 이 형식은 실제 디자인에서 거의 고려되지 않습니다. 이러한 규칙은 무시해도 데이터베이스 디자인의 완벽성은 덜하겠지만 기능적으로는 영향이 없습니다.

정규화의 문제점
때로는 정규화 이론에 어긋나는 릴레이션 구조를 선택해야 할, 실용적인 필요성이 우선하는 경우도 있습니다. 정규화 작업은 특히 처리속도와의 trade-off관계가 심사숙고의 대상이 되며 고도의 정규화를 추구하다보면 레코드의 종류가 늘어나고 프로그래밍도 복잡해 져서 결국은 전체적인 performance가 떨어지게 됩니다. 이는 양자간의 절충으로 어느정도 해결될 수 있지만 개발자와 사용자간에 깊이 생각해 보아야 할 문제라고 할수 있겠군요.

13, 인덱스
- 데이터베이스 내의 테이블에서 원하는 데이터를 좀더 빨리 찾아줄 수 있게끔 데이터의 위치정보를 모아놓은 데이터베이스 내의 개체이다.
클러스터드인덱스(영어사전) - 범위검색에 용이
비클러스터드인덱스(일반책) - 특정값 검색에 용이

14. 트리거 : 특정 테이블이나 테이블의 레코드에 어떠한 사건(이벤트)이 발생하였을 때 내부적으로 실행되도록 데이터베이스에 저장된 프로시져를 말함.
부탁된 테이블에 특정한 업무 수행시 자동 실행(스토어드 프로시저랑 비슷)
- DML(Insert, Update, Delete)
- DDL(Create, Drop, Alter)

이 프로그램은 QL/SQL 혹은 자바로, 또는 C의 콜아웃(callouts)으로서 작성될 수 있다. 오라클에서는 사용자가 이들 프로그램을 정의할 수 있으며, insert, update, delete문이 연관된 테이블, 뷰, 또는 데이터베이스 작업을 대상으로 수행 될 때에 이들을 수행할 수 있다.

트리거는 데이터베이스 보안의 적용, 유효하지 않은 트랜잭션의 예방, 업무 규칙의 적용, 감사(auditing) 제공, 복제된 테이블의 유지등에 사용될 수 있다.

Create Trigger test
ON testTbl
After Delete, Update
AS
Print ('메세지‘);

14-1. 커서의 개념
커서는 테이블에서 여러 개의 행을 쿼리한 후에, 쿼리의 결과인 행 집합을 한 행씩 처리하기 위한 방식이다. 항 행씩 읽을 때마다 파일 포인터는 자동으로 다음 줄을 가리키는 것과 같은 동작을 한다.
단점.커서는 SQL Server의 성능을 떨어뜨리는 큰 요인 중 하나임.

15. Thread
- 하나의 프로그램 내에서 실행되는 함수
- 한순간에 두 개의 함수가 동시에 실행되면 두 개의 스레드가 동작하는 것.
(우선권, 동기화)
- 프로세스, 멀티테스킹

16. .net Framework
 -공용런타임(Common Language Runtime)
. 시행환경을 제공하며 CLS의 언어규칙을 따라야 CLR에서 실행된다.
-.net framework클래스 라이브러리
.개발에 필요한 모든 라이브러리 환경을 제공

17. 자바에서 String과 String Buffer 의 차이점
String Class는 문자열을 저장 및 기본적인 문자열을 다룰수 있는 메소드들을 제공하고 있고, StringBuffer Class는 문자열에 관한 연산들, 즉 문자열을 다루는 고급적인 메소드들이 있다고 대충 생각 하시면 됩니다.

18. 트랜젝션 : 트랜잭션은 하나의 논리적 작업 단위로 수행되는 일련의 작업
트랜젝션의 특성은 크게 4가지 단어로 표현을 하고 각 단어의 첫 단어를 따서 ACID 라고 불린다.
Atomic, Consistent, Isolated, Durable

Atomic (원자성)
트랜젝션은 하나이상의 단위업무를 묶은 작업의 단위이다.
원자성은 모든작업이 이루어지거나 그 반대로 아무것도 이루어지지 않거나 하는것을 이야기 한다.
만약 모든 단위업무가 정상적이라면 트랜젝션은 성공된 것이고, 어떤 단위업무라도 실패가 난다면 전체 트랜젝션이 실패가 난 것이고 롤백이 이루어진다.

Consistent (일관성)
트랜젝션의 성공, 실패여부와 상관없이 일관성있는 상태를 유지해야한다.

Isolated (독립성)
트랜젝션 수행시 다른 트랜젝션이 중간에 끼어들지 못하도록 보장하는것을 말한다.
따라서, 각각의 트랜젝션은 독립적이어야하며 동일한 데이터를 동시에 읽고 쓸 수 없어야한다.

Durable (영속성)
트랜젝션이 완료가 되면 시스템에 어떤 오류가 있던지간에 그 결과는 영구히 반영이 되어야 한다.

19. 제약조건
제약조건이란 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해서 여러 가지 규칙을 적용해 놓는거라 생각하면 됨. 간단하게 테이블안에서 테이터의 성격을 정의하는 것이 바로 제약조건
 ★ 데이터의 무결성 유지를 위하여 사용자가 지정할 수 있는 성질
 ★ 모든 CONSTRAINT는 데이터 사전(DICTIONARY)에 저장
 ★ 의미있는 이름을 부여했다면 CONSTRAINT를 쉽게 참조할 수 있음.
 ★ 표준 객체 명명법을 따르는 것이 좋다.
 ★ 제약조건은 테이블을 생성할 당시에 지정할 수도 있고, 테이블 생성 후 구조변경(ALTER)명령어
     를 통해서도 추가가 가능하다.
 ★ NOT NULL제약조건은 반드시 컬럼 레벨에서만 정의가 가능하다.

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

* 8번, 9번 추가내용
MSF(Microsoft Solution Framework)는 팀이나 기관으로 하여금 그들의 고객에게 비즈니스 요구에 따른 기술적 솔루션을 보다 성공적으로 제공할 수 있도록 하는, 마이크로소프트에 의해 실제적으로 입증된 여러 인적, 프로세스적 가이드라인으로 구성된다.
MSF/CD(Component Design)는 특히 컴포넌트 기반의 개발 방법론인 CBD를 위한 것이다. 요구사항 분석, 아키텍처 수립, 개념 설계, 논리 설계, 물리 설계를 위한 모든 과정의 가이드라인을 충실히 제공하고, 각 단계의 산출물을 정형적으로 정의함으로써 컴포넌트 기반의 애플리케이션 구축을 전반적으로 지원한다.
본서에서 제시하는 가이드라인은 RUP와 같은 다른 CBD 방법론과 많은 특성을 공유하지만 다음과 같은 부가적인 특징이 있다.
1) 아키텍처 측면에서 볼 때 데이터베이스 액세스뿐만 아니라 외부 서비스와의 통합을 위한 서비스 에이전트를 데이터 계층에 포함시켜 설명하고 있고, 비즈니스 계층에서도 외부에 기능성을 공개하기 위한 서비스 인터페이스를 도입하고 있다. 이들은 이질적인 플랫폼에서 개발되고 운영되는 프로그램의 통합과 상호운용을 활용하기 위한 서비스 지향 아키텍처(Service-Oriented Architecture, SOA)를 설계 방법론에 적극 도입한 결과이다.
2) 설계 지원 도구는 수단일 뿐 목표가 아니므로 특정 도구에 의해 방법론이 왜곡되거나 특정 도구만을 위한 방법론을 개발하는 것은 바람직하지 않다. 본서는 MSF/CD를 개념과 실천을 위한 가이드라인으로 충실하게 소개하고, 여러 도구를 사용하여 구현 사례를 산출함으로써 도구 중립적인 특징이 있다.
3) Visual Studio Team System이 도입될 경우 본 방법론에 따른 프로젝트의 전체 라이프사이클과 모든 산출물을 보다 자동적이고도 체계적으로 관리할 수 있을 것이다.
모든 기술은 상황에 적합하여야만 의미가 있으며, 단지 기술을 사용하기 위하여 문제를 오히려 복잡하게 하거나 왜곡시키는 것은 결코 바람직하지 않다. 비유적으로 말하자면 손에 망치를 가졌다고 주변의 모든 사물을 못으로 착각해서는 안 될 것이다.
본서를 통하여 설계 방법론의 여러 원칙과 기술을 충실히 배양하고, 적절한 문제에 이들을 효과적으로 적용하는 경험과 안목을 더하는 것은 고급 개발자가 되기 위한 필수적인 과정일 것이다. 많은 개발자가 있지만 시스템 분석과 설계에 높은 안목을 가진 아키텍트는 절대적으로 부족한 현실에서 본서가 진정한 아키텍트와 수준 높은 개발자의 길로 안내하는 데 큰 도움을 주리라 확신한다.


posted by 써니루루 2007. 5. 16. 16:05

<%@ Control Language="C#" ClassName="postImage" %>
<%@ Import Namespace="System.IO" %>


<script runat="server">

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (FileUpload1.HasFile == true)
        {
            string upDir = Server.MapPath(".") + "\\upload\\";
           
            DirectoryInfo di = new DirectoryInfo(upDir);
            if (di.Exists == false)
                di.Create();

            string fName = FileUpload1.FileName;
            string fFullName = upDir + fName;
            FileInfo fInfo = new FileInfo(fFullName);

            if (fInfo.Exists == true)
            {
                int findex = 0;
                string fExt = fInfo.Extension;
                string fRealName = fName.Replace(fExt, "");

                string newFileName = "";
                do
                {
                    findex++;
                    newFileName = fRealName + "_" + findex.ToString() + fExt;
                    fInfo = new FileInfo(upDir + newFileName);
                } while (fInfo.Exists);

                fFullName = upDir + newFileName;
                fName = newFileName;
            }

            FileUpload1.PostedFile.SaveAs(fFullName);
            fInfo = new FileInfo(fFullName);

            Panel1.Visible = true;
            lblMessage.Text = "업로드 된 파일 : " + fFullName + "\n<br />";
            /*lblMessage.Text += "업로드 사이즈 : "
                + Convert.ToString(int.Parse(Convert.ToString(float.Parse(fInfo.Length.ToString()) / 1024.0f)))
                + "KB";*/
            Image1.ImageUrl = "../upload/" + fName;
            HiddenField1.Value = "upload/" + fName;
        }
        else
        {
            Panel1.Visible = true;
            lblMessage.Text = "업로드 할 파일이 존재하지 않습니다.";
        }
    }

</script>


<div class="titleText">이미지를 등록해주세요</div>
<br />
<div class="noticeText">* 이미지는 명함, 반명함 사진으로 확장자는<br /> gif, jpg, png 등으로만 올려주시기 바랍니다.</div>
<br />
<div id="fileImage">
    <asp:FileUpload ID="FileUpload1" runat="server" Width="200px" />&nbsp;<br />
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="사진 파일 올리기" /><br />
</div>
<p></p>
<asp:Panel ID="Panel1" runat="server" Height="50px" Width="298px" Visible="False">
    <asp:Label ID="lblMessage" runat="server"></asp:Label><br />
    <asp:Image ID="Image1" runat="server" Width="130" /><br /><br />
    </asp:Panel>
<asp:HiddenField ID="HiddenField1" runat="server" />


간단하게 만들었던 이미지 업로드 컨트롤 *.ascx 파일로 만들어두면 편하다.

참 급조로 만든거라 상당히 부실한 -_ -;;;

요래 코딩하면 안되는뎅;;

반성 반성~


만약에 업로드하는 부분만 메소드로 뺀다면 ...

    /// <summary>
    /// 이미지를 업로드 한 후 저장된 파일 경로를 반환한다.
    /// </summary>
    /// <param name="FileUp">업로드 컨트롤</param>
    /// <param name="SubCode">과목코드</param>
    /// <returns></returns>
    protected string ImageUpload(FileUpload FileUp, int SubCode)
    {
        string ret = "";        // 반환할 문자열
        string upDir = "";      // 업로드할 파일 저장 위치
        string fName = "";      // 업로드된 실제 파일명
        string fFullName = "";  // 저장할 파일의 풀 경로
        string fExt = "";       // 파일의 확장자명
        string fRealName = "";  // 파일의 확장자를 뺀 실제 파일명
        string newFileName = "";// 새로 만들어질 파일명

        int findex = 0; // 파일의 인덱스번호
       
       
        System.IO.DirectoryInfo di = null;
        System.IO.FileInfo fInfo = null;
       
        // 파일이 있나?
        if (FileUp.HasFile == true)
        {
            // 저장할 경로
            upDir = Server.MapPath("..") + "\\upload\\exam\\" + SubCode.ToString();
           
            // 경로에 디렉토리가 없으면 만든다.
            di = new System.IO.DirectoryInfo(upDir); // 디렉토리를 다룰 연장
            if (di.Exists == false)
                di.Create();

            // 업로드 된 파일을 가지고 저장할 파일의 풀 경로를 만들어낸다.
            fName = fileup.FileName;
            fFullName = upDir + fName;
            fInfo = new System.IO.FileInfo(fFullName); // 파일을 다룰 연장

            // 이미 해당하는 파일이 있으면
            if (fInfo.Exists == true)
            {
                fExt = fInfo.Extension;
                fRealName = fName.Replace(fExt, "");

                // 루프를 돌면서 실제 저장될 파일명을 결정한다.
                do
                {
                    findex++;
                    newFileName = fRealName + "_" + findex.ToString() + fExt;
                    fInfo = new System.IO.FileInfo(upDir + newFileName);
                } while (fInfo.Exists);

                fFullName = upDir + newFileName;
                fName = newFileName;
            }

            FileUp.PostedFile.SaveAs(fFullName);
            fInfo = new System.IO.FileInfo(fFullName);

            ret = "../upload/" + fName;
        }
       
        return ret;
    }

posted by 써니루루 2007. 4. 6. 11:19

 

.NET을 이용한 분산 응용프로그램의 작성

Duncan Mackenzie
Microsoft Developer Network

2002년 2월 갱신

요약: 이 기사는 MSMQ 메시지 대기열에 데이터를 읽고 쓰기 위해 .NET 프레임워크에서 제공하는 System.Messaging 클래스들의 사용 방법을 묘사하고 있습니다.

Bdadotnet_beta2.msi를 다운로드합니다.

목차

소개
대기열을 이용한 작업
   프로그래밍을 통한 대기열 생성하기
   대기열 삭제하기
메시지의 전송
   간단한 방법
   복합적인 방법
메시지의 수신
   Time-out 값 설정하기
   특정 포맷터 사용하기
결론

소개

비동기적으로 작업을 수행하는 것은 실행 결과를 기다리지 않고 실행하는 것입니다. 이러한 유형의 처리는 많은 시간을 요하는 작업과 실행이 끝날 때까지 기다리지 않고 다른 작업을 계속 해나갈 수 있도록 해줍니다.

사용자들의 요청이 긴 시간의 처리를 필요로 하지만 사용자에게 즉각적인 응답 처리를 제공하길 원하는 웹의 경우와 같이, 비동기 처리는 많은 상황에서 사용하기에 이상적입니다. 사용자의 요청을 비동기적으로 처리함으로써, 시스템은 요청이 실제로 실행하기에 얼마나 긴 시간이 소요되는지에 상관없이 응답할 수 있게 됩니다.

Microsoft® .NET 응용프로그램에 비동기 처리를 추가하기 위한 다양한 방법이 존재합니다. 예를 들어, Microsoft Exchange 2000 또는 Microsoft BizTalk 서버의 워크플로우 기능의 장점을 이용할 수 있을 것입니다. COM Interop을 이용해 COM+ 대기열을 사용하는 구성요소(Queued Component)를 이용할 수 있습니다. 또는 MSMQ 메시지 대기열을 이용해 직접 처리 작업을 수행할 수도 있습니다. 향후 진행될 아키텍처 중심의 주제 기사에서는 깊이 있게 이들 대안들을 비교할 것입니다.

BizTalk 과 COM+ 대기열을 사용하는 구성요소(Queued Component)에서 사용되는 MSMQ는 마이크로소프트 윈도우 NT 4.0 옵션 팩과 마이크로소프트 윈도우 2000 서버 버전의 일부분입니다. 윈도우 NT 4.0 워크스테이션, 윈도우 2000 프로페셔널, 윈도우 XP 프로페셔널 운영체제에서, 이 기사에서 다뤄지게 될 지역 개인 대기열(local private queue)를 액세스하기 위해 MSMQ를 이용할 수 있습니다. MSMQ를 이용해 응용프로그램은 데이터를 대기열에 위치시키도록 할 수 있습니다. 그리고 응용프로그램(다른 응용프로그램이던지 대기열에 데이터를 적재한 응용프로그램이던지 간에)이 데이터를 액세스할 때까지, 데이터는 대기열에 계속해서 유지될 것입니다. 실제로 작업을 동기적으로 처리하는 것에 비해 작업을 나타내는 메시지(예를 들자면, 처리할 주문정보 따위)를 대기열에 위치시킴으로써, 주 시스템은 단지 대기열에 게시할 때 요구되는 시간만큼만 지연시간이 발생합니다. 여러 다른 종류의 시스템은 메시지를 대기열에 게시할 수 있으며, 같은 메시지를 검색하도록 사용될 수 있습니다. 그래서 응용프로그램에 확장성을 제공할 수 있는 것입니다.

이 기사에서는, MSMQ를 이용한 작업을 하기 위해 .NET 프레임워크에 의해 제공되는 System.Messaging 클래스를 어떻게 사용하고, 응용프로그램에 비동기 워크플로우를 어떻게 추가할 수 있는지에 대해 설명할 것입니다.

이미 언급한 바와 같이, MSMQ는 윈도우 NT 4.0, 윈도우 2000, 윈도우 XP 프로페셔널에서 모두 사용 가능합니다. 그러나 이 예제에서는 MSMQ가 설치된 윈도우 2000 서버를 보유하고 있다고 가정할 것입니다. 이 기사에서의 예제들은 이 서버가 .NET 코드가 실행되는 장비와 같다고 가정할 것입니다. 그러나, 실제 시스템에서는 이 코드는 분리된 별도 서버에 위치한 메시지 대기열들에 연결해야 할 지 모릅니다.

대기열을 이용한 작업

메시지 대기열을 사용하기 전에 메시지 대기열을 설정할 수 있어야만 합니다. 이를 위해서, 응용프로그램에서 유일무이하고 일관성 있게 대기열을 묘사하는 방법이 필요합니다. .NET은 특정 대기열을 액세스 하기 위한 세가지 다른 방법을 제공합니다.

posted by 써니루루 2007. 3. 29. 15:45

먼저 리모팅(Remoting)을 이용하기 위해
1. 원격 객체를 작성한다.
2. 원격 객체를 Remoting 서비스할 Tcp, Http 채널을 각각 열어주는 서버를 제작한다.
3. 원격 객체를 다루게 될 Client를 Tcp, Http로 각각 작성한다.

위와 같은 순서로 프로젝트 4개를 작성하고 서로 원격 객체를 참조하고 리모팅 어셈블리를 참조해서 구현하게 됩니다.

TCP, HTTP 각각 체널에서 원격 프록시 객체(Remoting Proxy)를 생성하는 방법은 SAO 방법중 Activator.GetObject()를 사용하였다.

위의 예제 코드는 첨부 파일에 포함되어있습니다.

posted by 써니루루 2007. 3. 28. 16:34
기존 리모팅 예제코드를 보셨다면 추가적으로 다음 예제를 해보면 도움이 될 것이다.
http://net2.tistory.com/entry/XFile-4


1. 리모팅을 이용하여 계산을 처리하는 Calc.dll을 윈도우즈 Service에 등록시키고,
서비스를 시작시킨 상태에서 윈 폼으로 리모팅을 호출하여 계산값을 얻어낸다.

(계산을 간단히 코드상에서 처리할 수 있지만 예제로 리모팅을 사용하는 방법을 배워보도록 하자.)

invalid-file

리모팅, 윈도우즈 서비스, 계산기



2. 리모팅을 이용하여 Database에 ADO.NET으로 연결해 쿼리 데이터를 DataSet으로 반환하는 *.dll 을 작성한다. 이 dll을 윈도우즈 서비스에 등록시키고 시작시킨 상태에서 윈폼에 DataGridView 컨트롤에 리모팅으로 받아온 DataSet을 뿌려주는 예제이다.
예제코드의 쿼리문과 Database 연결 코드는 직접 수정해야 할 것이다.

invalid-file

리모팅, 윈도우즈 서비스, DataSet

posted by 써니루루 2007. 3. 28. 12:53

.NET Remoting이란?

  • RPC(Remote Procedure Call)

    • 클라이언트가 원격지에 존재하는 함수를 호출한 후, 그 결과를 원격지로부터 받아내는 기술
  • 리모팅(Remotion)
    • 리모팅은 서비스 개념을 포함한다
    • 원격 서버가 클라이언트에게 서비스(Service)를 제공한다.
  • 닷넷 리모팅에서 소개되는 기술
    • 원격 객체(Remote Object)
    • 원격 객체를 대신하는 클라이언트 프록시 객체(Proxy Object)
    • 마샬링(Marshaling), 언마샬링(Unmarshaling)
    • 직렬화(Serialization), 역직렬화(Deserialization)
    • 네트워크 통신을 위한 체널(Channel)
    • 네트워크로 전송되는 데이터를 인코딩하는 포멧터(Formatter)

.NET Remoting의 구성요소

  • 서버원격 시스템의 구성
    • 원격 클래스와 원격 객체
    • 채널(Channel)
    • 포멧터(Formatter)
      • 데이터를 해석하기 편리하고 전송하기 좋은 형식으로 인코딩 또는 디코딩해야 하는데 이 역할을 담당하는 것이 포멧터이다.
  • .NET Remoting에서 제공해주는 포멧터
    • 포멧터(SoapFormatter)
      • 데이터를 XML 형식의 SOAP 방식으로 인코딩
    • Binary 포멧터(BinaryFormatter)
      • 말그대로 Binary 형식으로 인코딩하기 때문에 인코딩 속도면에서 효율적이지만, 이기종간의 통신 포멧인 SOAP을 이용하는 것이 좋다.
  • 클라이언트 원격 시스템의 구성 요소
    • 프록시 객체(Proxy Object)
      • 원격 시스템에서 클라이언트와 서버 사이를 넘나드는 참조값
    • 채널(Channel)
      • 클라이언트와 원격 서버와 통신하기 위해 존재
    • 포멧터(Formatter)
  • .NET Remoting에서 지원하는 채널의 종류
    • HTTP 채널(HttpChannel)
    • TCP 채널(TcpChannel)
원격 시스템의 구조

원격 시스템의 구조 다이어그램




.NET Remoting의 가장 간단한 예(서버)

  • 원격 서버 프로그램 작성 과정
    • 원격 클래스 작성
    • 원격 서버 프로그램 작성
    • 클라이언트 프로그램 작성
  • 원격 클래스 작성
    • 일단 클래스와 동일하지만 MarshalByRefObject 를 상속받는 것만 다르다

예제 : 원격 클래스 Server/Hello.cs

/**

서비스할 원격 클래스

**/

using System;

public class Hello : MarshalByRefObject

{

public Hello()

{

Console.WriteLine("Hello 생성자 호출");

}

public String SayHello(String name)

{

Console.WriteLine("Hello의 SayHello() 메서드 호출, 매개변수:{0}", name);

return "안녕하세요! [" + name + "] 님";

}

~Hello()

{

Console.WriteLine("Hello 소멸자 호출");

}

}

/***

c:csharpchap14ex01Server> csc /target:library /out:Hello.dll Hello.cs

***/



예제 : 리모트 서버 /Server/HelloServer.cs

/**

원격 클래스를 서비스하는 간단한 서버 프로그램

**/

using System;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

public class HelloServer

{

public static void Main()

{

TcpChannel channel = new TcpChannel(9009);

ChannelServices.RegisterChannel(channel, false);

RemotingConfiguration.RegisterWellKnownServiceType(

Type.GetType("Hello, Hello"),

"BaboHello",

WellKnownObjectMode.SingleCall);

System.Console.WriteLine("서버를 멈추려면 Enter를 누르세요!");

System.Console.ReadLine();

}

}

/***

c:csharpchap14ex01Server> csc /r:Hello.dll HelloServer.cs

c:csharpchap14ex01Server> HelloServer

서버를 멈추려면 Enter를 누르세요!

[참고] .NET Framework 1.0과 1.1에서는 ChannelServices.RegisterChannel(channel)과 같은 방식으로 사용하였다. 하지만 채널만을 입력받는 이 함수는 2.0에서 Obsolete되었다.

이 함수대신 ChannelServices.RegisterChannel(channel, false)와 같이 사용해야 한다. 첫번째 매개변수는 이전과 같이 채널이며 두번째 매개변수는 보안설정이 있는지 없는지를 나타낸다.

***/





예: 원격 클라이언트 Client/HelloClient.cs

/**

원격 서비스를 이용하는 간단한 클라이언트 프로그램

**/

using System;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

public class HelloClient

{

public static int Main(string[] args)

{

TcpChannel channel = new TcpChannel();

ChannelServices.RegisterChannel(channel, false);

object obj = Activator.GetObject(typeof(Hello),

"tcp://localhost:9009/BaboHello");

Hello h = (Hello)obj;

Console.WriteLine(h.SayHello("홍길동"));

return 0;

}

}

/***

1. 원격 클라이언트 실행

c:csharpchap14ex01Client> csc /r:Hello.dll HelloClient.cs

c:csharpchap14ex01Client> HelloClient

안녕하세요! [홍길동] 님

c:csharpchap14ex01Client> HelloClient

안녕하세요! [홍길동] 님

2. 원격 서버 프로그램 (클라이언트 접속후)

c:csharpchap14ex01Server> HelloServer

서버를 멈추려면 Enter를 누르세요!

Hello 생성자 호출

Hello의 SayHello() 메서드 호출, 매개변수:홍길동

Hello 생성자 호출

Hello의 SayHello() 메서드 호출, 매개변수:홍길동

3. 원격 서버 프로그램이 종료했을 때

c:csharpchap14ex01Server> HelloServer

서버를 멈추려면 Enter를 누르세요!

Hello 생성자 호출

Hello의 SayHello() 메서드 호출, 매개변수:홍길동

Hello 생성자 호출

Hello의 SayHello() 메서드 호출, 매개변수:홍길동

Hello 소멸자 호출

Hello 소멸자 호출

[참고]

클라이언트 프로그램을 컴파일하고 실행하기 위해서는 서버의 Hello.dll이 필요하다. 여기서는 여러분이 수동으로 클라이언트의 디렉토리에 복사해주어야 한다.

***/




예제를 사용하는 법 :

1. Hello 원격 클래스를 먼저 컴파일해서 dll 파일로 만든다.
2. 리모트 서비스를 작성해서 띄워놓는다.
3. 리모트 클라이언트를 띄워서 리모트 서비스측에 원격 객체가 생성되는지 확인한다.