달력

1

« 2025/1 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2010. 7. 9. 13:33

사용자 정의 컴포넌트 만들기 Enjoy/FLEX2010. 7. 9. 13:33

http://help.adobe.com/en_US/Flex/4.0/UsingSDK/WS2db454920e96a9e51e63e3d11c0bf68268-7ffb.html

MXML 또는 ActionScript 파일로 사용자 정의 컴포넌트를 만들 수 있습니다.

MXML component 만들기

플렉스는 고객이 주소 정보를 입력할때 사용할 수 있는 Spark ComboBox를 제공하고 있습니다. 폼에서 미국내 50개 주의 목록에서 선택할 수 있도록 ComboBox를 포함할 수 있습니다. 사용자가 주소를 입력할 수 있는 여러개의 폼이 있는 어플리케이션에서 50개 주에 대한 동일한 정보로 여러 개의 ComboBox 컨트롤을 반복해서 생성하고 초기화 시키는 작업은 지루한 것입니다.

대신 50개 주가 사전에 세팅되어 있는 ComboBox 컨트롤을 포함하는 하나의 MXML 컴포넌트를 만들 수 있습니다. 그럼 어플리케이션 어디에서든지 이 MXML 컴포넌트를 사용하여 주를 선택할 수 있는 기능을 추가할 수 있습니다. 다음은 사용자 정의 ComboBox 컨트롤에 대한 예시를 보여줍니다.

<?xml version="1.0"?>
<!-- createcomps_intro\StateComboBox.mxml -->
<!-- Specify the root tag and namespace. -->
<s:ComboBox xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<s:dataProvider>
<s:ArrayList>
<fx:String>AK</fx:String>
<fx:String>AL</fx:String>
<!-- Add all other states. -->
</s:ArrayList>
</s:dataProvider>
</s:ComboBox>

이 예제는 다음과 같은 내용을 보여줍니다.

  1. 사용자 정의 MXML 컴포넌트 정의의 첫 번째 라인은 XML 버전을 선언합니다.

  2. root  태그라고 불리는 컴포넌트의 첫 번째 MXML 태그는 플렉스 컴포넌트 또는 사용자 정의 컴포넌트을 명시합니다. 따라서 MXML 컴포넌트는 ActionScript 클래스에서와 비슷하게 MXML 컴포넌트의 슈퍼클래스를 루트 태그에서 지정합니다. 이 예제에서 MXML 컴포넌트의 슈퍼 클래스로 플렉스 ComboBox 컨트롤을 지정합니다.

  3. 루트 태그에 xmlns 속성은 플렉스의 XML 네임 스페이스를 지정합니다. 이 예제에서는 xmlns 속성은 접두사 mx:를 사용하는 MX 네임 스페이스에 해당하는 태그를 나타냅니다.

  4. 컴포넌트의 나머지 라인은 컴포넌트에 대한 정의입니다.

다음 예제에서는 메인 어플리케이션이나 다른 MXML 컴포넌트 파일에서  StateComboBox 컴포넌트를 참조하는 것을 보여줍니다.

<?xml version="1.0"?>
<!-- createcomps_intro/IntroMyApplication.mxml -->
<!-- Include the namespace definition for your custom components. -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:MyComp="*">

<!-- Use the filename as the MXML tag name. -->
<MyComp:StateComboBox/>
</s:Application>


이 예제에 대한 실행 swf파일은 아래에 있습니다.

SWF파일 링크
 

사용자 지정 컴포넌트에 대한 MXML 태그 이름은 두 부분으로 구성되어 있습니다. 네임 스페이스 접두사(이 경우에는 MyComp) 와 태그 이름입니다. 네임 스페이스 접두사는 사용자 지정 컴포넌트를 구현하는 파일을 어디에서 찾아야 하는지 플랙스에게 알려줍니다. 태그 이름은 (이 경우에는 StateComboBox.mxml에 해당) 컴포넌트의 파일이름에 기초합니다. 따라서 StateComboBox.mxml 파일이 <namespace:StateComboBox>의 태그 이름을 가진 컴포넌트를 정의합니다.
 
<s:Application> 태그에서 메인 어플리케이션 파일은 다음 네임 스페이스 정의 xmlns:MyComp ="*"를 포함합니다. 이 정의는 그 컴포넌트가 기본 어플리케이션 파일이 있는 디렉토리 또는 ActionScript 소스 경로에 포함된 디렉토리에 있다는 것을 명시합니다. MXML 컴포넌트 배포에 대한 자세한 내용은 Simple MXML components를 참조하십시오.

어플리케이션의 하위 디렉터리에 사용자 정의 컴포넌트를 넣는 것이 가장 좋은 방법입니다. 그것들은 각자 다른 네임 스페이스를 가지고 있기 때문에 컴포넌트 이름이 중복되지 않도록 하는데 많은 도움이 될것입니다. 어플리케이션의 myComponents라는 하위 디렉터리에 컴포넌트를 저장하면 네임 스페이스는 xmlns:MyComp="myComponents.*"가 될 것입니다.

StateComboBox.mxml 파일의 루트 태그로 ComboBox 컨트롤을 지정했으므로, 사용자 정의 컴포넌트의 MXML 태그에서 또는 ActionScript <fx:Script> 태그에서 ComboBox 컨트롤의 모든 속성을 참조할 수 있습니다. 예를 들어 다음 예제는 ComboBox.maxChars 속성과 ComboBox.close 이벤트 리스너를 지정하는 것을 보여줍니다.
<?xml version="1.0"?>
<!-- createcomps_intro/MyApplicationProperties.mxml -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:MyComp="myComponents.*">

<fx:Script>
<![CDATA[
import flash.events.Event;

private function handleCloseEvent(eventObj:Event):void {
// ...
}
]]>
</fx:Script>

<MyComp:StateComboBox maxChars="25"
close="handleCloseEvent(event);"/>
</s:Application>

 

이 예제에 대한 실행 swf파일은 아래에 있습니다.

SWF파일 링크

MXML componrnt에 대한 자세한 내용은 Simple MXML components 참조하십시오.

ActionScript 컴포넌트 만들기

ActionScript 클래스를 정의하여 ActionScript 컴포넌트를 만들 수 있습니다. ActionScript에서 다음과 같은 유형의 componrnt를 만들 수 있습니다.
User-interface, visual, components
사용자 인터페이스 컴포넌트는 처리 논리와 시각적인 요소 모두를 포함하고 있습니다. 기존의 동작을 수정하거나 컴포넌트에 새로운 기능을 추가하는 사용자 지정 사용자 인터페이스 컴포넌트를 만듭니다. 이러한 컴포넌트는 일반적으로 플렉스 컴포넌트 계층 구조를 확장합니다. UIComponent 클래스 또는 Button, ComboBox, DataGrid와 같은 플렉스 컴포넌트를 확장할 수 있습니다. 사용자 정의 ActionScript 컴포넌트의 모든 메서드와 속성, 이벤트, 스타일, 효과는 super클래스로부터 상속 받습니다.
 
Nonvisual components
Nonvisual 컴포넌트는 비시각적 요소를 정의합니다. 플렉스는 formatters, validators, effects를 포함한 nonvisual 컴포넌트의 몇 가지 유형이 있습니다. 플렉스 컴포넌트 구조로부터 하위 클래스를 만들어 nonvisual 컴포넌트를 만들 수 있습니다. validator의 경우 Validator 클래스의 하위 클래스를 만들고 formatter의 경우 Formatter클래스의 하위클래스를 만들고 effect의 경우Effect클래스의 하위 클래스를 만들어 컴포넌트를 만듭니다.

예를 들어 사용자 정의 버튼 컴포넌트를  Spark Button 클래스를 기반으로 정의할 수 있다는 것을 다음 예제로 보여줍니다 :

package myComponents
{
// createcomps_intro/myComponents/MyButton.as
import spark.components.Button;

public class MyButton extends
Button {

// Define the constructor.
public function MyButton() {
// Call the constructor in the superclass.
super();
// Set the label property to "Submit".
label="Submit";
}
}
}

예제에서는 MyButton.as 파일에 MyButton 클래스를 작성합니다.

ActionScript 패키지 내에서 사용자 지정 컴포넌트를 정의해야합니다. 패키지는 어플리케이션의 디렉터리 구조에 컴포넌트의 디렉토리 위치를 반영합니다. 일반적으로 ActionScript 소스 경로에있는 어플리케이션의 하위 디렉토리나 또는 Adobe® LiveCycle™ Data Services ES를 위한 WEB-INF/flex/user_classes 디렉터리에 사용자 정의 ActionScript의 컴포넌트를 넣어둡니다. 이 예제에서는 패키지는 MyButton.as 파일이 플렉스 어플리케이션의 하위 디렉터리인 myComponents에 있다는 것을 나타냅니다.
 
다음 예제는 사용자 정의 컴포넌트를 참조하는 MXML 파일에서 네임 스페이스를 정의하고 MXML 파일에서 그것을 참조하는 방법을 보여줍니다. 
 
<?xml version="1.0"?>
<!-- createcomps_intro/MyApplicationASComponent.mxml -->
<!-- Include the namespace definition for your custom components. -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    xmlns:MyComp="myComponents.*">

    <!-- Use the filename as the MXML tag name. -->
    <MyComp:MyButton/>

</s:Application>
 
이 예제에 대한 실행 swf 파일은 아래에 있습니다.
SWF파일 링크
 
이 예제에서는 먼저 어플리케이션의 디렉토리 구조에서 사용자 정의 컴포넌트의 위치를 명시하는 MyComp 네임 스페이스를 정의합니다. 그런 다음 네임스페이스 접두사를 사용하는 MXML의 태그로 컴포넌트를 참조합니다.
 
자세한 내용은 Create simple visual components in ActionScript를 참조하십시오.

컴포넌트 배포

MXML이나 ActionScript 파일로 사용자 정의 컴포넌트를 배포할 때 일반적으로 지정된 어플리케이션 파일과 같은 디렉토리나 ActionScript 소스 경로로 설정된 디렉토리, LiveCycle Data Services ES를 위한 WEB-INF/flex/user_classes 디렉토리 구조로 사용자 정의 컴포넌트를 배포합니다

보안상의 이유로 소스 코드 파일로 사용자 지정 컴포넌트를 배포하지 않기로 결정할 수도 있습니다. 이런 경우 SWC 파일이나  Runtime Shared Library (RSL)의 일부로 컴포넌트를 배포할 수있습니다.

SWC 파일은 플렉스 컴포넌트에 대한 아카이브 파일입니다. SWC 파일은 플렉스 개발자들 사이에 컴포넌트를 쉽게 주고 받을 수 있도록 합니다. MXML 이나 ActionScript 파일, 이미지 및 기타 리소스 파일 대신 swc파일 하나만 전달하면 됩니다. 또한 컴파일된 SWF 파일을 SWC 파일 내부에 담고 있어서 그 코드가 외부로 노출되지 않습니다.

SWC 파일은 하나 이상의 컴포넌트를 포함하는 PKZIP 압축 형식으로 압축하거나 풀수 있는 파일입니다. SWC은 WinZip, JAR 또는 다른 압축 도구를 사용하여 파일을 확인해 볼 수 있습니다. 그러나 수동으로 SWC 파일의 내용을 변경해서는 안됩니다. SWC 파일 내부의 SWF 파일을 SWC외부에서 실행하려고 해서도 안됩니다.

SWC 파일을 만들기 위해서는 flex_install_dir/bin 디렉토리에 있는 compc 유틸리티를 사용합니다. compc 유틸리티는 MXML/ActionScript  componrnt 소스 파일에서 SWC 파일을 생성 합니다. compc에 대한 자세한 내용은 Flex compilers를 참조하십시오.

application의 SWF 파일 크기를 줄이는 한 가지 방법은 별도로 다운로드되어 클라이언트 캐시에 남아있게 되는 stand-alone file에 공통으로 사용되는 자원을 객관화(externalizing)하는 것입니다. 이러한 공유 자원은 런타임에 여러 어플리케이션에서 수차례 로드가 시도되어도 클라이언트측에는 단 한번만 전송됩니다. 이 공유 파일은 Runtime Shared Libraries 또는 RSLs로 알려져 있습니다.

RSL 파일을 만드는 방법을 포함한 자세한 내용은 Runtime Shared Libraries를 참조하십시오.
:
Posted by 라면스프
2010. 6. 26. 16:26

[java] annotation 사용 Enjoy/JAVA2010. 6. 26. 16:26



JDK 1.5 부터 annotation 을 사용할 수 있도록 되었습니다. annotation 은 영어 사전을 찾아보면

주석 이라도 되어있군요.

 

자바에서 주석은

 

// 의  한줄 주석과, /*    */  의 여러줄 주석 그리고 /**    */ 의 java document 를 만들 수 있는 주석이 있습니다.

 

그러니까 이러한 주석과 번역은 주석 이라고 되더라도 annotation 은 다른것 입니다.^^

위의 것들은 comment 라고 하나요??

 

하여튼 먼저 annotation 의 사용법을 보면

 

@Annotation  이렇게 사용합니다. 앞에 @ 마크가 붙습니다.

 

예전에 document 주석내에서 많이 보던것과 유사하죠.

 

/**

  @author 저자명

*/

 

이런식의 주석이 있었습니다.

 

annotation 은 프로그램 코드의 관점에서 보면 그냥 설명 입니다. 즉 코드에 수행에 영향을 미치치 않습니다.

annotation 은 프로그램의 metadata 를 기술한다고 하는데 이는 프로그램에 대한 부연설명, 덧붙이는말

이 되겠습니다. annotation 은 compiler 나 외부 툴들에게 프로그램에 대한 부가적인 설명을 제공하는데 사용됩니다.

 

사용예를 보겠습니다.

 

프로그램을 작성하고 컴파일하면 deprecated 메소드라는 경고문구가 나오는 경우가 있습니다.

이는 사용하려고 하는 메소드가 앞으로 더 이상 지원되지 않으므로 사용하지 말라는 내용입니다.

물론 이런 경고가 나오는 시점에서는 사용할 수 는 있지만 언제 없어질지 모르는 경우죠.

반드시 대체할 수 있는 메소드나 방법을 찾아보아야 겠습니다.

 

그럼 이제 자신이 만든 메소드가 오래되어서 새로운 버전이 만들어지고 이것을 사용하는 사람들에게

구버전은 사용하지 말도록 deprecate 메세지를 컴파일시 보이고 싶을때 어떡할까요..

 

이때 @Deprecated annotation을 사용하면 됩니다

 

/**

  @deprecated 더이상 지원되지 않는 메소드 입니다.

 */

@Deprecated

public void myOldMethod() {

}

 

이렇게 선언을 하면 컴파일시 위의 메소드를 사용할때 경고를 보여줍니다. 주석안의 @deprecated 와 차이점을

@Deprecated 처럼 대문자로 시작한다는 것입니다.

 

또 다른 하나를 보겠습니다.

 

클래스를 상속 받아서 상위클래스의 메소드중하나를 오버라이드 하는경우 입니다.

 

// 상위 클래스

public class Parent {

  public void parentMethod() {

  }

}

 

// 하위 클래스

public class Child extends Parent {

  public void parentmethod() {

  }

}

 

이처럼 상위의 parentMethod 를 오버라이드할 경우 parentmethod로 소문자로 적어서 오버라이드가 되는게 아니라

새로운 메소드가 되어버리는 실수를 할 수 가 있습니다.

이럴경우 @Override  annotation 을 사용할 수 있습니다.

 

@Override

pubilc void paranemethod() {

}

 

이렇게 정의를 하면 컴파일시 parentmethod 가 상위 메소드를 오버라이드 하는것이라고 컴파일러에게 알리게 됩니다.

하지만 대소문자를 잘못적었기 때문에 오버라이드가 아니므로 컴파일러가 오류를 보여주게 됩니다.

 

이처럼 annotation 은 컴파일러 같은 외부툴들에게 프로그램의 부가적인 정보를 알려주기 위해서 사용됩니다.

또다를 사용처는 EJB3.0 에서는 빈의 특성을 컨테이너에게 알리는데 annotation을 사용합니다.

전에는 빈의 특성을 xml 파일로 작성을 해야만 했습니다.

:
Posted by 라면스프





플러그인 개발 기초 학습, Part 2: 리치 클라이언트 애플리케이션 도입하기








플러그인 개발 기초 학습 연재는 순전히 플러그인 개발에 관한 것이다. 그러나 본격적으로 시작하기 전에, 플러그인 개발을 할 수 있는 적당한 환경을 갖추었는지 확인할 필요가 있다. 먼저 할 일은 Eclipse.org에서 PDE(Plug-in Development Environment)를 갖춘 이클립스 배포판을 다운로드하는 것이다. 이클립스 클래식 최신판 다운로드를 권장한다. 이 연재에서는 이클립스 V3.4(M5) 마일스톤 배포판을 사용할 것이다. 이 작업만 완료하면, 시작할 준비가 끝났다(참고자료에서 이클립스를 어디서 찾을 수 있는지 익히고, 만약 이클립스를 처음 접한다면 추가적인 배경 지식을 얻길 바란다).

플러그인 개발을 쉽게 이해하기 위해 본 기사는 그림 1에 있는 작업 흐름도를 따를 것이다. Part 1에서 작업 흐름도의 앞선 다섯 가지 단계를 살펴보았다. 여기서는, 나머지 두 개의 단계를 살펴보고 리치 클라이언트 애플리케이션 소개를 중점적으로 설명하겠다.


그림 1. 플러그인 개발 작업 흐름도
플러그인 개발 작업 흐름도 

빌드하기

빌드 내용 설정은 플러그인 개발 세상에서 매우 중요한 과정이다. 이클립스에서 모든 플러그인 개발 빌드 관련 설정은build.properties 파일에 들어간다.


그림 2. 빌드 설정(build.properties)
빌드 설정(build.properties) 

자동화된 빌드?

플러그인을 위한 자동화된 빌드 설정은 본 기사의 주제 밖이다. 하지만 자주 물어오는 질문이기 때문에 몇 가지 배경지식을 말하고자 한다. 자동화된 빌드를 셋업하는 가장 일반적인 방법은 이클립스 SDK에서 PDE Build 구성요소를 이용하는 것이다. PDE 빌드의 단점은 컴파일로, 입문자들의 기세를 꺾는다. 자동화된 빌드를 설정하는 방법을 참조하는 빠른 방법은 Pluginbuilder 웹 사이트에 있는 플러그인과 도구들을 살펴보는 것이다(참고자료 참조).

샘플 빌드 설정 내용 중앙에 보면 MANIFEST.MF, plugin.xml과 아이콘 파일들이 있다. 또한 거기에는 국제화 지원을 위한 plugins.properties파일과 라이선스 파일 같은 것들이 존재할 수 있다. binary buildsource build가 각각 가지고 있는 것들의 차이를 아는 것이 중요하다. 일반적으로, 이클립스에서 플러그인을 내보낼 때는, 여러분의 친구들의 이클립스 환경에서 사용할 수 있는 바이너리 플러그인으로 내보낸다. 소스 빌드는 플러그인에 포함된 소스 파일들까지 포함하고 있다. 일반 내보내기 옵션에서 소스 빌드를 하도록 선택할 수 있다.

내보내기

플러그인 개발자의 작업 흐름도에서 마지막 단계는 생성한 플러그인을 내보내는 것이다. 이클립스 PDE는 특화된 내보내기 마법사를 통해 이 과정을 매우 간단하게 처리하도록 돕는다. 이 마법사를 사용하려면(그림 3 참조), 간단하게 File > Export를 클릭하고 Plug-in Development 카테고리에 있는 Deployable Plug-ins and Fragments를 선택한다.


그림 3. 플러그인 내보내기 마법사
플러그인 내보내기 마법사 

이 마법사에서 제일 먼저 선택해야 할 옵션은 내보내려는 플러그인이 무엇인가이다. 여기서는 간단하게 예제인 HelloWorld 플러그인이 될 것이다. 다음 과정은 플러그인을 내보낼 목적지다. 우린 선택적으로 플러그인을 ZIP 파일이나 디렉터리로 내보낼 수 있다. 이 마법사에 있는 다른 옵션들은 플러그인 사인과 플러그인에 있는 소스 빌드와 관련된 것이다. 지금은, 이것들은 일단 무시하고 간단하게 마법사에 있는 Finish를 클릭하여 플러그인을 내보낸다(그림 4 참조). 플러그인 manifest 편집기 화면에 있는 Overview 페이지에 보면 마법사를 실행할 수 있는 하이퍼링크가 있는 것을 눈여겨 봐두자.


그림 4. 디스크로 내보낸 플러그인
디스크로 내보낸 플러그인 

잘했다! 지금까지 살펴본 모든 것이 플러그인을 이클립스 워크스페이스에서 하드 디스크로 사용가능한 형태로 내보내는 과정이다. 이런 형태가 되면, 해당 플러그인을 아주 쉽게 친구나 동료 들이 사용할 수 있다. 이것으로 플러그인 개발 작업 흐름도와 관련된 내용은 끝났고, 이제 이클립스에서 리치 클라이언트 애플리케이션을 만드는 방법을 살펴보자.

리치 클라이언트 플랫폼(RCP)

리치 클라이언트 애플리케이션은 이클립스에서 RCP(Rich Client Platform)를 사용하여 만들 수 있다. 전통적으로, 이클립스 플랫폼은 공개 도구 플랫폼으로 설계되었다. 하지만 그렇게 설계되었기 때문에 그 컴포넌트를 어떤 다른 클라이언트 애플리케이션을 만들 때에도 사용할 수 있다. 리치 클라이언트 애플리케이션을 만들기 위해 필요한 최소한의 플러그인 집합을 RCP라고 한다. 좀 더 많은 내용을 알고 싶다면 참조자료를 참조하라.

제품

이클립스 내에서 리치 클라이언트 애플리케이션을 만들려면, 제품 설정(product configuration)이라는 개념을 이해해야 한다. 제품 설정은 플러그인 개발자가 리치 클라이언트 애플리케이션을 만들 수 있도록 PDE에서 제공한다. 제품 설정을 이해하려면, 그걸 사용할 샘플 리치 클라이언트 애플리케이션이 필요하다. Part 1에서 살펴봤던 PDE 템플릿 메커니즘의 장점을 활용하여 하나를 만들 것이다. 플러그인 프로젝트 이름은 rcp로 하고 그것이 리치 클라이언트 애플리케이션임을 확인시켜주고, RCP Application with a view 템플릿을 선택한다(그림 5 참조).


그림 5. 리치 클라이언트 애플리케이션 템플릿
리치 클라이언트 애플리케이션 템플릿 

다음 단계는 제품 설정 파일을 만들어 우리가 앞에서 만든 리치 클라이언트 애플리케이션을 구성할 때 사용할 것이다. 새로운 제품 설정을 만들려면, 플러그인 프로젝트에서 마우스 오른쪽 버튼을 클릭하고 New > Product Configuration을 선택하여 새로운 제품 설정 마법사를 실행한다(그림 6 참조). 모든 기본값을 그대로 놔두고, 제품 설정 파일 이름을 rcp.product라고 한 다음 Finish를 클릭하여 제품 설정 편집기를 실행한다. 다음 절에서 제품 설정 편집기의 여러 페이지를 살펴보자.


그림 6. 새로운 제품 설정 마법사
새로운 제품 설정 마법사 

Overview 탭

플러그인 manifest 편집기와 비슷하게, 제품 설정 편집기의 첫 번째 페이지는 Overview 탭이다(그림 7 참조). 제품 설정, 테스트와 제품을 내보내기 위한 링크, 그리고 제품이 플러그인을 기반으로 했는지 기능(features)을 기반으로 했는지 선택하는 화면으로 구성되어 있다. 애플리케이션을 빠르게 테스트해 보려면, Testing 섹션에 있는 Launch an Eclipse application을 선택하고 리치 클라이언트 애플리케이션이 어떻게 생겼는지 확인해보자.


그림 7. Overview
Overview 탭 화면 

이것이 제품 설정 편집기에서 제공하는 Overview와 관련된 모든 것이다. 제품 설정에서 할 수 있는 기본 동작들에 관심이 있다면, Overview를 다시 살펴보기 바란다.

애플리케이션 폼을 여기서 실행하는 것도 가능하다, Launch an Eclipse Application을 클릭하면 애플리케이션이 팝업으로 뜨는 것을 확인할 수 있다(그림 8 참조).


그림 8. 애플리케이션 실행하기
애플리케이션 실행하기 

Configuration 탭

Configuration 탭은 제품을 실행할 때 사용할 기본 구성요소들을 가지고 있다. 여기에는 제품을 실행할 때 필요한 파일들에 대한 정보가 포함되어 있다. 첫 번째 섹션인 플러그인과 프래그먼트(Fragment, 역자 주: 다른 번들에 속하여 동작하는 번들)에는 제품을 실행할 때 필요한 플러그인과 프래그먼트들이 간단하게 나열되어 있다. 도움이 되는 팁을 주자면, 제품을 만들고 있을 때는 새로운 의존성들을 추가하게 될 것이다. 이럴 때, Add Required Plug-in을 선택하여 제품 설정에 필요한 모든 것을 편하게 추가할 수 있다.

다음 섹션은, 설정 파일로 OSGi에 특화된 구성물로 config.ini 파일이라는 것을 나타낸다. 약 99.9% 가량 이 설정을 그냥 놔두고 이클립스가 생성한 파일을 사용할 것이다. 이 파일에 있는 모든 것은 이미 앞선 플러그인과 프래그먼트 섹션에서 기술한 것이지만, 이런 특별한 형식으로만 이클립스가 이해하고 실행할 수 있다.


그림 9. 설정
설정 

Launching

Launching 탭은 이클립스 기반 제품 실행을 다루는 모든 정보를 담고 있다. Java Runtime Environment 섹션은 플랫폼에 특화된 JRE를 빌드할 때 편리하게 사용할 수 있다. Program Launcher 섹션은 제품을 실행하는 것과 관련된 설정을 할 수 있다. 예를 들어, 보통 개발자들은 eclipse.exe라는 이름 말고 다른 이름으로 실행 파일을 지칭하길 원할 것이다. 실행 파일 이름 위에, 플랫폼에 특화된 아이콘을 사용하여 나타낼 수도 있다. Launching Arguments 섹션에 제품이 필요로 하는 플랫폼에 특화된 매개변수들을 설정할 수 있다. 이것은 Mac OS X과 같이 특정 운영체제에 따라 특화된 동작이 필요할 때 유용하게 사용할 수 있다.


그림 10. 실행
실행 

Splash 탭

Splash 탭을 사용하여 제품과 관련된 스플래시 화면을 부가적으로 설정할 수 있다(그림 11 참조). 예를 들어, 이클립스를 실행하면, 이클립스를 보여주고 플러그인 로딩 과정을 보여주는 간단한 스플래시 화면을 볼 수 있다. 기본적으로, 예제 RCP 애플리케이션은 간단한 비트맵 기반 스플래시 화면 템플릿을 포함하고 있다. 스플래시 화면과 관련된 재미난 것을 시연해 보기 위해, 로그인 스플래시 화면 템플릿(설정 섹션에 있음)을 활용해보자. 로그인 템플릿을 선택한 다음, 제품 설정을 저장하고 애플리케이션을 실행하자.


그림 11. 스플래시
스플래시 

새로운 스플래시 화면과 로그인 그리고 패스워드 창을 확인하라.


그림 12. 커스텀 스플래시 화면
커스텀 스플래시 화면 

Branding 탭

Branding 탭(그림 13 참조)에서는 세 가지 일을 할 수 있다. 창 이미지 수정, 커스텀 about 창 만들기, 부가적인 환영 페이지 만들기다. 창 이미지란 간단하게 애플리케이션 셸 창과 연관된 이미지들을 말한다. 예를 들어, 이클립스를 실행하고, 타이틀 바를 보면 16x16 크기의 이클립스 아이콘을 볼 수 있다. 설정할 수 있는 아이콘 종류가 몇 가지 있다. 대부분의 소프트웨어 애플리케이션은 라이선스, 개발자, 버전 정보가 담긴 about 창을 가지고 있다. 제품 설정 편집기는 이미 만들어둔 이클립스 about 창을 재활용할 수 있게 해준다. 물론 여러분의 이미지와 정보로 변경할 수 있다.

환영 페이지는 사용자가 애플리케이션을 실행하도록 돕는 역할을 할 것이다. 예를 들어, 기본 이클립스 환영 페이지를 보려면, Help > Welcome 메뉴를 선택하면 된다. 만약 여러분의 애플리케이션 용도로 그와 같은 것을 제공하고자 한다면, Branding 탭의 Welcome Page 섹션에서 할 수 있다. 환영 페이지를 작성하는 것은 본 기사의 주제에서 벗어나기 때문에, 여기에 대해 더 자세한 내용을 알고 싶다면, 참고자료에서 이클립스 사용자 도움 기술에 관해 많은 정보를 찾아보길 바란다.


그림 13. 브랜딩
브랜딩 

결론

이 모든 것을 통틀어, 플러그인 개발 기초 학습 연재의 목표는 베스트 프랙티스가 녹아있는 플러그인 개발 기본에 대해 소개하는 것이었다. Part 1에서 예제 플러그인을 만들고 플러그인 개발 작업 흐름도를 살펴보았다. Part 2에서는 플러그인 개발 작업 흐름도를 마쳤고 리치 클라이언트 애플리케이션을 생성했다. 작업 흐름도를 마치고 나면, 플러그인과 이클립스 RCP 기반 애플리케이션을 개발하는 것이 훨씬 수월해질 것이다.

이제, 계속해서 새로 알게 된 지식을 사용하여 플러그인과 이클립스 기반 애플리케이션을 만들어 보라.


참고자료

교육

제품 및 기술 얻기

토론

  • Eclipse Platform newsgroups는 이클립스와 관련하여 논의할 것이 있을 때 가장 먼저 들려야 할 곳이다(이 링크를 선택하면 기본 유즈넷 뉴스 리더 애플리케이션이 실행되고 eclipse.platform을 열 것이다).

  • Eclipse newsgroups에는 이클립스를 사용하고 확장하는 데 관심있는 사람들을 위한 다양한 참고자료가 있다.

  • developerWorks 블로그와 developerWorks 커뮤니티에 참여하라.


:
Posted by 라면스프




플러그인 개발 기초 학습, Part 1: 기본 요소


요약: 이클립스에서 플러그인 개발은 예술과도 같은 것입니다. 플러그인 개념, 특히 OSGi와 이클립스에 대해 낯설다면, 이클립스를 사용하여 플러그인을 만들 수 있도록 제공하는 수 많은 도구를 익히는 것이 다소 어렵게 느껴질 수도 있습니다. 본 기사의 목적은 좋은 평가를 받고 있는 베스트 프랙티스와 함께 기본적인 플러그인 개발 기술을 익힐 수 있도록 하는 것입니다.





플러그인 개발 101 연재는 순전히 플러그인 개발에 관한 것이다. 그러나 본격적으로 시작하기 전에, 플러그인 개발을 할 수 있는 적당한 환경을 갖추었는지 확인할 필요가 있다. 먼저 할 일은 Eclipse.org에서 플러그인 개발 환경(Plug-in Development Environment: PDE)을 갖춘 이클립스 배포판을 다운로드하는 것이다. 이클립스 클래식 최신 버전 다운로드를 권장한다. 이 연재에서는 이클립스 V3.4(M5) 마일스톤 배포판을 사용할 것이다. 이 작업만 완료하면, 시작할 준비가 끝난 것이다(참고자료에서 이클립스를 어디서 찾을 수 있는지 익히고 만약 이클립스를 처음 접한다면 추가적인 배경 지식을 얻길 바란다).

플러그인 개발을 쉽게 이해하기 위해, 본 기사는 그림 1에 있는 작업 흐름도를 따를 것이다. 본 기사의 Part 1에서는 작업 흐름도 중 처음 다섯 개 과정을 살펴볼 것이다. 나머지는 Part 2에서 살펴볼 것이고 리치 클라이언트 애플리케이션(rich-client application)을 집중적으로 다룰 것이다.


그림 1. 플러그인 개발 작업 흐름도
플러그인 개발 작업 흐름도 

OSGi는 무엇인가?

V3.0에서 이클립스는 이전 버전에서 사용하던 못마땅한 플러그인 기술 기반을 OSGi로 교체하는 큰 도약을 거두었다. OSGi Alliance는 OSGi 기술을 책입지는 독립적인 비영리 단체이고 기본적으로 이클립스 재단과 비슷하다. OSGi Alliance는 OSGi 기술을 설명하는 표준 문서 작성을 책임지고 있다. 간략하게 OSGi 기술은 애플리케이션 개발 용도의 서비스 지향적인 플러그인 기반 플랫폼을 제공한다. 다양한 구현체들이 이 표준을 기반으로 하고 있다. 가장 유명한 구현체 중 하나가 Equinox이며 이것이 이클립스에서 OSGi 스펙을 기반으로 구현한 구현체다(참고자료에서 자세한 배경 정보를 참조하라).

플러그인 생성을 자세히 살펴보기 전에, 정확하게 플러그인이 무엇인지 논의해보자. 기술적으로, 플러그인은 독립적으로 실행 가능하며(self-contained) 자기 서술적인(self-describing) JAR(Java™ Archive)다. 플러그인을 실행하는 데 필요한 코드와 리소스를 묶고 있기 때문에 독립적으로 실행할 수 있다. 자신이 무엇이며, 세상으로부터 무엇을 필요로 하는지, 그리고 세상에 무엇을 기여할지에 대한 정보를 가지고 있기 때문에 자기 서술적이다. 플러그인 내부에서 보통 MANIFEST.MF와 plugin.xml 두 개의 서술 파일을 볼 수 있다.

만들기부터 시작하자

플러그인 개발 작업 흐름도의 첫 번째 부분은 플러그인 프로젝트 만들기다. 이클립스에서, New >Project... 메뉴 옵션을 사용하여 쉽게 이 작업을 할 수 있다. 마법사가 보이면, 생성하고자 하는 프로젝트 타입에Plug-in Project를 선택한다.



그림 2. 새 플러그인 프로젝트 마법사
새 플러그인 프로젝트 마법사 

다른 이클립스 프로제트와 마찬가지로, 마법사는 프로젝트 이름을 입력하라고 요구한다. helloworld라고 하겠다. 그리고 타깃 플랫폼을 선택할 수 있는 옵션이 있다. 해당 문맥에서 타깃 플랫폼이란 단순하게 특정 이클립스 버전 용도인지 Equinox와 같은 OSGi 플랫폼 용도인지를 의미한다. 이 경우, 간단하게 이클립스 3.3 버전을 타깃으로 했다. 새 플러그인 프로젝트 마법사 다음 페이지는 플러그인 내용에 대한 것이다.


그림 3. 플러그인 내용
플러그인 내용 

우리가 만들 플러그인을 이클립스에서 사용할 수 있게 하려면, 플러그인 내용 마법사 페이지에서 반드시 폼을 작성해야 한다. 플러그인 식별자는 여러분의 플러그인을 식별할 수 있는 유일한 값을 타나내는 필드다. 다른 어떤 플러그인도 같은 식별자를 사용할 수 없다. 플러그인 버전은 네 부분으로 나뉘어 있다(세 개의 숫자와 문자열 하나). 각각은 major.minor.service.qualifier로 구성된다(참고자료에서 이크립스 플러그인 버전 정하기 가이드를 참조하라). 플러그인 이름은 사람들이 읽기 편한 간단한 이름을 준다. 플러그인 제공자 필드는 플러그인 작성자에 대한 정보를 사람들이 읽기 편한 형태로 기입한다. 간략하게, 실행 환경(EE) 필드는 여러분의 번들을 실행할 수 있는 최소한의 JRE를 명시한다(참고자료).

마법사는 플러그인 활성자(activator)를 설정할 수 있는 옵션을 제공한다. 플러그인 활성자는 단순한 클래스로 플러그인 생명 주기를 제어한다(start-and-stop 메서드처럼 생각하라). 보통, 활성자를 사용하여 기본 설정을 하고 플러그인이 더 이상 필요 없어질 때 자원을 반납하는 용도로 사용한다. 여기서는, 활성자를 사용하여 플러그인이 사용할 UI를 만들도록 하여, RCP(Rich-Client Platform) 애플리케이션을 만들 것이다(참고자료 참조).

플러그인 생성 마지막 단계는 새 플러그인이 기반으로 할 템플릿(그림 4 참조)을 선택하는 것이다. 플러그인 생성에 익숙하다면 이 단계는 보통 생략할 것이다. 하지만, 처음 접하는 사람들은 어느 정도 시작점이 필요하다. 따라서 이클립스 SDK는 다양한 템플릿을 제공하여 쉽게 시작할 수 있도록 하고 있다. 여기서는, 기본 Hello World with a view 애플리케이션을 선택한다.


그림 4. 플러그인 템플릿
플러그인 템플릿 

수정

MANIFEST.MF 내부

MANIFEST.MF 파일 내부에서 사용할 수 있는 헤더들이 궁금하다면, OSGi Alliance에서 가용한 OSGi 명세서를 참조하라(참고자료 참조).

앞선 단계를 마친 다음, 새로운 플러그인이 워크스페이스에 추가됐을 것이다. 그리고 현재 새로 만든 플러그인을 다룰 때 도움을 주는 편집기(그림 5 참조)가 보일 것이다. 편집기의 첫 번째 페이지는 개요(Overview) 페이지다. 이 페이지에는 수정 가능한 플러그인 식별자를 포함하여 플러그인과 관련된 여러 가지 편집 가능한 목록을 가지고 있다. 예를 들어, 이전에 정의했던 식별자(ID)와 버전 필드 그리고 그림 4에서 살펴봤던 템플릿이 있다.


그림 5. 플러그인 편집기(개요 페이지)
플러그인 편집기(개요 페이지) 

확장 기능과 확장 지점

다양한 확장 지점

이클립스 V3.3에는 200개가 넘는 확장 지점을 이클립스 SDK가 제공한다. SDK에서 무엇이 확장 가능한지(다른 말로 하자면, 확장 지점) 목록을 보고 싶다면, 이클립스 재단의 문서 "Platform Extension Points"를 확인하라(참고자료참조).

플러그인 탐험하기 다음 단계는 확장 기능을 추가하는 것을 살펴보겠다. 하지만 자세히 살펴보기 전에, 먼저 확장 가능한 이클립스 플러그인과 관련된 두 가지 중요한 개념을 살펴보자. 간단하게 비유하자면, 확장 기능(extension)은 플러그로 확장 지점(extension point)은 소켓으로 생각할 수 있다. 각각의 확장 지점은 유일하고 적용하기 위해 필요한 조건을 정의하고 있다. 예를 들어, 이클립스는 org.eclipse.ui.editors 확장 지점(소켓)에 우리가 만든 편집기(플러그)를 끼워넣고 사용할 수 있다.

여기서는, 이클립스 도구 모음에 추가할 새로운 확장 기능을 만들 것이다. 그러기 위해 org.eclipse.ui.actionSets 확장 지점에 해당하는 템플릿(앞에서 플러그인을 만들 때 사용한 템플릿과 비슷한 개념)을 사용할 것이다. 플러그인 편집기의 개요 페이지에서 Extension/Extension Point Content 섹션에 있는 Extensions 링크를 선택한다. Add...를 클릭하고 기본값이 채워진 상태로 org.eclipse.ui.actionSets 템플릿(그림 6 참조)을 선택한다.


그림 6. 확장 기능 템플릿
확장 기능 템플릿 

런타임

플러그인에서 중요한 부분으로 자기 서술을 하는 부분이다. 플러그인이 반드시 서술해야 하는 것 중 하나는 외부에 제공하느냐다. 이클립스 문맥에서 이를 공개한 패키지들(exported packages)이라고 한다. 우리의 플러그인에서, 다른 플러그인들이 우리 플러그인 내부에 의존하는 패키지들을 참조할 수 있도록 다른 플러그인들에게 어떤 패키지들을 공개할지 결정해야 한다. 또한 공개한 패키지들을 내부에서만 사용할 것으로 설정할 수도 있는데, 이것은 플러그인 개발자들에게 해당 패키지들은 API로 생각하고 있지 않다고 말하는 것과 같다. 공개한 패키지들을 설정하려면, manifest 편집기에 있는 런타임(Runtime) 페이지를 이용한다.


그림 7. 런타임 페이지
런타임 페이지 

의존성

다양한 플러그인

이클립스 생태계에는 수많은 플러그인들이 있어 찾다가 필요한 것을 헤매기 쉽다. 플러그인을 찾을 때 유용한 두 개의 사이트를 소개하고자 한다. 하나는 이클립스 재단의 프로젝트 목록이고, 두 번째는 이클립스 플러그인 센터(Eclipse Plug-in Central)다(참고자료 참조).

앞선 절에서, 플러그인이 반드시 자신의 기능을 세상에 알리기 위해 해야 하는 일을 설명했다. 자, 이제 다른 플러그인에서 앞에서 말한 기능을 사용하고 싶다고 상상해보자. 해당 기능을 사용하고 싶다는 것을 어떻게 표현할 것인가? 이클립스 문맥에서는 의존성(dependencies)으로 표현한다. 가장 간단한 경우, 플러그인들이 다른 플러그인에 의존할 수 있다. 예를 들어, 만약 여러분의 편집기를 이클립스에서 사용하고 싶다면,org.eclipse.ui.editors 플러그인에 의존해야 할 것이다. 의존성을 기술하려면, 플러그인 편집기의 의존성(Dependencies) 페이지를 사용해야 한다.


그림 8. 의존성 페이지
의존성 페이지 

다른 플러그인에 의존할 때 알아야 할 것은, 플러그인들이 공개한 패키지들에만 선택할 수 있다는 것이다(의존성 페이지의 불러올 패키지(Imported Packages) 부분을 참조하라). 이 부분은 더 어려운 주제인데 여러분의 플러그인이 특정 구현체에 묶이는 것을 원하지 않을 때 유용하다. 예를 들어, XML 파서가 제공하는 com.company.xml.parser 패키지에 의존한다고 생각해보자. 이 때 각기 다른 환경에서 사용할 수 있는 두 개의 플러그인 com.company.xml.parser.mobile과 com.company.xml.parser.desktop 이라는 동일한 XML 파서의 서로 다른 구현체를 머리속에 떠올려보자.

소스 편집기

런타임과 의존성 페이지는 MANIFEST.MF 파일에 기술되어 있는 중요 정보를 가시화해 보여준 것이다. 이 파일 소스를 직접 편집하고자 하는 고급 사용자들을 위해, PDE는 소스 편집기를 제공한다. 소스 편집기는 플러그인 manifest 정의에 사용하는 다양한 헤더에 코드 완성 기능을 제공한다.


그림 9. 소스 편집하기
소스 편집하기 

테스트와 디버깅

플러그인 탐험 다음 단계는 테스트와 디버깅이다. 플러그인 테스트 용도로, 이클립스와 PDE는 자기 호스팅(self-hosting)이라는 개념을 가지고 있다. 자기 호스팅은 간단하게 현재 작업하는 플러그인을 탑재한 새로운 이클립스를 실행하는 것을 말한다. 물론 이 과정에서 실제로는 어떤 플러그인도 공개하거나 배포하지 않는다. 새로운 이클립스를 실행하려면, 개요 페이지에서 테스팅(Testing) 부분(개요 페이지에 있는 Launch an Eclipse application 참조)에서 새로운 런타임 워크벤치를 시작하면 된다. 몇 초 후에, 여러분의 플러그인 샘플 액션이 도구 모음에 추가된 채 새로운 워크벤치 팝업이 뜨는 걸 볼 수 있을 것이다.


그림 10. 이클립스의 자기 호스팅
이클립스의 자기 호스팅 

테스트 주도 플러그인 개발

실제 플러그인을 개발하기 전에 테스트부터 작성하는 것에 관심이 있다면, 테스트만 있는 플러그인을 작성하는 것이 가능하다. 플러그인에 포함되어 테스트를 실행할 수 있는 Plug-in JUnit Test라는 특별한 실행 설정이 존재한다.

디버그 모드에서 자기 호스팅 상태의 플러그인을 실행하려면, 개요 페이지의 테스팅 섹션에서 Launch an Eclipse application in debug mode 링크를 클릭하면 된다. 실제로 여러분의 플러그인을 디버깅하려면, 관련된 중단점을 설정할 필요가 있다. 이클립스에서 디버깅을 처음 해본다면, developerWorks 기사 "Debugging with the Eclipse Platform"을 추천한다. 이 문서가 처음해보는 독자들에게 도움이 될 것이다(참고자료 참조).

플러그인 실행이나 디버깅에 대해 더 상세한 옵션을 설정하려면, 실행 설정(Launch Configuration) 창으로 이동한다. 이 창은 Run > Run Configurations... 메뉴 옵션을 선택하면 볼 수 있다. 여러분의 플러그인과 관련 있는 실행 설정 타입은 "Eclipse Application"이다. 우리가 실제 실행하고 싶은 것이 이클립스 애플리케이션이기 때문이다(그림 11 참조). 실행 설정에서, 여러분은 인자와 같은 것들을 설정할 수 있으며 애플리케이션을 실행할 때 사용할 JRE를 제어할 수 있다.


그림 11. 실행 설정 창
실행 설정 창 

문자열 외부화하기

플러그인 개발에서 가장 흔히 하는 작업이 국제화다. 여러분의 플러그인이 유용하고 많은 사람이 사용하면, 여러분의 플러그인을 여러 언어 환경에서 동작할 수 있도록 해달라는 요청을 받게 될 것이다. 고맙게도, 플러그인과 관련된 문자열을 외부화할 때 필요한 상당량의 작업이 최소화되었다. PDE 안에서 플러그인 개요 페이지에서 마우스 오른쪽 버튼을 클릭하고 Externalize Strings... 메뉴 아이템을 선택하면 마법사를 볼 수 있다. 선택하면, 외부화와 관련된 모든 문자열을 보여주는 화면을 볼 수 있다.


그림 12. Externalize Strings 마법사
Externalize Strings 마법사 

실제로, 이것은 plugin.properties 파일(외부로 빼낸 문자열들을 담고 있다)을 플러그인 내부에 생성하고 MANIFEST.MF 파일에Bundle-Localization 헤더를 추가한다. Bundle-Localization 헤더를 사용하여 간단하게 외부화한 문자열들의 이름과 부가적인 위치를 설정할 수 있다. 여기서는, Bundle-Localization에 "plugin,"이라고 설정했는데, 이것은 다양한 지역의 문자열이 plugin.properties(그림 13 참조), plugin_fr.properties, plugin_de.properties 같은 파일에 존재할 수 있다는 것을 뜻한다. 파일 이름에서 밑줄 다음에 오는 문자는 지역 정보를 나타낸다.


그림 13. plugin.properties 파일
plugin.properties 파일 

이게 다다! 플러그인과 관련된 국제화와 관련된 모든 것을 살펴봤다. 좀 더 많은 정보를 원한다면, 다소 오래되긴 했지만 여전히 유효한 이클립스 코너의 기사 "How to Internationalize your Eclipse Plug-in" 과 "How to Test Your Internationalized Eclipse Plug-In"을 추천한다(참고자료 참조).

manifest 정리하기

우리 여행의 다음 목적지는 manifest 파일들(MENIFEST.MF와 plugin.xml)을 몇 가지 베스트 프랙티스로 정리하는 것이다. PDE는 개요 페이지의 Exporting 섹션을 통해 그와 관련된 편리한 마법사를 제공한다. 마법사가 뜨면(그림 14 참조), 선택할 수 있는 다양한 옵션이 보일 것이다. 기본값들이 보통 타당하지만, plugin.properties 파일에 키값이 없는지 확인하는 것과 같은 특정 옵션들이 있을 수 있는데 이것들이 매우 유용하다.


그림 14. Optimize Manifest 마법사
Optimize Manifest 마법사 

결론

전체적으로, 본 기사의 미션은 몇몇 베스트프랙티스를 기반으로 플러그인 개발 기본 요소를 소개하는 것이다. 우리는 샘플 플러그인을 만들고 일반적인 플러그인 개발 작업 흐름도를 통해 이를 달성했다. 작업 흐름도를 다 익히고 나면, 플러그인을 개발하는 것이 더 쉬워질 것이고 Organize Manifest 마법사와 같이 베스트프랙티스를 사용하여 유지보수 할만큼 익숙해질 것이다. Part 2에서는 리치 클라이언트 애플리케이션 개발을 할 때 이용할 수 있는 도구 사용법과 그림 1에서 살펴보았던 플러그인 개발 작업 흐름도 나머지 부분들을 끝낼 것이다.


참고자료

교육

제품 및 기술 얻기

토론

  • Eclipse Platform newsgroups는 이클립스와 관련하여 논의할 것이 있을 때 가장 먼저 들려야 할 곳이다(이 링크를 선택하면 여러분의 기본 유즈넷 뉴스 리더 애플리케이션이 실행되고 eclipse.platform을 열 것이다).

  • Eclipse newsgroups는 이클립스를 사용하고 확장하는 데 관심있는 사람들을 위한 다양한 참고자료가 있다.

  • developerWorks 블로그에 가입하고 developerWorks 커뮤니티에 참여하라.



Part 2 보기

:
Posted by 라면스프
2010. 6. 24. 15:05

eclipse plugin Enjoy/JAVA2010. 6. 24. 15:05

* Eclipseutil-refresh 플러그인

https://eclipseutilplugins.dev.java.net/

자주쓰는 CVS 커밋,업데이트,싱크 메뉴를 단축아이콘으로 등록하여 편리하다.

 

 

 

* Copy Fully Qualified Class Name 플러그인

http://www.jave.de/eclipse/copyfully/index.html

클래스이름을 패키지명까지 포함해서 쓸일이 많다면 필수적인 플러그인이다.

 

 

 

* GotoFile 플러그인

http://www.muermann.org/gotofile/

프로젝트에 속한 파일을 빨리 찾을 수 있다. 파일명의 일부만 치면 바로바로 목록이 나온다.

 

 

* Windows Context Menu 플러그인

http://www.geocities.com/richard_hoefter/ContextMenuPlugin/

이클립스에서 윈도우 컨텍스트메뉴(오른클릭 메뉴)를 쓸 수 있다.

 

 

* Call Hierarchy 플러그인

http://eclipse-tools.sourceforge.net/call-hierarchy/

메소드 호출관계를 트리로 보여준다.

 

스크린샷 http://eclipse-tools.sourceforge.net/call-hierarchy/images/screenshot1.png

 

 

* Commonclipse 플러그인

http://commonclipse.sourceforge.net/

toString() 메소드 등을 자동으로 만들어준다. 자바빈의 내용을 로그에 찍고 싶을 때 좋다.

 

 

 

* Properties Editor 플러그인

http://propedit.sourceforge.jp/index_en.html

properties 파일 편집할 때 그냥 일반 텍스트 편집하듯 편집하면된다.native2ascii 같은거 몰라도 된다.

 

 

 

 

* AnyEdit tools 플러그인

http://andrei.gmxhome.de/anyedit/index.html

텍스트 에디터 기능이 약한 이클립스에 몇가지 기능을 추가해준다. 나는 주로 Open type(file) under cursor 메뉴를 사용한다.

 

step1

 

 

* Log4E 플러그인

http://log4e.jayefem.de/index.php/Main_Page

소스에 log4j 구문을 삽입해준다. 코딩 무지 편해졌다. -.-;

 

 

* Web Service Console 플러그인

http://wscep.sourceforge.net/

웹서비스를 개발한다면 꼭 있어야한다. 요청/응답 SOAP 메시지를 직접 눈으로 보면서 서비스를 테스트할 수 있다.

스크린샷 : http://wscep.sourceforge.net/images/s5.GIF

:
Posted by 라면스프
2010. 5. 28. 15:12

Manually adding drag-and-drop support Enjoy/FLEX2010. 5. 28. 15:12



Manually adding drag-and-drop support


To support drag-and-drop operations with non-list-based controls, or with containers, you must explicitly add support by using a series of special classes and events.


Example: Simple drag-and-drop operation

The following example lets users color a canvas by dropping either of two sample colors onto it. It shows the basic elements of a drag-and-drop operation. The following sections describe these elements in greater detail.

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

    <mx:Script>
    <![CDATA[
        import mx.core.DragSource;
        import mx.managers.DragManager;
        import mx.events.*;
        import mx.containers.Canvas;

        // Called when the user clicks the mouse on either colored canvas.
        // Initializes the drag.
        private function dragIt(event:MouseEvent, text:String,
format:String):void { // Get the drag initiator component from the event object. var dragInitiator:Canvas=Canvas(event.currentTarget); // Create a DragSource object. var ds:DragSource = new DragSource(); // Add the data to the object. ds.addData(text, format); // Create a Canvas container to use as the drag proxy. // You must specify a size for the proxy image, // or else it will not appear. var canvasProxy:Canvas = new Canvas(); canvasProxy.width=30; canvasProxy.height=30; canvasProxy.setStyle('backgroundColor',
dragInitiator.getStyle('backgroundColor')); // Call the DragManager doDrag() method to start the drag. // For information on this method, see // the "Initiating the drag" section. DragManager.doDrag(dragInitiator, ds, event, canvasProxy); } // Called if the user dragged a proxy onto the drop target canvas. private function doDragEnter(event:DragEvent):void { // Get the drop target component from the event object. var dropTarget:Canvas=Canvas(event.currentTarget); // Accept the drag only if the user is dragging data // identified by the 'color' format value. if (event.dragSource.hasFormat('color')) { DragManager.acceptDragDrop(dropTarget); } } // Called if the target accepts the dragged object and the user // releases the mouse button while over the canvas. // Handles the dragDrop event for the List control. private function doDragDrop(event:DragEvent):void { // Get the data identified by the color format from the drag source. var data:Object = event.dragSource.dataForFormat('color'); // Set the canvas color. myCanvas.setStyle("backgroundColor", data); } ]]> </mx:Script> <!-- A horizontal box with red and green canvases the user can drag --> <mx:HBox> <mx:Canvas backgroundColor="red" borderStyle="solid" width="30" height="30" mouseMove="dragIt(event, 'red', 'color');"/> <mx:Canvas backgroundColor="green" borderStyle="solid" width="30" height="30" mouseMove="dragIt(event, 'green', 'color');"/> </mx:HBox> <mx:Label text="Drag the item into this canvas"/> <!-- Handles dragEnter and dragDrop events to allow dropping --> <mx:Canvas id="myCanvas" backgroundColor="#FFFFFF" borderStyle="solid" width="100" height="100" dragEnter="doDragEnter(event);" dragDrop="doDragDrop(event);"/> </mx:Application>
:
Posted by 라면스프
2010. 5. 28. 11:29

Using the ToolTip Manager Enjoy/FLEX2010. 5. 28. 11:29



Enabling and disabling ToolTips



<?xml version="1.0"?>
<!-- tooltips/ToggleToolTips.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

  <mx:Script><![CDATA[
     import mx.managers.ToolTipManager;

     private function toggleToolTips():void {
        if (ToolTipManager.enabled) {
           ToolTipManager.enabled = false;
        } else {
           ToolTipManager.enabled = true;
        }
     }
  ]]></mx:Script>

  <mx:Button id="b1"
    label="Toggle ToolTips" 
    width="150" 
    click="toggleToolTips();" 
    toolTip="Click me to enable/disable tooltips."
  />
  
</mx:Application>

Using effects with ToolTips


<?xml version="1.0"?>
<!-- tooltips/FadeInToolTips.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="600" height="600" initialize="app_init();">

  <mx:Script><![CDATA[
     import mx.managers.ToolTipManager;
     public function app_init():void {
        ToolTipManager.showEffect = fadeIn;
     }
  ]]></mx:Script>

  <mx:Fade id="fadeIn" alphaFrom="0" alphaTo="1" duration="1000"/>

  <mx:Button id="b1" label="Click Me" toolTip="This is a ToolTip that fades in."/>

</mx:Application>
:
Posted by 라면스프
2010. 5. 28. 11:20

51가지 AS3, Flex 테크닉 & 예제 Enjoy/FLEX2010. 5. 28. 11:20


출처 : http://www.insideria.com/2009/04/51-actionscript-30-and-flex-op.html



51 ActionScript 3.0 and Flex optimization techniques and practices

Author photo
|  | Comments (30)
AddThis Social Bookmark Button

A homework assignment I was recently given for a Java programming class involved a competition to see who could create the most optimized implementation of an interface which was provided by the instructor. It was a challenging and very fun assignment that I think the whole class enjoyed. I didn’t win the competition but still came out a winner because of my heightened interest in application optimization and performance tuning that I gained.

I’m personally a pretty big fan of coding standards and have been ribbed by many developers over some of the longer method, variable and class names that I sometimes choose. I've always leaned toward the side of programming that employs standards and frameworks . Rather than spending a ton of time digging around in compiler specs and messing with GC (Garbage Collection) for reasons of performance, tuning and optimization. I was leaving this to the seasoned programmers creating the standards and frameworks I use.

This isn’t to say I’ve never paid attention to performance and I enjoy building slow applications. It’s almost like two different worlds; the optimization world and the standards world. They don’t always agree with each other. There can sometimes be a trade off for performance over readability and organization or vice-versa. This article is meant to stand next to the Flex Best Practices articles that I authored.

While creating my concrete implementation for the homework assignment I discovered a powerful profiling engine in NetBeans. The NetBeans profiling engine helped me understand some of the memory usage and consumption of each property, method call and object instantiation in my program. This profiler in NetBeans is very similar to the one found in Flex Builder. Both are very powerful and very useful. I've been exploring the Flex Profiler in greater detail lately as well and using it to eradicate memory leaks for a real world application I’ve been refactoring to best practices lately.

The Java optimization homework has increased my interest in optimization and profiling for ActionScript 3.0 and Flex development. I've been piecing together ActionScript optimization techniques and practices from around the web for a couple years now. Some of these techniques are in opposition to what the standards dictate but most of software development is this way. You have to learn when to use some techniques and when to leave some out.

Here are 51 ActionScript 3.0 and Flex optimization techniques and practices. I’ve scoured the web for and filtered practices and techniques that can be adopted into your application development process. Use these in conjunction with the Flex Profiler to monitor and optimize and tune the performance of your ActionScript 3.0 and Flex RIAs.

1. Avoid the new operator when creating Arrays

 
var a = [];

NOT:

 
var a = new Array();

2. Arrays are expensive to create, do so conservatively

 
var vanityCollection01 : Array = new Array();
var vanityCollection02 : Array = new Array();
var vanityCollection03 : Array = new Array();
var vanityCollection04 : Array = new Array();

3. Fastest way to copy an array:

 
var copy : Array = sourceArray.concat();

4. Setting values in Arrays is slow

 
employees.push( employee );
employees[2] = employee;

5. Getting values from Arrays is twice as fast as setting

 
var employee : Employee = employees[2];

6. Anonymous objects are faster to create with {} vs. new

 
var o : * = { firstName : "John", lastName : "Smith", age : 45 };
NOT:
var p : Person = new Person();
p.firstName = "John";
p.lastName = "Smith";
p.age = 45;

7. Use static for properties methods that do not require an object instance

 
StringUtils.trim( "text with space at end " );
Class definition:
package
{
public final class StringUtils
{
public static function trim( s : String ) : String
{
var trimmed : String;
// implementation...
return trimmed;
}
}
}

8. Use const for properties that will never change throughout the lifecycle of the application

 
public const APPLICATION_PUBLISHER : String = "Kannopy, Inc.";

9. Use final when no subclasses need to be created of a class

 
public final class StringUtils

10. Use package level variables and functions for generalized functionality which does not require a class or instance of a class

 
createSnapShot( arg );

NOT:

 
someObjectInstance.createSnapShot( arg );

NOT:

 
SomeClass.createSnapShot( arg );
Class definition:
package
{
// imports&#133;;
public function createSnapShot(target:IBitmapDrawable) : Bitmap
{
// implementation&#133;
}
}

11. JIT won’t compile code within constructors (keep them lightweight)

 
package com.seantheflexguy.as3optimization
{
public class MinimalConstructor
{
public function MinimalConstructor()
{
init();
}

}
}

12. Length of method/variable names doesn't matter in ActionScript 3.0 (true in other langs)

 
someCrazyLongMethodNameDoesntReallyImpactPerformanceTooMuch();

13. One line assignments DO NOT buy any performance! It's a Myth! (true in other langs)

 
var i=0; j=10; k=200;

14. No difference in memory usage between an if statement and a switch statement

 
if ( condition )
{
// handle condition
}

IDENTICAL MEMORY USAGE:

 
switch ( condition )
{
case "A":
// logic to handle case A
break;

case "B":
// logic to handle case B
break;
}

15. Rank your if statements in order of comparisons most likely to be true

 
if ( conditionThatHappensAlot )
{
// logic to handle frequently met condition
}
else if ( conditionThatHappensSomtimes )
{
// handle the case that happens occaisonally
}
else
{
// handle the case that doesn&#8217;t happen that often
}

16. AVM promotes int to Number during calculations inside loops

17. Resolve issues of promotion, unknown, or incorrect object types

18. Use uint sparingly, it can be slow

 
var footerHex : uint = 0x00ccff;

19. Use integers for iterations

 
(var i: int = 0; i < n; i++) NOT for (var i: Number = 0; i < n; i++)

20. Cast to int for calculations inside loops (AVM automatically promotes int to Number)

 
for (;i<n2;i++) Vector3D(array[int(i*2)]).x = 2;

NOT:

  
for (;i<n2;i++) Vector3D(array[i*2]).x = 2;

21. Don't use int with decimals

 
var decimal : Number = 14.654;

NOT:

 
var decimal : int = 14.654;

22. Multiply vs. Divide: instead of 5000/1000 use: 5000*0.001

23. Calculate things like floor and round yourself vs. calling Math library

 
package com.seantheflexguy.math
{
public final class MathUtil
{
public static function round( number : Number ) : Number
{
// custom rounding implementation
}
}
}

24. Locally store function values in for and while statements instead of repeatedly accessing them

 
for (..){a*180/Math.PI;}
declare: toRadians = a*180/Math.PI; outside of the loop

25. Avoid calculations and method calls in loops

 
for (var i=0;i< myArray.lengh;i++){ }

NOT:

  
var len : int = myArray.lengh;
for (var i=0;i<len;i++){}

26. Remove event listeners when finished using them

 
removeEventListener( Event.COMPLETE, onComplete );

27. Use delete to free memory

 
delete someObject;

28. Use RegEx for validation, use string methods for searching

 
// postal code validation example using regular expressions
private var regEx:RegExp = /^[A-Z][0-9][A-Z] [0-9][A-Z][0-9]$/i;
private function validatePostal( event : Event ) : void
{
if( regEx.test( zipTextInput.text ) )
{
// handle invalid input case
}
}

// search a string using String methods
var string : String = "Search me";
var searchIndex : int = string.indexOf( "me" );
var search : String = string.substring( searchIndex, searchIndex + 2 );

29. Reuse objects to maintain a “memory plateau” DisplayObjects, URLLoader objects

30. Follow the Flex component model:

 
createChildren();
commitProperties();
updateDisplayList();

31. Only use Datagrids as a last resort (make sure you can’t implement in a regular List first)

32. Avoid Repeaters for scrollable data

33. Avoid the setStyle() method (One of the most expensive calls in the Flex framework)

34. Using too many containers dramatically reduces the performance of your application

 
<mx:Panel>
<mx:VBox>
<mx:HBox>
<mx:Label text="Label 1" />
<mx:VBox>
<mx:Label text="Label 2" />
</mx:VBox>
<mx:HBox>
<mx:Label text="Label 3" />
<mx:VBox>
<mx:Label text="Label 4" />
</mx:VBox>
</mx:HBox>
</mx:HBox>
</mx:VBox>
</mx:Panel>

35. You do not need to always use a container tag as the top-level tag of components Totally valid component, no top level container needed:

 
<mx:Image xmlns:mx="http://www.adobe.com/2006/mxml"
source="avatar.jpg" width="200" height="200" />

36. Remove unnecessary container wrappers to reduce container nesting

37. Avoid: The VBox container inside an tag, (eliminates redundancy)

 
<mx:Panel>
<mx:Label text="Label 1" />
<mx:Label text="Label 2" />
</mx:Panel>
NOT:
<mx:Panel>
<mx:VBox>
<mx:Label text="Label 1" />
<mx:Label text="Label 2" />
</mx:VBox>
</mx:Panel>

38. Avoid: VBox container inside an tag, (eliminates redundancy)

 
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml>
<mx:Label text="Label 1" />
<mx:Label text="Label 2" />
</mx:Application>

NOT:

 
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml>
<mx:VBox>
<mx:Label text="Label 1" />
<mx:Label text="Label 2" />
</mx:VBox>
</mx:Application>

39. Set the recycleChildren property to true to improve a Repeater object's performance (re-uses previously created children instead of creating new ones)

 
<mx:Script>
<![CDATA[
[Bindable]
public var repeaterData : Array = ["data 1", "data 2"];
]]>
</mx:Script>

<mx:Repeater id="repeater" dataProvider="{repeaterData}">
<mx:Label text="data item: {repeater.currentItem}"/>
</mx:Repeater>

40. Keep framerate set at 60 fps or lower

 
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml
frameRate="45">
</mx:Application>

41. Avoid multiple display manipulations per frame

42. Code against ENTER_FRAME events instead of Timer events

 
public function onEnterFrame( event : Event ) : void
{
}
private function init() : void
{
addEventListener( Event.ENTER_FRAME, onEnterFrame );
}

NOT:

 
public function onTimerTick( event : Event ) : void
{
}
private function init() : void
{
var timer : Timer = new Timer();
timer.start();
timer.addEventListener( TimerEvent.TIMER, onTimerTick );
}

43. To defer object creation over multiple frames use:

 
<mx:Container creationPolicy=&#8221;queued&#8221;/>

44. Alpha = 0 is not the same as visible = false (Objects marked invisible are passed over)

 
loginButton.visible = false;

NOT:

 
loginButton.alpha = 0;

45. Faster to perform operations locally than it is to call a function in the same class Even slower to call a function from a different class (This is referred to as “code inlining”.)

46. When executing a function it’s more expensive if you call other functions from within it

 
private function udpateUserRecord()
{
update( user.firstName + user.lastName );
}

NOT:

 
private function updateUserRecord() {
update( concatName() );
}
private function concatName() : String
{
return user.firstName + user.lastName;
}

47. Arguments in functions are slower than a reference to an objects variables

 
package com.seantheflexguy.as3optimization
{
public class DemoClassMemberVariables
{
// set the properties on class instances
public var userName : String;
// etc...
public function DemoClassMemberVariables()
{
}
private function login() : void
{
// login implementation logic
userName = creds.getUserName();
// etc...
}
}
}

NOT:

 
package com.seantheflexguy.as3optimization
{
public class DemoClassArguments
{
public function DemoClassArguments()
{
}
private function login( creds : Authentication ) : void
{
// login implementation logic
userName = creds.getUserName();
// etc...
}
}
}

48. Faster to use "as" vs. casting

 
var u : User = event.results.users.user as User;

NOT:

 
var u : User = User(event.results.users.user);

49. Use custom object types vs new Object();

 
var v3D : Vector3D = new Vector3D();
v3D.x = 100;
v3D.y = 450;
v3D.z = 500;

NOT:

 
var v3DObject : Object = new Object();
v3DObject.x = 100;
v3DObject.y = 450;
v3DObject.z = 500;

50. Use casting to inform the Flash player what kind of objects are inside an Array

 
for (i=0;i<n;i++)
{
Vector3D( array[i] ).x = 2;
}

NOT:

 
for (i=0;i<n;i++)
{
array[i].x = 2;
}

51. Check for null instead of using try...catch blocks

 
if ( o != null )
{
o.method();
}

NOT:

 
try
{
o.method();
}
catch ( error )
{
trace( error );
}

References:

Sean Christmann: Optimizing Adobe AIR for Code Execution, Memory, and Rendering 
http://www.craftymind.com/2008/11/20/max-2008-session-material/

Dennis Ippel: Some ActionScript 3.0 Optimizations 
http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/

Shane McCartney: Tips on how to write efficient AS3 
http://www.lostinactionscript.com/blog/index.php/2008/09/28/tips-on-how-to-write-efficient-as3/

Flex Application Performance: Tips and Techniques for Improving Client Application Performance 
http://www.adobe.com/devnet/flex/articles/client_perf.html

Stephen Calender: ActionScript 3.0 Benchmarking 
http://www.stephencalenderblog.com/?p=7

Grant Skinner: Types in AS3: ints not so fast, uints slow! 
http://www.gskinner.com/blog/archives/2006/06/types_in_as3_in.html

Grant Skinner: Resource management strategies in Flash Player 9 
http://www.adobe.com/devnet/flashplayer/articles/resource_management.html

Gary Grossman: ActionScript 3.0 and AVM2 Performance Tuning 
http://www.onflex.org/ACDS/AS3TuningInsideAVM2JIT.pdf

Fastest way to copy an array 
http://agit8.turbulent.ca/bwp/2008/08/04/flash-as3-optimization-fastest-way-to-copy-an-array/

Andre Michelle: AS3 optimations & suggestions 
http://blog.andre-michelle.com/2005/as3-optimations-suggestions/

Package-level function closures in ActionScript 
http://www.ericfeminella.com/blog/2008/05/06/package-level-function-closures-in-actionscript/

ActionScript 3 optimization techniques 
http://blog.joa-ebert.com/2008/04/26/actionscript-3-optimization-techniques/

AS3 Performance Tester 
http://businessintelligence.me/projects/performance_tester/performanceTester.html

:
Posted by 라면스프



   플래시 object 및 embed 태그 사용시 매개 변수 및 속성 07-12-14 03:34
  작성자 : Dolch     조회 2700    
다음 태그 속성 및 매개 변수는 제작 명령에 의해 만들어진 HTML 코드에 대해 설명합니다. Flash 내용을 보여주는 사용자 정의 HTML을 작성할 때 이 목록을 참조할 수 있습니다. 별도로 지정하지 않는 한 모든 항목은 object 태그와 embed 태그 모두에 적용됩니다. 선택적 항목은 표시되어 있습니다. 매개 변수는 object 태그와 함께 사용되고 Internet Explorer에 의해 인식되는 반면 embed 태그는 Netscape에 의해 인식됩니다. 속성은 object 태그와 embed 태그에서 모두 사용됩니다. 템플릿을 사용자 정의하는 경우 값 대신 템플릿 변수(다음 목록의 각 매개 변수에 대한 값 섹션에 나옴)를 사용할 수 있습니다. 자세한 내용은 HTML 제작 템플릿 사용자 정의을(를) 참조하십시오.

devicefont 속성/매개 변수

값      true | false
         템플릿 변수: $DE
설명  (선택 사항) 필요한 글꼴을 운영 체제에서 제공하는 경우 장치 글꼴 옵션이 선택되지 않은 정적 텍스트 객체를 장치 글꼴을 사용하여 표시할지 여부를 지정합니다.


src 속성 

값       movieName.swf
          템플릿 변수: $MO
설명   로드되는 SWF 파일의 이름을 지정합니다. embed 태그에만 적용됩니다


무비 매개 변수 

값      movieName.swf
         템플릿 변수: $MO
설명   로드되는 SWF 파일의 이름을 지정합니다. object 태그에만 적용됩니다.


classid 속성 

값      clsid:d27cdb6e-ae6d-11cf-96b8-444553540000
설명  브라우저에 대한 ActiveX 컨트롤을 확인합니다. 이 값은 표시된 대로 정확하게 입력해야 합니다. object 태그에만 적용됩니다.


width 속성 

값      n 또는 n%
         템플릿 변수: $WI
설명   브라우저 윈도우에 대한 퍼센트 또는 픽셀 단위로 응용 프로그램의 폭을 지정합니다.


height 속성 

값      n 또는 n%
         템플릿 변수: $HE
설명  브라우저 윈도우에 대한 퍼센트 또는 픽셀 단위로 응용 프로그램의 높이를 지정합니다. 
중요  Flash 응용 프로그램의 크기는 조절할 수 있으므로 종횡비가 유지되는 경우에는 응용 프로그램의 크기가 변해도 품질이 낮아지지 않습니다. 예를 들어, 640 x 480 픽셀, 320 x 240 픽셀, 240 x 180 픽셀은 모두 4:3 종횡비를 사용합니다.


codebase 속성 

값      http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0
설명  Flash Player ActiveX 컨트롤이 아직 설치되지 않은 경우에 브라우저가 이 컨트롤을 자동으로 다운로드할 수 있도록 컨트롤의 위치를 확인합니다. 이 값은 표시된 대로 정확하게 입력해야 합니다. object 태그에만 적용됩니다


pluginspage 속성 

값     http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash 
설명  Flash Player 플러그-인이 아직 설치되지 않은 경우에 사용자가 이 플러그-인을 다운로드할 수 있도록 플러그-인의 위치를 확인합니다. 이 값은 표시된 대로 정확하게 입력해야 합니다. embed  태그에만 적용됩니다.


swliveconnect 속성 

값      true | false
설명  (선택 사항) Flash Player를 처음 로드할 때 브라우저에서 Java를 시작할지 여부를 지정합니다. 이 속성이 생략된 경우 기본값은 false입니다. JavaScript와 Flash를 같은 페이지에서 사용하는 경우에는 Java를 실행하여 fscommand() 함수를 작동시켜야 합니다. 그러나 JavaScript를 브라우저 검색이나 fscommand() 액션과 관련되지 않은 다른 용도로만 사용하는 경우에는 SWLIVECONNECT를 false로 설정하여 Java가 시작되지 않도록 할 수 있습니다. JavaScript를 Flash와 함께 사용하지 않는 경우에는 SWLIVECONNECT 속성을 명시적으로 true로 설정하여 Java를 시작할 수도 있습니다. Java를 시작하면 대개 SWF 파일을 시작하는 데 걸리는 시간이 길어지므로, 이 태그는 필요한 경우에만 true로 설정합니다. embed 태그에만 적용됩니다.
fscommand() 액션을 사용하여 독립 실행형 프로젝터 파일에서 Java를 시작합니다.


play 속성/매개 변수 

값      true | false
         템플릿 변수: $PL
설명  (선택 사항) 응용 프로그램이 웹 브라우저에 로드되는 즉시 재생할지 여부를 지정합니다. Flash 응용 프로그램이 대화형인 경우 사용자는 버튼을 클릭하거나 다른 작업을 수행하여 재생을 시작할 수 있습니다. 이러한 경우에는 play 속성을 false로 설정하여 응용 프로그램이 자동으로 시작되지 않도록 합니다. 이 속성이 생략된 경우 기본값은 true입니다.


loop 속성/매개 변수 

값      true | false
         템플릿 변수: $LO
설명  (선택 사항) Flash 내용을 무한히 반복할 것인지 아니면 마지막 프레임에 도달하면 중지시킬 것인지를 지정합니다. 이 속성이 생략된 경우 기본값은 true입니다.


quality 속성/매개 변수 


값     low | medium | high | autolow | autohigh | best
        템플릿 변수: $QU
설명  (선택 사항) 응용 프로그램이 재생될 때 사용할 앤티앨리어싱 수준을 지정합니다. SWF 파일의 각 프레임을 뷰어 화면에 렌더링하기 전에 앤티앨리어싱을 적용하여 다듬으려면 좀더 빠른 프로세서가 필요하므로, 속도나 모양 중 어느 쪽에 우선 순위를 둘 것인지에 따라 다음 값 중 하나를 선택합니다.
Low - 모양보다 재생 속도에 중점을 두어 앤티앨리어싱을 사용하지 않습니다.
Autolow - 속도를 우선적으로 강조하지만 가능한 경우 모양도 향상시킵니다. 이 경우에는 앤티앨리어싱이 해제된 상태로 재생이 시작됩니다. Flash Player가 프로세서에서 앤티앨리어싱을 처리할 수 있음을 감지하면 앤티앨리어싱이 설정됩니다. 
Autohigh - 재생 속도와 모양을 동등하게 강조하지만 필요한 경우에는 모양보다 재생 속도를 우선적으로 고려합니다. 이 경우에는 앤티앨리어싱이 설정된 상태로 재생이 시작됩니다. 프레임 속도가 지정된 프레임 속도 아래로 떨어지면 앤티앨리어싱이 해제되어 재생 속도가 향상됩니다. 이 설정을 사용하여 Flash의 앤티앨리어싱 명령(보기 > 미리 보기 모드 > 앤티앨리어싱)을 에뮬레이션합니다. 
Medium - 앤티앨리어싱을 일부 적용하지만 비트맵을 다듬지는 않습니다. 이 옵션의 품질은 Low 설정보다는 좋지만 High 설정보다는 나쁩니다. 
High - 재생 속도보다 모양에 중점을 두어 항상 앤티앨리어싱을 적용합니다. SWF 파일에 애니메이션이 포함되어 있지 않으면 비트맵이 다듬어지지만 애니메이션이 포함되어 있으면 비트맵이 다듬어지지 않습니다. 
Best - 최상의 품질로 표시하고 재생 속도는 고려하지 않습니다. 모든 출력이 앤티앨리어싱되며 모든 비트맵이 다듬어집니다.
이 속성이 생략된 경우 quality에 대한 기본값은 high입니다.


bgcolor 속성/매개 변수 

값      #RRGGBB(16진수 RGB 값)
          템플릿 변수: $BG
설명    (선택 사항) 응용 프로그램의 배경색을 지정합니다. 이 속성을 사용하여 Flash SWF 파일에 지정된 배경색 설정을 무시합니다. 이 속성은 HTML 페이지의 배경색에 영향을 주지 않습니다.


scale 속성/매개 변수 

값       showall | noborder | exactfit
          템플릿 변수: $SC
설명   (선택 사항) width 및 height 값이 퍼센트 단위를 사용하는 경우에 브라우저 윈도우 내에서 응용 프로그램이 배치되는 방식을 정의합니다.
Showall(기본값) - 응용 프로그램의 원래 종횡비를 유지하면서 전체 Flash 내용을 지정된 영역에 왜곡되지 않게 표시합니다. 응용 프로그램의 두 면에 테두리가 표시될 수 있습니다.
Noborder - 응용 프로그램의 원래 종횡비를 유지하면서 왜곡 또는 잘림 없이 지정된 영역에 맞도록 Flash 내용의 크기를 조절합니다. 
Exactfit - 원래의 종횡비를 유지하지 않으면서 지정된 영역에 전체 Flash 내용을 표시하므로 왜곡이 생길 수 있습니다.
이 속성이 생략된 경우 기본값은 showall이며, width 및 height 값은 퍼센트 단위를 사용합니다.


align 속성 


값       Default | L | R | T | B 
          템플릿 변수: $HA
설명    object, embed 및 img 태그에 대한 align 값을 지정하며 브라우저 윈도우 내에 Flash SWF 파일의 위치를 지정하는 방식을 결정합니다.
Default - 응용 프로그램을 브라우저 윈도우 중앙에 배치하며 브라우저 윈도우가 응용 프로그램보다 작으면 가장자리를 자릅니다.
L, R, T 및 B - 각각 브라우저 윈도우의 왼쪽, 오른쪽, 위쪽 및 아래쪽 가장자리를 따라 응용 프로그램을 정렬하며 필요한 경우에는 나머지 세 면을 자릅니다. 


salign 매개 변수 

값       L | R | T | B | TL | TR | BL | BR 
          템플릿 변수: $SA
설명    (선택 사항) width 및 height 설정에 의해 정의된 영역 내에서 크기가 조절된 Flash SWF 파일의 배치 위치를 지정합니다. 이러한 조건에 대한 자세한 내용은 scale 속성/매개 변수을(를) 참조하십시오. 
L, R, T 및 B - 각각 브라우저 윈도우의 왼쪽, 오른쪽, 위쪽 또는 아래쪽 가장자리를 따라 응용 프로그램을 정렬하며 필요한 경우에는 나머지 세 면을 자릅니다.
TL 및 TR - 각각 브라우저 윈도우의 왼쪽 위 및 오른쪽 위 모서리에 맞추어 응용 프로그램을 정렬하며 필요한 경우에는 아래쪽 면과 남은 오른쪽/왼쪽 면을 자릅니다.
BL 및 BR - 각각 브라우저 윈도우의 왼쪽 아래 및 오른쪽 아래 모서리에 맞추어 응용 프로그램을 정렬하며 필요한 경우에는 위쪽 면과 남은 오른쪽/왼쪽 면을 자릅니다.
이 속성이 생략된 경우에는 Flash 내용이 브라우저 윈도우의 중앙에 배치됩니다.


base 속성 

값      기본 디렉토리 또는 URL
설명   (선택 사항) Flash SWF 파일의 모든 상대 경로 명령문을 확인하는 데 사용되는 기본 디렉토리 또는 URL을 지정합니다. 이 속성은 SWF 파일이 그 밖의 파일과는 다른 폴더에 있는 경우에 유용합니다.


menu 속성/매개 변수
 

값        true | false
           템플릿 변수: $ME
설명    (선택 사항) 보는 사람이 브라우저에서 응용 프로그램 영역을 마우스 오른쪽 버튼으로 클릭(Windows)하거나 Command 키를 누른 상태에서 클릭(Macintosh)할 때 나타날 메뉴의 유형을 지정합니다.
true - 전체 메뉴가 나타나므로 재생 품질을 높이거나 재생을 제어하기 위한 몇몇 옵션을 사용할 수 있습니다.
false - Macromedia Flash Player 6 옵션과 설정 옵션만 들어 있는 메뉴를 표시합니다.
이 속성이 생략된 경우 기본값은 true입니다.


wmode 속성/매개 변수 

값       Window | Opaque | Transparent
           템플릿 변수: $WM
설명    (선택 사항) Internet Explorer 4.0에서 사용할 수 있는 투명 Flash 내용, 절대 위치 지정 및 레이어 지정 기능을 사용할 수 있습니다. 이 속성/매개 변수는 Flash Player ActiveX 컨트롤이 있는 Windows에서만 동작합니다.
Window - 웹 페이지의 사각형 응용 프로그램 영역 윈도우에서 응용 프로그램을 재생합니다. Window는 Flash 응용 프로그램이 HTML 레이어와 전혀 상호 작용하지 않으며 항상 최상위 항목임을 나타냅니다.
Opaque - 페이지에 있는 모든 요소를 응용 프로그램 뒤로 숨깁니다.
Transparent - HTML 페이지의 배경이 응용 프로그램의 모든 투명 영역을 통과해 표시되도록 하지만 애니메이션 속도가 낮아질 수 있습니다.
Opaque windowless 및 Transparent windowless - 둘 모두 HTML 레이어와 상호 작용하므로 SWF 파일 위의 레이어로 인해 응용 프로그램이 보이지 않게 됩니다. 두 속성의 차이는 Transparent의 경우 SWF 파일 아래의 HTML 레이어가 SWF 파일의 투명한 부분을 통해 보일 수 있도록 투명도를 허용한다는 점입니다.이 속성이 생략된 경우 기본값은 Window입니다. object에만 적용됩니다.


allowscriptaccess 속성/매개 변수 

값     always | never | samedomain
설명  allowscriptaccess를 사용하면 Flash 응용 프로그램에서 이 응용 프로그램을 호스팅하는 HTML 페이지와 통신할 수 있습니다. fscommand() 및 getURL() 작업을 수행하면 JavaScript에서 Flash 응용 프로그램의 권한과 다를 수도 있는 HTML 페이지의 권한을 사용하게 되므로 이 속성이 필요합니다. 이는 도메인간 보안에 중요한 영향을 미칩니다. 
always - 언제든지 스크립팅 작업을 수행할 수 있습니다.
never - 모든 스크립팅 작업을 수행할 수 없습니다.
samedomain - Flash 응용 프로그램이 HTML 페이지와 동일한 도메인에 속한 경우에만 스크립팅 작업을 허용합니다. 
모든 HTML 제작 템플릿에 사용되는 기본값은 samedomain입니다.


SeamlessTabbing 매개 변수 

값      true | false
설명  (선택 사항) seamless tabbing을 수행하도록 ActiveX 컨트롤을 설정할 수 있습니다. 이렇게 하면 사용자가 Flash 응용 프로그램에서 탭 이동을 할 수 있습니다. 이 매개 변수는 Flash Player ActiveX 컨트롤 버전 7 이상을 내장한 Windows에서만 유효합니다. 
true (또는 생략) - ActiveX 컨트롤이 seamless tabbing을 수행합니다. 즉, 사용자가 Flash 응용 프로그램에서 탭을 모두 누른 후에 탭 키를 다시 누르면 Flash 응용 프로그램 범위를 넘어 주변의 HTML 내용으로 포커스가 이동합니다. Flash 응용 프로그램에 이어 HTML에 포커스를 줄 만한 것이 아무 것도 없으면 브라우저의 상태 표시줄로 포커스가 이동합니다.
false - ActiveX 컨트롤이 버전 6 및 그 이전에서처럼 작동합니다. 즉, 사용자가 Flash 응용 프로그램에서 탭을 모두 누른 후에 탭 키를 다시 누르면 Flash 응용 프로그램의 시작 부분으로 포커스가 이동합니다. 이 모드에서는 탭 키를 눌러 Flash 응용 프로그램 이외의 곳으로 포커스를 이동할 수 없습니다.

:
Posted by 라면스프