본문 바로가기

TechLog

Flash & Asp.net - 4 ; Asp.net & Flash & Web Service!

Flash & Asp.net - 4 ; Asp.net & Flash & Web Service!

Asp.net으로 간단한 더하기/빼기 웹 서비스를 구성하고, 그 웹 서비스를 호출하는 Flash 개체를 만드는 예제를 보여드립니다.

 

 

안녕하세요 : )

 

지난 아티클(Flash & Asp.net - 3 : XML 파싱에 Serializer 활용하기)에 예고한대로, 이번 아티클은 Asp.net에서의 웹 서비스를 만드는 것과, 플래시에서 웹 서비스를 이용하는 방법에 대한 간단한 예제를 보여드리도록 하겠습니다.

 

이 아티클은 VS.net 2003 Flash MX 2004 환경에서 만들어졌습니다.

편의상 웹 서비스에 대한 설명은 생략하고 진행합니다.

 

Asp.net ; 더하기 빼기 웹 서비스 만들기

 

웹 서비스 프로젝트를 만드는 과정은 생략하도록 하겠다. WebService.asmx라는 이름의 웹 서비스 파일을 생성하고, 예전과 같이 더하기와 빼기 연산을 하는 메서드를 다음과 소스와 같이 구현한다 :

 

[WebMethod]

public int Add(int[] numbers)

{

    int sum = 0;

    foreach(int number in numbers)

        sum += number;

    return sum;

}

    더하기 기능을 수행하는 메서드

 

웹 서비스라고 해서 그다지 특별한 것은 없다. 메서드 앞에 웹 서비스용 메서드라는 표시로 WebMethod라는 Attribute를 주는 것으로 끝이다. 소스에 대해서는 자세한 설명이 필요없을 줄로 안다.

 

파라메터로 int형 배열을 받고 있는데, 이것을 어떻게 전달하는지는 Flash 측 소스에서 보도록 하겠다.

 

[WebMethod]

public int Subtract(int[] numbers)

{

    int minuend = 0;

 

    for(int i=0;i<numbers.GetLength(0);i++)

    {

        if(i==0)

            minuend += numbers[i];

        else

            minuend -= numbers[i];

    }

    return minuend;

}

    빼기 기능을 수행하는 메서드

 

로직의 차이일 뿐, 위의 코드와 별 차이는 없다.

 

[WebMethod]

public string Add_XML(int[] numbers)

{

    int sum = 0;

    foreach(int number in numbers)

        sum += number;

    

    XmlSerializer serializer = new XmlSerializer(typeof(CalculatorMessage));

    CalculatorMessage msg = new CalculatorMessage();

    StringWriter writer = new StringWriter();

 

    msg.Type = "ResponseAdd";

    msg.number = new int[1];

    msg.number[0] = sum;

 

    serializer.Serialize(writer, msg);

    return writer.ToString();

}

    더하기 기능을 수행하는 메서드, 결과를 XML로 리턴한다

 

이 소스가 이해가 가지 않는 분은, 이전 아티클(Flash & Asp.net - 3 : XML 파싱에 Serializer 활용하기)을 참고하기 바란다. 물론 프로젝트에는 예전에 작성했던 CalculatorMessage 클래스가 포함되어 있어야 한다.

 

[WebMethod]

public string Subtract_XML(int[] numbers)

{

    int minuend = 0;

 

    for(int i=0;i<numbers.GetLength(0);i++)

    {

        if(i==0)

            minuend += numbers[i];

        else

            minuend -= numbers[i];

    }

    

    XmlSerializer serializer = new XmlSerializer(typeof(CalculatorMessage));

    CalculatorMessage msg = new CalculatorMessage();

    StringWriter writer = new StringWriter();

 

    msg.Type = "ResponseSubtract";

    msg.number = new int[1];

    msg.number[0] = minuend;

 

    serializer.Serialize(writer, msg); 

    return writer.ToString();

}

    빼기 기능을 수행하는 메서드, 결과를 XML로 리턴한다

 

그리고 테스트를 위해 하나의 메서드를 더 생성하도록 하자 :

 

[WebMethod]

public string Echo(string strText)

{

    return string.Format("Echo:{0}",strText);

}

    Echo 메서드

 

파라메터로 들어온 문자열을 'Echo:' 와 함께 리턴해주는 메서드이다.

 

코드를 모두 입력하고 정상적으로 컴파일했다면, 브라우저에서 결과를 보도록 하자 :

 

   

     웹 서비스의 전체 목록, Echo를 클릭해보자

 

   

     Echo 메서드에 대한 설명

 

파라메터에 'test string'을 넣고 호출해보자 :

 

   

    Echo 메서드의 호출 결과

 

참고로, 웹 서비스에 대한 테스트는 웹 서비스가 존재하는 웹 서버 로컬에서만 실행할 수 있다.

 

 

Flash ; WebServiceConnector

 

Flash MX 2004 (프로페셔널 버전 이상)에서는 플래시에서 데이터 액세스의 확장을 위해 여러가지 데이터 관련 컴퍼넌트를 제공하고 있다. WebServiceConnector는 그 컴퍼넌트 중 하나로, 웹 서비스에 대한 액세스를 지원하기 위해 디자인되었다.

 

그럼 이제 Asp.net으로 만들어진 웹 서비스를 플래시에서 사용해보도록 하자. 테스트를 위해 플래시에서 다음과 같은 폼을 만든다 :

 

   

 

다 섯개의 Button 컴퍼넌트, 하나의 TextArea(Instance Name txtResult로 한다), 그리고 오른쪽 밑에 있는 것이 WebServiceConnector이다. (Components 탭의 Data Components 그룹에 있다) Instance Name wsc로 한다. 그리고 각각의 컴퍼넌트에 ActionScript 코드를 넣자 :

 

on(click)

{

    _root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";

    _root.wsc.operation = "Add";

    _root.wsc.params = [new Array(1,2,3,4)];

    _root.wsc.trigger();

}

     첫번째 '더하기' 버튼

 

on(click)

{

    _root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";

    _root.wsc.operation = "Subtract";

    _root.wsc.params = [new Array(1,2,3,4)];

    _root.wsc.trigger();

}

     두번째 '빼기' 버튼

 

on(click)

{

    _root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";

    _root.wsc.operation = "Add_XML";

    _root.wsc.params = [new Array(1,2,3,4)];

    _root.wsc.trigger();

}

     세번째 '더하기' 버튼

 

on(click)

{

    _root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";

    _root.wsc.operation = "Subtract_XML";

    _root.wsc.params = [new Array(1,2,3,4)];

    _root.wsc.trigger();

}

     네번째 '빼기' 버튼

 

on(click)

{

    _root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";

    _root.wsc.operation = "Echo";

    _root.wsc.params = ['temp'];

    _root.wsc.trigger();

}

     다섯번째 'Echo' 버튼

 

사 실 특별한 코드는 없다. URL을 알려주고, 메서드의 이름을 operation 속성에 넣고, 파라메터를 params 속성에 넣고 trigger()로 웹 서비스 요청을 전송하면 된다. (URL의 경우, 서비스의 페이지가 아니라 WSDL(Web Service Definition Language) 페이지의 주소를 입력해야 된다는 것을 혼동하지 않도록 하자)

 

다만 특이한 점은 params 속성의 값을 넣을 때 []로 감싸고 있는데, WebServiceConnector는 기본적으로 메서드의 파라메터를 Array로 처리하고 있다. 이는 메서드에 여러 개의 파라메터 값이 넘어올 때를 대비한 디자인으로, 파라메터 값이 하나이더라도 저렇게 []로 감싸줘야 Array로 인식을 해서 제대로 처리되게 된다.

 

다른 방법으로, 마지막 Echo 메서드의 경우 이런 식으로 코딩할 수도 있다. 편한 쪽을 선택하면 된다 :

 

on(click)

{

    _root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";

    _root.wsc.operation = "Echo";

    var tmp_param:Array = new Array();

    tmp_param[0] = 'temp';

    _root.wsc.params = tmp_param;

    _root.wsc.trigger();

}

    변경된 다섯번째 'Echo' 버튼의 스크립트

 

그리고 마지막으로, WebServiceConnector의 코드이다 :

 

on(result) {

    _root.txtResult.text = _root.wsc.results;

}

     wsc ; WebServiceConnector 개체

 

일 단 코드는 너무나 간단하다. 하지만 이쯤에서 Flash ActionScript에 익숙지 않은 사람은 이런 의문이 생길 수 있을 것이다 : '왜 꼭 이렇게 처리해야만 하나? trigger()를 호출한 후 곧바로 결과 값을 받아올 수는 없는 것인가?'

 

이 것을 설명하기 위해서는 먼저 ActionScript에 대한 이해가 선행되어야 하겠지만, 최대한 간단히 설명하도록 하겠다 : ActionScript Block되는 명령을 지원하지 않는다. C#에서 프로그램의 실행을 잠시 멈추고 다른 스레드에 cpu를 넘겨주는 System.Threading.Thread.Sleep() 같은 함수도 없으며, 기본적인 모든 개체의 명령은 비동기로 처리된다. 위 코드에서 trigger()를 호출한 후, 프로그램의 제어는 곧바로 그 다음 행으로 넘어가며, 그 상태에서는 아직 웹 서비스의 결과가 리턴되지 않은 상태인 것이다. 이런 구조는 Data-Driven을 지향하는 ActionScript의 철학에 따른 것이며, 보다 자세한 것은 ActionScript 관련 서적을 참고하길 바란다.

 

모든 코딩이 완료되었다면, 결과를 보도록 하자 :

 

   

    첫번째 Add 버튼을 클릭했을 때

 

   

    두번째 Subtract 버튼을 클릭했을 때

 

   

    세번째 Add 버튼을 클릭했을 때

 

   

    네번째 Subtract 버튼을 클릭했을 때

 

   

    다섯번째 Echo 버튼을 클릭했을 때

 

위와 같이 웹 서비스로부터 결과를 받아올 수 있게 된다.

 

 

정리

 

간 단하게나마, Asp.net에서의 웹 서비스 코드 작성과 Flash에서의 WebServiceConnector 관련 작업을 소개해 보았습니다. 이 아티클을 보시면서, 사실 웹 서비스 관련 핵심 코드 자체는 정말 '어이없이 간단한' 코드라는 것을 알게 되셨을겁니다.

 

이제 어떤 개발 툴이건, 어떤 개발 환경이건 웹 서비스에 대한 지원은 쉽고 간단한 형태로 나오고 있는 만큼, 개발자에게 필요한 것은 (내부 디자인에 대한 통찰력도 중요하지만) '이 도구로 무엇을 만들 것인가'가 아닌가 싶습니다.

 

그럼 : )