외부 데이터를 사용한 작업

ActionScript 3.0에는 외부 소스에서 데이터를 로드하기 위한 메커니즘이 있습니다. 외부 소스는 텍스트 파일과 같은 정적 내용일 수도 있고 데이터베이스에서 데이터를 가져오는 웹 스크립트와 같은 동적 내용일 수 있습니다. 데이터의 형식은 다양한 방법으로 지정할 수 있으며 ActionScript는 데이터의 암호를 해독하고 데이터에 액세스하는 기능을 제공합니다. 데이터를 가져오는 프로세스의 일환으로 데이터를 외부 서버에 보낼 수도 있습니다.

세부 목차

URLLoader 및 URLVariables 클래스 사용
외부 문서에서 데이터 로드
외부 스크립트와 통신

URLLoader 및 URLVariables 클래스 사용

ActionScript 3.0에서는 URLLoader 및 URLVariables 클래스를 사용하여 외부 데이터를 로드합니다. URLLoader 클래스는 URL에서 텍스트, 이진 데이터 또는 URL 인코딩된 변수 형식으로 데이터를 다운로드합니다. URLLoader 클래스는 텍스트 파일, XML 또는 동적 데이터 기반 ActionScript 응용 프로그램에서 사용되는 기타 정보를 다운로드할 때 유용합니다. URLLoader 클래스는 ActionScript 3.0 고급 이벤트 처리 모델을 사용하므로 complete, httpStatus, ioError, open, progresssecurityError 등의 이벤트를 수신할 수 있습니다. 새로운 이벤트 처리 모델은 ActionScript 2.0의 LoadVars.onData, LoadVars.onHTTPStatusLoadVars.onLoad 이벤트 핸들러 지원 기능보다 크게 향상되어 오류 및 이벤트를 더욱 효율적으로 처리할 수 있습니다. 이벤트 처리에 대한 자세한 내용은 이벤트 처리를 참조하십시오.

이전 버전 ActionScript의 XML 및 LoadVars 클래스와 마찬가지로 URLLoader URL의 데이터는 다운로드가 완료될 때까지 사용할 수 없습니다. 전달되는 flash.events.ProgressEvent.PROGRESS 이벤트를 수신하여 다운로드 진행률(로드된 바이트 수 및 전체 바이트 수)을 모니터링할 수 있습니다. 단, 파일이 너무 빨리 로드되면 ProgressEvent.PROGRESS 이벤트가 전달되지 않을 수 있습니다. 파일을 다운로드하면 flash.events.Event.COMPLETE 이벤트가 전달됩니다. 로드된 데이터는 UTF-8 또는 UTF-16 인코딩에서 문자열로 디코딩됩니다.

중요

 

URLRequest.contentType에 아무 값도 설정되어 있지 않으면 값이 application/x-www-form-urlencoded로 전송됩니다.

URLLoader.load() 메서드 및 URLLoader 클래스 생성자(선택 항목)는 URLRequest 인스턴스인 request 하나만 매개 변수로 사용합니다. URLRequest 인스턴스에는 대상 URL, 요청 메서드(GET 또는 POST), 추가 헤더 정보 및 MIME 유형(예: XML 내용을 업로드할 때)과 같은 단일 HTTP 요청의 모든 정보가 들어 있습니다.

예를 들어, XML 패킷을 서버측 스크립트에 업로드할 때 다음과 같은 ActionScript 3.0 코드를 사용할 수 있습니다.

var secondsUTC:Number = new Date().time;
var dataXML:XML = 
    <login>
        <time>{secondsUTC}</time>
        <username>Ernie</username>
        <password>guru</password>
    </login>;
var request:URLRequest = new URLRequest("http://www.yourdomain.com/login.cfm");
request.contentType = "text/xml";
request.data = dataXML.toXMLString();
request.method = URLRequestMethod.POST;
var loader:URLLoader = new URLLoader();
try
{
    loader.load(request);
}
catch (error:ArgumentError)
{
    trace("An ArgumentError has occurred.");
}
catch (error:SecurityError)
{
    trace("A SecurityError has occurred.");
}

앞의 코드 예제에서는 dataXML이라는 XML 인스턴스(서버에 보낼 XML 패킷 포함)를 만듭니다. 다음으로 URLRequest contentType 속성을 "text/xml"로 설정하고 URLRequest data 속성을 XML 패킷의 내용으로 설정합니다. 이 내용은 XML.toXMLString() 메서드를 사용하여 문자열로 변환됩니다. 마지막으로 URLLoader.load() 메서드를 사용하여 새로운 URLLoader 인스턴스를 만들고 원격 스크립트에 요청을 보냅니다.

URL 요청에서 전달할 매개 변수를 지정할 수 있는 방법은 다음 세 가지입니다.

URLVariables 생성자나 URLVariables.decode() 메서드 내에서 변수를 정의할 때 앰퍼샌드 문자는 특별한 의미가 있는 구분 기호로 사용되므로 URL 인코딩해야 합니다. 예를 들어, 앰퍼샌드(&)는 매개 변수 구분 기호로 사용되므로 전달할 때 %26으로 변경하여 URL 인코딩해야 합니다.

외부 문서에서 데이터 로드

ActionScript 3.0으로 동적 응용 프로그램을 작성할 때 외부 파일이나 서버측 스크립트에서 데이터를 로드하는 것이 좋습니다. 그러면 ActionScript 파일을 편집하거나 다시 컴파일하지 않고도 동적 응용 프로그램을 작성할 수 있습니다. 예를 들어, "오늘의" 팁을 표시하는 응용 프로그램을 작성하는 경우 하루에 한 번씩 데이터베이스에서 임의로 하나의 팁을 가져와 텍스트 파일로 저장하는 서버측 스크립트를 작성할 수 있습니다. 그러면 ActionScript 응용 프로그램에서 매번 데이터베이스를 쿼리하지 않고 정적 텍스트 파일의 내용을 로드할 수 있습니다.

다음 코드 예제에서는 외부 텍스트 파일인 params.txt의 내용을 로드하는 URLRequest 및 URLLoader 객체를 만듭니다.

var request:URLRequest = new URLRequest("params.txt");
var loader:URLLoader = new URLLoader();
loader.load(request);

앞의 코드 예제를 다음과 같이 간단하게 작성할 수 있습니다.

var loader:URLLoader = new URLLoader(new URLRequest("params.txt"));

기본적으로 요청 메서드를 정의하지 않으면 Flash Player에서 HTTP GET 메서드를 사용하여 내용을 로드합니다. POST 메서드를 사용하여 데이터를 전송하려면 정적 상수 URLRequestMethod.POST를 사용하여 다음 코드와 같이 request.method 속성을 POST로 설정해야 합니다.

var request:URLRequest = new URLRequest("sendfeedback.cfm");
request.method = URLRequestMethod.POST;

런타임에 로드되는 외부 문서 params.txt에는 다음 데이터가 포함됩니다.

monthNames=January,February,March,April,May,June,July,August,September,October,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday

monthNamesdayNames라는 두 개의 매개 변수가 포함됩니다. 각 매개 변수에는 쉼표로 구분되어 문자열로 구문 분석된 목록이 들어 있습니다. String.split() 메서드를 사용하여 이 목록을 배열로 나눌 수 있습니다.

참고

 

코드를 읽거나 디버깅하기가 어려워지므로 외부 데이터 파일에서 예약어나 언어 구문을 변수 이름으로 사용하지 마십시오.

데이터가 로드되면 Event.COMPLETE 이벤트가 전달되고 다음 코드에서 보듯이 URLLoader의 data 속성에서 외부 문서의 내용을 사용할 수 있게 됩니다.

private function completeHandler(event:Event):void
{
    var loader2:URLLoader = URLLoader(event.target);
    trace(loader2.data);
}

원격 문서에 이름-값 쌍이 있으면 다음과 같이 로드된 파일의 내용에서 전달하는 방식으로 URLVariables 클래스를 사용하여 데이터의 구문을 분석할 수 있습니다.

private function completeHandler(event:Event):void
{
    var loader2:URLLoader = URLLoader(event.target);
    var variables:URLVariables = new URLVariables(loader2.data);
    trace(variables.dayNames);
}

외부 파일의 각 이름-값 쌍은 URLVariables 객체에서 속성으로 만들어집니다. 앞의 코드 샘플에서 변수 객체의 각 속성은 문자열로 처리됩니다. 이름-값 쌍의 값이 항목의 목록이면 다음과 같이 String.split() 메서드를 호출하여 문자열을 배열로 변환할 수 있습니다.

var dayNameArray:Array = variables.dayNames.split(",");

참고

 

외부 텍스트 파일에서 숫자 데이터를 로드하는 경우 int(), uint() 또는 Number() 등 최상위 함수를 사용하여 값을 숫자 값으로 변환해야 합니다.

원격 파일의 내용을 문자열로 로드하여 새 URLVariables 객체를 만드는 대신 URLLoader.dataFormat 속성을 URLLoaderDataFormat 클래스에 있는 정적 속성 중 하나로 설정할 수 있습니다. URLLoader.dataFormat 속성에 사용할 수 있는 값은 다음 세 가지입니다.

다음 코드는 URLLoader.dataFormat 속성을 URLLoaderDataFormat.VARIABLES로 설정하는 경우 로드된 데이터가 자동으로 URLVariables 객체로 구문 분석되는 방법을 보여 줍니다.

package
{
    import flash.display.Sprite;
    import flash.events.*;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;

    public class URLLoaderDataFormatExample extends Sprite
    {
        public function URLLoaderDataFormatExample()
        {
            var request:URLRequest = new URLRequest("http://www.[yourdomain].com/params.txt");
            var variables:URLLoader = new URLLoader();
            variables.dataFormat = URLLoaderDataFormat.VARIABLES;
            variables.addEventListener(Event.COMPLETE, completeHandler);
            try
            {
                variables.load(request);
            } 
            catch (error:Error)
            {
                trace("Unable to load URL: " + error);
            }
        }
        private function completeHandler(event:Event):void
        {
            var loader:URLLoader = URLLoader(event.target);
            trace(loader.data.dayNames);
        }
    }
}

중요

 

URLLoader.dataFormat의 기본값은 URLLoaderDataFormat.TEXT입니다.

다음 예제에서 보듯이 외부 파일에서 XML을 로드하는 것은 URLVariables를 로드하는 것과 같습니다. URLRequest 인스턴스와 URLLoader 인스턴스를 만들고 이러한 인스턴스를 사용하여 원격 XML 문서를 다운로드할 수 있습니다. 파일이 완전히 다운로드되면 Event.COMPLETE 이벤트가 전달되고 외부 파일의 내용이 XML 인스턴스로 변환됩니다. 이 인스턴스는 XML 메서드와 속성을 사용하여 구문 분석할 수 있습니다.

package
{
    import flash.display.Sprite;
    import flash.errors.*;
    import flash.events.*;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class ExternalDocs extends Sprite
    {
        public function ExternalDocs()
        {
            var request:URLRequest = new URLRequest("http://www.[yourdomain].com/data.xml");
            var loader:URLLoader = new URLLoader();
            loader.addEventListener(Event.COMPLETE, completeHandler);
            try
            {
                loader.load(request);
            }
            catch (error:ArgumentError)
            {
                trace("An ArgumentError has occurred.");
            }
            catch (error:SecurityError)
            {
                trace("A SecurityError has occurred.");
            }
        }
        private function completeHandler(event:Event):void
        {
            var dataXML:XML = XML(event.target.data);
            trace(dataXML.toXMLString());
        }
    }
}

외부 스크립트와 통신

외부 데이터 파일 로드 외에 URLVariables 클래스를 사용하여 변수를 서버측 스크립트로 전송하고 서버의 응답을 처리할 수도 있습니다. 예를 들어, 게임을 프로그래밍하는 경우 사용자의 점수를 서버로 전송하여 고득점 목록에 추가해야 할지 여부를 계산하거나 사용자 로그인 정보를 서버로 전송하여 확인하려는 경우에 유용합니다. 서버측 스크립트는 사용자 이름과 암호를 처리하고, 데이터베이스에서 해당 이름과 암호가 맞는지 확인하며, 사용자가 제공한 자격 증명이 유효한지 여부를 확인하여 반환할 수 있습니다.

다음 코드 예제에서는 variables라는 URLVariables 객체를 만듭니다. 이 객체는 name이라는 새 변수를 만듭니다. 그 다음에는 변수를 보낼 서버측 스크립트의 URL을 지정하는 URLRequest 객체를 만듭니다. 그런 다음 URLRequest 객체의 method 속성을 설정하여 변수를 HTTP POST 요청으로 보냅니다. URLVariables 객체를 URL 요청에 추가하려면 URLRequest 객체의 data 속성을 이전에 만든 URLVariables 객체로 설정합니다. 마지막으로 URLLoader 인스턴스가 만들고 URLLoader.load() 메서드를 호출하여 요청을 시작합니다.

var variables:URLVariables = new URLVariables("name=Franklin");
var request:URLRequest = new URLRequest();
request.url = "http://www.[yourdomain].com/greeting.cfm";
request.method = URLRequestMethod.POST;
request.data = variables;
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, completeHandler);
try
{
    loader.load(request);
}
catch (error:Error)
{
    trace("Unable to load URL");
}

function completeHandler(event:Event):void
{
    trace(event.target.data.welcomeMessage);
}

다음 코드에는 앞의 예제에서 사용된 Adobe ColdFusion® greeting.cfm 문서의 내용이 포함되어 있습니다.

<cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0>
    <cfset Form.Name = "Stranger" />
</cfif>
<cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)#
</cfoutput>

Flash CS3

 

이 페이지에 의견 추가되면 전자 메일 알림 받기 | 의견 보고서

현재 페이지: http://livedocs.adobe.com/flash/9.0_kr/main/00000316.html