ActionScript 를 처음 만지는 사람들은 간혹 이런 질문을 할 때가 많다.
순차적으로 실행하지 않아서 통신해서 뭔가 불러올때 대기하지 않고 바로 다음 코드를 실행해서 오류가 난다. 해결 방법이 없을까?
사실 나는 ActionScript 만 만져왔기 때문에 처음엔 이게 무슨 질문인가... 하고 이해를 하지 못했다. 그런데 알고 봤더니 이런 식으로 코딩을 하고 난 뒤에 발생하는 오류였더라
package
{
import mx.rpc.http.HTTPService;
import mx.events.ResultEvent;
public class DataConnection extends HTTPService
{
/**
* Constructor.
*/
public function DataConnection()
{
// super class Constructor.
super();
eventConfiguration();
send("http://www.test.com/callData.php");
}
public var totalDataLength:int = -1;
private function eventConfiguration():void
{
addEventListener(ResultEvent.RESULT, resultHandler);
}
public function getTotalDataLength():int
{
return totalDataLength;
}
private function resultHandler(event:ResultEvent):void
{
totalDataLength = event.result.totalDataLength;
}
}
}이런식으로 통신클래스를 만들어 두고 아래와 같이 사용하는것이 "왜 오류가 나느냐"는게 질문의 골자였다.
private function test():void
{
var connection:DataConnection = new DataConnection();
var i:int = connection.getTotalDataLength();
trace(i);
}
물론 "오류"는 나지 않겠지만 너무나 당연하게도 trace 에서 i의 값은 -1 이 나오게 될거다.
근데 보통은 저렇게 원격지에 있는 데이터를 불러오게 되면 대기하고 있다가 아래있는 코드를 실행시켜 준다는 이야기를 들은 순간....."사실 난 이해할 수가 없었다."
나에게 질문했던 사람들에게 정말로 미안하게도 사실 나는 ActionScript 외에 다른 언어는 깊숙하게 만져본적도 없었을 뿐더러 (Visual C++, Java, php 등등..) Event Driven 방식외에 다른 코딩방식이 있는 줄도 몰랐다.
"당연히 이벤트 방식으로 처리해줘야하는 것인데 왜 저렇게 코딩들을 하셨지?" 라고 밖에 생각이 안되었던 것이다.
그래서 찬찬히 조사해본 결과 충격적인 사실은 ActionScript 외 다른 언어에서는 대기하고 있다가 값이 들어오면 값을 리턴해준다는 거였다;;(나에게만 충격적인 사실임;)
그럼 왜 ActionScript에서는 다른 코드와는 다르게 대기 하지않고 그냥 다음코드를 실행해버리는 걸까.
여러 지인들의 의견과 조사해본 결과에 의하면 크게 두가지 이유가 있는데
1. ECMAScript 기반 코드이기 때문이다.
ActionScript 코드 자체가 ECMAScript 기반 코드로 만들어졌기 때문이다.(ECMAScript의 스팩을 따라간다.) ActionScript가 사실 JavaScript 코드의 형태와 유사하게 만들어진 이유이기도 하다. 어쨌거나 태생적으로 기반이 되는 코드가 ECMAScript라면 개발자의 의도와는 상관없이 바로 다음코드를 실행 할 수밖에 없단다;;
2. FlashPlayer는 싱글쓰레드이기 때문이다.
사실 나는 아직 쓰레드 개념이 없어서(이유는 저위 써놓은대로 쓰레드를 관리 할 수 있을 정도의 로우레벨 언어를 접해보지 못했기 때문이다.) 적당히 통밥으로 얻어 들은 바에 의하면 멀티 쓰레드를 관리할 수 있다면 대기할 수 있도록 조치를 취할 수 있다고 들었다. 그런데 이게 문제가 코드적인 부분이 아니라 산출물인 swf 파일을 실행하는 런타임에 문제가 있다. FlashPlayer다. 물론 AIR 도 AIR 런타임이라고 런타임이 따로 있지만 어찌되었거나 이 둘은 "싱글 쓰레드"로 동작하게 되어있다. 그래서 멀티 쓰레드를 통한 코드의 대기상태 조절이라던가 하는 부분은 물건너 갔다고 보는게 맞을 듯.
위와 같은 이유로 결국 Event-Driven 방식의 코드를 고수할 수 밖에 없다는 결론이 나왔다;
그렇다면 여기에 대한 대안은 없는걸까.
우리는 순차코딩을 하고 싶단 말이다!
물론 순차코딩을 할 수 있다. 하지만 ActionScript의 특성상 외부의 데이터를 갖고 오거나 컨포넌트가 생성된다거나 하는 시점이 규칙적이지 않고 "지멋대로 언제 되는지 알 방법이 없다"는 문제가
순차코딩방식에 빨간불을 켰다.
하나의 메서드만 봤을 때는 물론 순차적으로 진행되는 듯이 보이지만 계속해서 덩치가 커지는 어플리케이션에게 순차적인 방식으로 코드가 진행될 거라고 보장할 수가 없기 때문이다.
게다가 그렇게 덩치가 커지는 어플리케이션에게 순차코딩방식을 고수하라 한다면 결국 클래스들의 참조관계가 너무 강하게 엮이게 되어 "프로젝트 한개밖에 사용할 수 밖에 없는" 재활용이 불가능한
쓰레기 코드가 되어버린다.
예를 들어서 부모 객체에 있는 메서드를 실행하기 위해서 이벤트가 아니라 자식 객체가 직접 실행하려면 결국 그 클래스는 한정된 부모 객체를 갖을 수 밖에 없다. 한정된 부모 객체만 갖을 수 밖에 없는 자식 객체는 살아있는 코드가 아닌 "죽은 코드"가 된다.
위와같은 이유 때문에 Event-Driven 방식의 코드를 만들어야 하는데 이를 위해서는 하나의 목적 클래스 주위로 Event Class를 만들어 보조해주게끔 해야한다.(물론 flash 패키지나 mx 패키지에 있는 이벤트 클래스를 사용해도 되지만.) 그래서 클래스 하나 하나를 만들때마다 충분히 고민하고 설계를 해야 효율적인 코딩을 할 수 있을 것이다.






32085
30
59










댓글을 달아 주세요