마스터포유(Master4U)
Monday, 17 of January
 

제목: 클라이언트와 서버 사이의 경계를 없애는 Remote Scripting
분류: 윈도우
이름: 김인호 * http://www.master4u.net


등록일: 2005-10-12 10:34
조회수: 6420 / 추천수: 78
 
클라이언트와 서버 사이의 경계를 없애는 Remote Scripting | WEB 2005/05/19 14:33
http://blog.naver.com/skeehun/140013070219

Jeff Sandquist 저

클라이언트와 서버 사이의 경계를 없애는 Remote Scripting

이번 달에는 Microsoft Remote Scripting을 도입하여 클라이언트와 서버 사이의 경계를 없앨 예정입니다. Remote Scripting을 이용하면 브라우저가 페이지 전체를 리로드하지 않고도 서버에 있는 스크립트를 호출할 수 있는 애플리케이션을 만들 수 있습니다. 이 기사에서는 Remote Scripting을 사용해서 애플리케이션을 원활하게 운영하고 웹 사이트를 보다 빠르고 풍부하고 대응적으로 만드는 법을 배울 것입니다.


Microsoft Remote Scripting을 사용하여 서버와 클라이언트 사이의 관계를 향상시키십시오.

시나리오

다중 브라우저 환경의 애플리케이션을 개발하고 있는데 모든 사원의 이름이 들어 있는 Select 박스를 나타내고 싶습니다.

여러분의 SQL Server 데이터베이스에 1만 명의 사원 이름이 들어 있는 테이블이 있습니다. 사용자를 위해서 테이블 전체를 Select 박스에 로드하게 되면 성능에 큰 지장이 있으며 필요 없는 정보를 다운로드하는 동안 기다려야 합니다. 대신에 처음 10개 기록만 보여준 다음 추가 레코드는 사용자의 입력의 컨텍스트에 기초하여 보내고 싶습니다. 그러므로 사용자가 "S"를 입력하면 테이블은 그 성이 "S"로 시작되는 사원의 처음 10개 기록을 철자순으로 열거할 것입니다. 사용자의 브라우저에 나타나는 출력은 다음과 같은 모양이 될 것입니다.

Select Box

Microsoft Remote Data Service(RDS)를 사용해서 테이블을 로드할 수도 있지만 문제는 여러분의 애플리케이션이 Netscape Navigator 4.x와 Internet Explorer 4.x와 모두 작업이 이루어져야 한다는 점입니다. 최선의 해결책은 Microsoft Remote Scripting의 융통성을 활용하는 것입니다.

Remote Scripting을 이용하면 웹 애플리케이션에서 두 개의 스크립팅 플랫폼을 한 페이지로 결합할 수 있습니다. 또한 애플리케이션의 사용자 인터페이스를 조절하는 클라이언트 스크립트를 만들 수 있습니다. 동시에, 서버의 스크립트를 실행하여 데이터베이스 쿼리와 중간층 비즈니스 로직, 등 서버측 작업을 수행하도록 할 수 있습니다. 클라이언트 페이지가 아직 살아있는 동안 Remote Scripting이 서버에서 실행되기 때문에 여러분의 스크립트는 크게 단순화되고, 애플리케이션은 보다 풍부하고 사용자에게 친숙한 인터페이스를 제공할 수 있습니다.

요구 사항

우리의 애플리케이션은 두 개의 파일 RSClient.htm과 Server.asp로 구성됩니다. 그리고 다음의 파일들도 필요할 것입니다:

    · RS.asp, 는 여러분의 .asp 파일에서 호출되는 메서드가 들어 있는 것으로서 서버측 Remote Scripting을 초기화하고 여러분의 페이지에 적당한 함수로 보냅니다.

    · RS.htm, 은 여러분의 .htm 파일에서 사용하는 메서드를 포함하는 것으로서 Remote Scripting을 초기화하고, 원격 프로시저를 실행하고, 원격 호출의 상태를 점검하고, 메서드 결과를 얻습니다.

    · Rsproxy.class, 는 클라이언트와 서버 페이지 사이에 통신하는 애플릿을 위한 Java 클래스 파일(객체 코드)을 포함합니다.

이 파일들은 Microsoft Remote Scripting 다운로드의 일부입니다. 이 파일들은 여러분의 서버나 프로젝트 의 가상 루트의 바로 밑에 _ScriptLibrary라는 폴더에 복사되어야 합니다. Visual Interdev 6.0을 사용하면 이 파일들은 자동으로 여러분의 서버에 Visual Interdev 6.0 Script Library의 일부로서 복사됩니다.

Internet Information Server(IIS)와 Active Server Pages(ASP) 그리고 ActiveX Data Objects(ADO)도 필요할 것입니다. Windows NT 4.0 Option PackNon-MSDN link은 필요한 파일들을 모두 설치해줍니다.

System DSN 만들기

데이터를 참조하는 시스템 데이터 소스 이름(DSN)을 만드십시오. System DSN은 DSN이 만들어진 컴퓨터의 Windows Registry에 데이터 연결에 대한 정보를 저장합니다. 여러분의 애플리케이션은 Microsoft SQL Server Pubs 샘플 데이터베이스에 연결됩니다. 웹 서버에서 제어판의 ODBC 아이콘을 더블클릭하고 System DSN 탭을 클릭하여 Pubs 데이터베이스를 가리키는 "Pubs"라는 이름의 새로운 System DSN을 만들어 추가하십시오.

  1. 제어판을 열고 ODBC를 더블클릭하십시오.
  2. System DSN 탭을 클릭하고 Add를 클릭하십시오.
  3. 설치된 ODBC 드라이버 목록에서 SQL Server를 선택하십시오. Finish를 클릭하십시오.
  4. 제공된 텍스트 박스에 데이터 소스의 이름과 서버를 입력하십시오. Name을"Pubs"로 설정하고 Server를 SQL Server의 이름으로 설정하십시오. 설명 추가는 선택사항입니다. Next를 클릭하십시오.
  5. SQL Server Authentication 옵션 버튼을 선택하고 Login ID 텍스트 박스에 "sa"를 입력하십시오. 암호도 지정할 필요가 있습니다. Next를 클릭하십시오.

       a. 기본 데이터베이스 체크 박스를 선택하고, 데이터베이스 목록에서 Pubs를 찾으십시오. NextFinish를 클릭하십시오.

       b. 모든 것이 잘 되었는지 확인하려면 Test Data Source를 클릭하십시오. OK를 클릭하여 끝내십시오. ODBC Administrator를 닫으십시오.

코드를 작성합시다!

다음의 코드를 RSClient.HTM이라는 HTM 파일에 복사하십시오. 로드 이벤트에서 <BODY>에 있는 refresh_list 함수를 호출합니다. 클라이언트에서 Remote Scripting을 사용하는데 필요한 루틴은 Rs.htm 파일에 들어 있습니다. 이 파일은 Microsoft JScript include를 사용하여 포함시킵니다.

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE>Servin' It Up with Remote Scripting</TITLE>
<BODY onload="refresh_list()">

<SCRIPT Language="JavaScript" src="_ScriptLibrary/rs.htm">
</SCRIPT>

제목과 HTML 폼을 디스플레이할 것입니다. 폼은 INPUT 박스 하나와 SELECT 박스 하나로 구성됩니다. INPUT 박스는 onkeyup 이벤트에서 우리의 JScript refresh_list 함수를 호출합니다.

listbox를 위한 기본 옵션 값도 공급할 필요가 있습니다. 이것은 Netscape Navigator에 필요한 것이며 이렇게 하지 않으면 Navigator가 우리의 목록 끝을 잘라버릴 것입니다.

<H2>Address Book Sample</H2>

<FORM id=form1 name=form1>
 <INPUT type="text" size="50" id=Myname name=MyName onkeyup=refresh_list()><br>
 <SELECT id=NameList name=NameList size=10>
- One Moment Please ----------------------------------------------------------------------</SELECT>
</FORM>

Microsoft JScript 코드를 이용해서 우리는 Remote Scripting 메서드 RSEnableRemoteScriptingNon-MSDN link을 호출하고 이 페이지에서 Remote Scripting이 가능하게 합니다. refresh_list JScript 함수도 만듭니다.

<SCRIPT LANGUAGE=javascript>
<!--
 RSEnableRemoteScripting();

function refresh_list() {

두 개의 변수 serverURL과 DisplayLength를 정의합니다.

  var serverURL = "server.asp"; /* Filename of our server-side script */
      var DisplayLength = 10   /* Maxinum number of records to return */

Dynamic HTML을 사용해서 우리의 SELECT 박스의 길이를 0으로 설정한 다음 DisplayLength 변수의 값으로 설정합니다.

     
    document.form1.NameList.length = 0
    document.form1.NameList.length = DisplayLength

textbox의 값을 검색하여 Remote Scripting의 RSExcuteNon-MSDN link 메서드와 함께 서버측 함수에 전달합니다.

    var inValue = document.form1.MyName.value;
  var myVar = RSExecute(serverURL, "myFunction", inValue, DisplayLength);

Remote Scripting가 사원의 이름과 성이 들어 있는 JScript 객체를 리턴합니다. 각 레코드는 콜론으로 구분됩니다. Microsoft JScript split method를 이용해서 이 항목들을 살펴본 다음 하나의 배열에 저장합니다.

split method

배열에 루프를 만들고 리스트 박스를 배열 내용으로 채웁니다. 마지막으로 <SCRIPT>와 <HTML> 블록을 닫습니다.

  var myArray = myVar.return_value.split(":");
  for (i = 0; i < 10; i++)
  {
    var myOpt = new Option
    myOpt.value = myArray[i];
    myOpt.text  = myArray[i];
    if (i < myArray.length) 
    {
      document.form1.NameList.options[i] = myOpt;
    }
  }
  
  document.form1.NameList.options[0].selected = true;
 } 
//-->
</SCRIPT>

</BODY>
</HTML>

이제 서버측으로 넘어갑니다(제가 좋아하는 부분입니다). server.asp라는 Active Server Page를 만듭니다. 이 페이지에는 ActiveX Data Objects(ADO)를 사용해서 우리의 데이터베이스를 쿼리하는 서버측 JScript 함수가 들어 있습니다.

으로 그대로 두고 RS.asp 파일을 기본 언어는 Microsoft Visual Basic Scripting Edition포함시킵니다. 페이지의 기본 언어를 JScript로 설정하면 Remote Scripting 포함 파일은 함수 뒤에 처리되고 이렇게 되면 코드에 온갖 에러가 발생합니다. Active Server Pages의 실행 순서에 대하여 자세한 사항은 "Server Q & A - Why does the order of ASP execution seem to be so random?"을 참고하십시오.

Remote Scripting의 RSDispatch 메서드를 호출해서 Remote Scripting을 초기화합니다. RSDispatch 호출은 해당 페이지에서 실행되는 첫번째 서버 스크립트이어야 합니다.

<%@ LANGUAGE=VBSCRIPT %>
<!--#include file="_ScriptLibrary/rs.asp"-->
<% RSDispatch %>

public_description 객체를 만들고 클라이언트 페이지에 노출시키고 싶은 메서드를 열거합니다.

<SCRIPT Language=JavaScript RUNAT=SERVER>
 function Description()
 { 
  this.myFunction = myFunction;
 }
 public_description = new Description();

이제 초기화가 이루어지고 JScript public description 객체가 만들어졌으므로 클라이언트 스크립트에서 호출하는 함수를 만들 수 있습니다. Server Side JScript를 사용해서 함수를 작성할 것입니다. 우리의 프로시저는 두 개의 매개변수-우리가 리턴하고자 하는 수 레코드(numLength)와 우리의 분류 매개변수(strInput)-를 취합니다.

    function myFunction(strInput, numLength)
    {

ADODB Connection 객체를 인스턴스화하고, 데이터베이스 연결을 연 다음 recordset 객체를 인스턴스화합니다. 여러분의 환경에 유효하도록 연결 스트링을 수정할 필요가 있는지 확인할 필요가 있습니다.

      var objConn = Server.CreateObject("ADODB.Connection");
  objConn.Open("dsn=pubs;uid=sa;pwd=;Network=DBMSSOCN");
      var objRS = Server.CreateObject("ADODB.Recordset");

우리의 클라이언트에게 리턴하고 싶은 레코드 수로 MaxRecords 프로퍼티를 설정합니다.

      objRS.MaxRecords = numLength;

SQL Select 문을 사용해서 사원의 이름과 성을 리턴합니다. 이것은 textbox에 입력된 키가 무엇이건간에 그 문자로 시작되는 사람의 이름이 되도록 하고 이것을 철자순으로 정렬합니다. Transact SQL 덕분에 이 일은 참으로 쉽습니다.

      objRS.Open("SELECT au_lname, au_fname FROM Authors Where (au_lname + ', ' + au_fname) >= '" + strInput + "' ORDER BY au_lname, au_fname", objConn, 0, 3);
      
      var tmpMsg = new String;
      tmpMsg.value = "";  

데이터베이스 끝에 도달할 때까지 recordsets를 순환합니다. 검색된 이름과 성을 연결하여 각 기록을 콜론으로 구분합니다.

      while (!objRS.EOF)
      {
        tmpMsg.value = tmpMsg.value + objRS("au_lname") + ", " + objRS("au_fname") + ":";

        objRS.MoveNext();
      }


마지막 단계는 데이터베이스 연결을 닫고, resultset를 클라이언트 스크립트에 리턴하고 그리고 마지막으로 <SCRIPT> 블록을 닫는 것입니다.

      objConn.Close();
      
      return tmpMsg.value;
    }
</SCRIPT>

끝났습니다!

Remote Scripting을 사용해서 우리는 클라이언트와 서버 사이의 경계를 효과적으로 없앴습니다. 우리의 애플리케이션은 클라이언트 코드의 위력을 활용하여 형식지정과 검증을 처리하며 서버측 코드의 다중 브라우저 호환성에 의존합니다.

앞의 코드는 다양한 Remote Scripting 애플리케이션을 위한 프레임웍으로 사용할 수 있습니다. Remote Scripting 코드의 문제 해결에 대해서는 MSDN Scripting Web Site (US)Non-MSDN link에 있는 Checking for ErrorsNon-MSDN link를 참고하십시오. 이번 달에는 저의 팀 동료인 이 달에 코드를 처리해 준 Doug Rothaus에게 감사의 말을 전합니다.

 


Jeff Sandquist는 Microsoft의 최정예 Canucks 중 한 사람이며 Microsoft Developer Support 부서의 Active Server Pages Escalation Team에 소속되어 있습니다.

       
△ 이전글: Indexing Service
▽ 다음글: Remote Registry
Copyright 1999-2019 Zeroboard / skin by enFree