본문 바로가기

Blog/Flex

stage, root에 대하여

ActionScript 2.0 버전

swf 파일의 구조와 로드된 파일의 stage, root 참조의 변화를 알아봅니다. ActionScript 2.0에서는 각 level에 바로 swf를 로드할 수가 있습니다. 따라서 다음과 같은 구조를 가질 수 있습니다.

여기에서 _level0, _level1… _levelN 이라는 것은 ActionScript 3.0에서의 Main TimeLine을 뜻합니다. 처음에는 _level0만이 존재할 뿐이며 외부 swf를 특정 _level로 로드하게 되면 해당 _level이 생성됩니다. 특정 _level에 swf 를 로드하게 되면 (_level = swf내용) 으로 봐도 무방할 것 같습니다. 단, A.swf 에 B.swf 가 로드되는 상황이 되면 B의 stage 는 A의 stage를 참조하게 되고 B의 _root에 대한 참조는 경우에 따라 달라집니다.

다음은 A.swf의 무비클립에 B.swf가 로드되는 상황입니다. 이때 B의 _root, stage는 A의 _root, stage를 참조하게 됩니다. 만약 B.swf에 _lockroot=true로 설정되었다면 로드된 B.swf의 _root 참조는 바뀌지 않습니다.

정리하면 로드된 B.swf의 _root는 B.swf에서 _lockroot 를 true로 설정하지 않은 이상 A.swf의 _root (정확히 말하자면 같은_level의 _root)를 참조하게 됩니다. 만약 특정 _level로 로드하는 경우에는 마치 슬롯을 끼워 넣듯이 A.swf의 _level로 B.swf가 들어간다고 보면 될 것 같습니다.

   

 ActionScript 3.0 버전

일단 2.0 버젼과 3.0 버전과의 차이점을 먼저 살펴보면,

Stage 객체는 전역적으로 액세스할 수 없으며 DisplayObject 인스턴스의 stage 속성을 통해 액세스해야 합니다.Stage 클래스는 DisplayObjectContainer의 파생클래스입니다만, 속성 및 메서드의 대부분은 Stage 객체에 적용할 수 없거나 Stage 객체에서 호출될 때 보안 확인을 필요로 합니다. DisplayObjectContainer를 상속받았으니 여러 개의 child를 가질 수 있겠군요. 따라서 이전 버전과 같은 _level이란 용어 자체가 필요없을 것 같습니다.

이전 버전과 구조는 별차이 없어 보입니다. 다만 용어가 좀 차이가 나는 것 같습니다(물론 구현방법은 다르겠지만요). ActionScript 3.0에서는 swf를 바로 로드할 수 없고 Loader를 통해 로드한 후 addChild합니다. 또한 _lockroot 가 항상 true 인 상태라고 생각하면 됩니다. (3.0버전에서 _lockroot 변수는 없어졌네요. 항상 true니까요)

그럼 A.swf 의 stage에 B.swf를 로드한 경우를 생각해 봅시다. 먼저 stage에 로드한 객체를 addChild 한 경우입니다.

Loader를 통해 로드한 후 stage에 addChild 한 형식으로 일반 Container에서 children을 관리하는 모습과 같습니다. 그럼 root에 로드해 봅니다.

역시 같은 원리로 단지 root에 addChild 될 뿐입니다. 단 위에서 밝혔듯이 각 swf의 root는 변함이 없습니다. 또한 각 swf의 stage 속성도 모두 A.swf 의 stage를 참조합니다. 당연한 얘기겠지만 어떠한 경우에라도 stage는 하나라고 단정지어도 될 것 같습니다. root가 아닌 특정 무비클립에 로드를 한다해도 같은 맥락의 결과가 나오겠죠. 우리가 테스트한 root (MainTimeLine)가 곧 stage에 있는 무비클립이기 때문이죠.

   

Flex Framework 상에서 구조

Flex Framework은 ActionScript 3.0 을 기반으로 설계되었습니다. 따라서 위에서 설명한 3.0 버젼의 swf 에 적용되는 원리를 벗어나지 않습니다. 다만 Framework를 구성하기 위한 약속된 객체들이 생성되어지기 때문에 다음과 같은 구조를 갖습니다. 로드한 B.swf를 바로 추가할 수 없으므로 UIComponent로 한번 감쌌습니다.

플래시에서는 swf가 실행되면 맨 처음으로 MainTimeLine 을 생성하지만 Flex 에서는 SystemManager 를 생성합니다. SystemManager 는 로딩상태를 모니터링하다가 Application 인스턴스를 생성합니다. B.swf를 로딩한 후 addChild 했지만 마찬가지로 root 속성은 변하지 않습니다. 위에서 Application 인스턴스 및 UIComponent 의 root는 SystemManager를 가리키겠지만 B.swf의 모든 하위 객체들의 root는 B.swf 의 root를 참조할 것입니다.

그렇다면 Flex Application 에서 다른 Flex Application을 로드하게되면 어떻게 될까요? SystemManager는 MovieClip 클래스의 파생클래스로 2프래임을 가지고 있습니다. SystemManager를 MovieClip으로 생각하면 root를 금방 찿을 수 있겠죠. 다만 로드된 여러 개의 SystemManager 들중 최상위의 SystemManager를 찾기위해 topLevelSystemManager 속성을 가지고 있습니다.