<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>민물곰탱이의 이클립스 개발 이야기</title>
		<link>http://esterel-dev.tistory.com/</link>
		<description>기술의 흐름속에 서서 연어를 노리는 곰탱군 이야기</description>
		<language>ko</language>
		<pubDate>Tue, 16 Aug 2011 21:45:21 +0000</pubDate>
		<generator>Tistory 1.1 (http://www.tistory.com/)</generator>
		<item>
			<title>[FAQ] CVSNT 사용하기</title>
			<link>http://esterel-dev.tistory.com/36</link>
			<description>&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Q. 사용자는 어떻게 추가하죠?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
1. CVSROOT를 설정한다.&lt;br /&gt;
&lt;br /&gt;
2. 가상계정(OS의 로긴계정)으로 CVS에 로긴한다.&lt;br /&gt;
&lt;br /&gt;
3. 사용자를 추가한다.&lt;br /&gt;
&lt;br /&gt;
c:/ set CVSROOT=:pserver:141.223.***.***:/repository&lt;br /&gt;
&lt;br /&gt;
c:/ cvs login&lt;br /&gt;
Logging in to :pserver:Administrator@141.223.***.***:/repository&lt;br /&gt;
CVS Passward:&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;lt;--- OS계정의 로긴 암호를 입력)&lt;br /&gt;
&lt;br /&gt;
c:/ cvs passwd -a -r Administrator testid&lt;br /&gt;
Adding user testid@141.223.***.***&lt;br /&gt;
New Password:&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;lt;--- CVS 클라이언트에 사용할 암호를 입력)&lt;br /&gt;
Verify Password:&lt;br /&gt;</description>
			<category>질문과답변</category>
			<author>민물곰탱이</author>
			<guid>http://esterel-dev.tistory.com/36</guid>
			<comments>http://esterel-dev.tistory.com/36#entry36comment</comments>
			<pubDate>Wed, 30 Sep 2009 08:07:13 +0000</pubDate>
		</item>
		<item>
			<title>[FAQ] Mac OS X에서 이클립스 기본 JVM변경하기</title>
			<link>http://esterel-dev.tistory.com/35</link>
			<description>이클립스를 처음 맥에 설치하면 기본 JVM이 1.5로 설정되어 있다. Mac OS X Default라고 태그가 딱 붙어있다.&lt;br /&gt;
&lt;br /&gt;하지만 실제로 시스템 폴더를 살펴보면 JVM이 1.6까지 설치가 되어 있음을 확인 할 수 있다.&lt;br /&gt;
&lt;br /&gt;강제적으로 JVM 1.6을 이클립스에서 사용하는 기본 JVM으로 설정해 보자.&lt;br /&gt;
&lt;br /&gt;1. 터미널을 하나 실행시킨다.&lt;br /&gt;
&lt;br /&gt;2. export 명령을 이용하여 JAVA_HOME의 값을 설정한다.&lt;br /&gt;
&lt;br /&gt;export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home&lt;br /&gt;
&lt;br /&gt;3. 쉘에서 export 명령을 치면 JAVA_HOME이 설정된 것을 확인 할 수 있다.&lt;br /&gt;
&lt;br /&gt;한번만 설정하면 이클립스에서는 기본 JVM을 1.6으로 인식한다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;</description>
			<category>질문과답변</category>
			<author>민물곰탱이</author>
			<guid>http://esterel-dev.tistory.com/35</guid>
			<comments>http://esterel-dev.tistory.com/35#entry35comment</comments>
			<pubDate>Tue, 29 Sep 2009 13:13:55 +0000</pubDate>
		</item>
		<item>
			<title>[FAQ] UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM</title>
			<link>http://esterel-dev.tistory.com/34</link>
			<description>눈범이를 설치한 이후, 이클립스에 변화가 생겼다.&lt;br /&gt;
&lt;br /&gt;UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM&lt;br /&gt;
&lt;br /&gt;멀쩡하게 잘 돌아가던 플러그-인들이 전부 패닉 상태에 빠져버렸다.&lt;br /&gt;
&lt;br /&gt;문제해결을 위해서 구글링 1시간정도 한 결과 한가지 중요한 사실을 깨닫게 되었다.&lt;br /&gt;
&lt;br /&gt;눈범이의 JVM 1.6은 기본적으로 64bit로 동작한다는 것이였다.&lt;br /&gt;
&lt;br /&gt;위의 문제를 해결하기 위한 해결책을 eclipse.org에서는 친절하게 알려주고 있다.&lt;br /&gt;
&lt;br /&gt;&lt;a title=&quot;[http://www.eclipse.org/swt/faq.php#cocoa64launch]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://www.eclipse.org/swt/faq.php#cocoa64launch&quot;&gt;http://www.eclipse.org/swt/faq.php#cocoa64launch&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;찾아가서 직접 확인해도 되겠지만 간단히 결론을 작성하자면, 32bit로 JVM을 구동시키기 위해서는 &lt;br /&gt;
&lt;br /&gt;VM arguments에 -d32 옵션을 추가해 주면 된다. 반대의 경우에는 -d64를 추가하면 된다. &lt;br /&gt;
&lt;br /&gt;물론 64bit를 사용할 경우에는 SWT관련한 추가적인 작업을 필요로 한다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;</description>
			<category>질문과답변</category>
			<category>Snow Leopard</category>
			<author>민물곰탱이</author>
			<guid>http://esterel-dev.tistory.com/34</guid>
			<comments>http://esterel-dev.tistory.com/34#entry34comment</comments>
			<pubDate>Tue, 29 Sep 2009 12:58:54 +0000</pubDate>
		</item>
		<item>
			<title>버그질라 3.0.2 for 윈도우즈 설치법</title>
			<link>http://esterel-dev.tistory.com/31</link>
			<description>&lt;br /&gt;&lt;font size=&quot;4&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;일러두기&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;아래의 내용은 아파치와 MySQL에 대한 약간의 지식이 있는 분이 버그질라에서 제공하는 &quot;The Bugzilla Guide - 3.0.2 Release&quot; 문서를 차근차근이 읽어보면 누구나 알수 있는 내용입니다. 영어를 읽기 귀찮아 하시고 기타 설치에 필요한 잡기술에 대해서 관심이 없는 분을 기준을 작성했습니다.&lt;br /&gt;&lt;br /&gt;===================================================================================================&lt;br /&gt;버그질라는 모질라에서 버그 또는 이슈관리를 위해서 개발한 웹기반의 프로그램이다. 이클립스 유로파(3.3이후)버전부터는 MyLyn 플러그-인을 이용하여 버그질라를 효율적으로 사용할 수 있는 시스템이 구축되었으니 그 유용성이 점점 증가할 것으로 보인다.&lt;br /&gt;&lt;br /&gt;기본적으로 UNIX나 Linux 시스템에서 손쉽게 사용할 수 있도록 개발 되었으나, 윈도우에서도 사용할 수 있다. 윈도우에서 버그질라를 사용하기 위한 험난한 여정을 찾아 떠나보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;1. 버그질라 설치준비하기&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;버그질라를 설치하기 위해서는 다음과 같은 프로그램들이 있어야 한다.&lt;br /&gt;- 버그질라 3.0.2 (http://www.bugzilla.org/releases/3.0/) : 버그질라 프로그램&lt;br /&gt;- MySQL 5.0 (&lt;font&gt;&lt;font size=&quot;2&quot;&gt;http://dev.mysql.com/downloads/mysql/&lt;/font&gt;) : 이슈/버그 데이터 저장을 위한 DB&lt;br /&gt;- MySQL GUL Tools 5.0 : MySQL관리를 용이하게 도와주는 GUI 도구 (선택사항)&lt;br /&gt;- 아파치 2.0 (&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;http://httpd.apache.org/download.cgi&lt;/font&gt;) : 버그질라를 동작하기 위한 환경 (2.0이상 윈도우버전)&lt;br /&gt;- Active State Perl 5.8.8 (&lt;font size=&quot;2&quot;&gt;http://activestate.com/store/activeperl/download/&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;) : 윈도우용 Perl, 필수다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;2. 프로그램 설치하기&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;위에서 준비한 프로그램들을 독립적으로 아래의 순서에 따라 독립적으로 우선 설치를 한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;가. Active State Perl 설치&lt;/span&gt;&lt;br /&gt;윈도우용 설치 프로그램으로 제공되므로 별 생각없이 설치하면 된다. 취향에 따라서 설치하는 곳의 경로정도만 변경해 주면된다. 여기서는 &quot;c:/perl&quot;에 설치를 하였다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;나. MySQL 5 설치&lt;/span&gt;&lt;br /&gt;MySQL역시 윈도우용 설치 프로그램을 지원해 주므로, 위자드에서 묻는 상황을 적절하게 선택하여 설치를 하면 된다. 역시 취향에 따라서 설치하는 경로를 변경하면 된다. 여기서는 &quot;c:/MySQL5&quot;에 설치를 하였다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;다. MySQL 5 GUI Tool 설치 (선택사항)&lt;/span&gt;&lt;br /&gt;텍스트 기반으로 MySQL을 운용하는데 익숙하다면 필요가 없다. 윈도우에 익숙한 사용자들을 위해서 또는명령어 입력에 귀차님즘을 느끼는 분들을 위해서 설치하면 원격으로 MySQL을 접속하여 관리하기 용이하다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;라. 아파치 2.2.6 설치&lt;/span&gt;&lt;br /&gt;아파치 2.0이상 버전의 윈도우용 바이너리 파일을 이용하여 설치를 하자. 역시 설치 마법사가 존재하기 때문에 설치하는데는 전혀 문제가 없다. 역기서는 아파치 2.2.6 버전을 사용했으며, &quot;c:/apache2.2.6&quot;에 설치를 하였다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;마. 버그질라 3.0.2 설치&lt;/span&gt;&lt;br /&gt;버그질라는 특별히 설치할 것이 없다. 버그질라가 압축을 풀어서 버그질라가 운영될 적당한 디렉토리에 옮겨놓으면 된다. 아파치기반으로 동작을 해야하기 때문에, 여기서는 &quot;c:/apache2.2.6/htdocs/bugzilla&quot;에 압축을 풀었다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;3. 환경설정&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;본격적인 환경설정을 해야할 차례이다. 설치까지는 누구나 손쉽게 할 수 있지만 환경설정부터는 본격적인 여정이 시작된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;3&quot;&gt;3.1 Perl 설정&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;버그질라는 웹기반으로 시스템으로 웹페이지가 Perl을 이용해서 제작된 CGI로 구성되어 있다. 그래서 버그질라가 요구하는 최소한의 Perl 패키지 또는 전체 패키지를 설정해 줘야한다. Active State Perl을 설치할때 실행 패스를 설정하였다면, 윈도우 명령창 어디에라도 손쉽게 패키지 관리자 및 Perl 명령을 실행할 수 있을 것이다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;가. 패키지 저장소(Repository) 위치의 설정&lt;/span&gt;&lt;br /&gt;Perl은 필요한 패키지를 저장소로부터 다운로드하여 설치하는 방식을 가지고 있다. Active State Perl을 설치한 상태라면 UNIX와 Linux에서 사용되는 패키지를 다운로드 받기위한 저장소가 기본적으로 설정이 되어 있다. 하지만 윈도우의 경우 아래의 저장소 위치를 추가해 줘야 한다. 우선 윈도우 명령창을 실행시키자.&lt;br /&gt;&lt;br /&gt;c:/perl/bin/ppm&lt;br /&gt;&lt;br /&gt;위와 같은 명령을 실행하면 아래와 같은 &quot;Perl Package Manager&quot;가 실행된다. PPM에는 현재 컴퓨터에 설치되어 있는 Perl 패키지와 업데이트가 가능한 패키지등의 정보를 확인할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTcwMDAwMDAwMDAxLkpQRw%3D%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;583&quot; width=&quot;575&quot;/&gt;&lt;/div&gt;&lt;br /&gt;&quot;메뉴&amp;gt;Edit&amp;gt;Preference&quot;를 클릭하면 &quot;Areas&quot;와 &quot;Repository&quot; 탭을 볼 수 있다. &quot;Areas&quot; 탭은 현재 컴퓨터에 저장된 패키지의 위치를 의미하는 것이다. 이 부분은 볼 일이 없으므로 &quot;Repository&quot; 탭을 살펴보자. 기본적으로 1개의 저장소가 등록되어 있을 것이다. 이제 신규로 2개의 저장소를 추가로 등록해보자.&lt;br /&gt;&lt;br /&gt;Name : landfill&amp;nbsp; / Location : http://www.landfill.bugzilla.org/ppm&lt;br /&gt;Name : theory5 / Location : http://theoryx5.uwinnipeg.ca/ppms/package.xml&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTcwMDAwMDAwMDAwLkpQRw%3D%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;341&quot; width=&quot;490&quot;/&gt;&lt;/div&gt;&lt;br /&gt;&quot;landfill&quot;은 버그질라 테스트 서버로 버그질라를 위한 필수 패키지만을 포함하고 있는 곳이며, 두번째 &quot;theory5&quot;는 윈도우용에 필요로하는 Perl 패키지를 가지고 있는 곳이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;나. 필요 패키지 및 버전 확인하기&lt;/span&gt;&lt;br /&gt;저장소를 등록하였으니, 이제 버그질라에서 필요로하는 Perl 패키지를 확인해보자. 버그질라 압축을 해제해 놓은 디렉토리로 이동한 후 윈도우 명령창에 아래와 같은 명령을 쳐서 확인을 하자.&lt;br /&gt;&lt;br /&gt;c:/apache2.2.6/htdocs/bugzilla/checksetup.pl --check-modules&lt;br /&gt;&lt;br /&gt;그렇다면 아래와 같이 버그질라에서 필요로 하는 Perl 패키지가 설치가 되어 있는지 확인하는 메시지가 출력된다. 아래의 그림은 패키지가 전부 설치된 상태이기 때문에 모든 상태가 OK로 설정되어 있다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTcwMDAwMDAwMDAyLkpQRw%3D%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;545&quot; width=&quot;640&quot;/&gt;&lt;/div&gt;&lt;br /&gt;설치가 되지 않은 패키지에 대해서는 &quot;Not Found&quot; 메시지와 함께 필요한 버전정보와 함께 인스톨을 해달라는 메시지가 출력된다. 일단 설치해 달라는 패키지의 이름을 전부 확인해 두자. 참고적으로 버그질라에서 필요로하는 패키지 정보는 다음과 같다.&lt;br /&gt;&lt;br /&gt;필수패키지&lt;br /&gt;- CGI 2.93&amp;nbsp; 또는 CGI 3.11 (mod_perl을 사용하는 경우)&lt;br /&gt;- Date::Format 2.21&lt;br /&gt;- DBI 1.41&lt;br /&gt;- DBD::mysql 2.9003&lt;br /&gt;- File::Spec 0.84&lt;br /&gt;- Template 2.12&lt;br /&gt;- Email::Send 2.00&lt;br /&gt;- Email::MIME::Modifier 버전상관없음&lt;br /&gt;&lt;br /&gt;선택사항패키지&lt;br /&gt;- GD 1.20&lt;br /&gt;- Template::Plugin::GD::Image 1.20&lt;br /&gt;- Chart::Base 1.0&lt;br /&gt;- GD::Graph &lt;/font&gt;&lt;font size=&quot;2&quot;&gt;버전상관없음&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;- GD::Text &lt;/font&gt;&lt;font size=&quot;2&quot;&gt;버전상관없음&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;- XML::Twig &lt;/font&gt;&lt;font size=&quot;2&quot;&gt;버전상관없음&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;- MIME::Parser 5.406&lt;br /&gt;- LWP::UserAgent&lt;br /&gt;- PatchReader 0.94&lt;br /&gt;- Image::MagicK &lt;/font&gt;&lt;font size=&quot;2&quot;&gt;버전상관없음&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;- Net::LDAP &lt;/font&gt;&lt;font size=&quot;2&quot;&gt;버전상관없음&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;- SOAP::LIte &lt;/font&gt;&lt;font size=&quot;2&quot;&gt;버전상관없음&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;- HTML::Parser 3.40&lt;br /&gt;- HTML::Scrubber &lt;/font&gt;&lt;font size=&quot;2&quot;&gt;버전상관없음&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;- Email::MIME::Attachment::Stripper &lt;/font&gt;&lt;font size=&quot;2&quot;&gt;버전상관없음&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;- Email::Reply &lt;/font&gt;&lt;font size=&quot;2&quot;&gt;버전상관없음&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;- mod_perl2 1.999022&lt;br /&gt;- CGI 2.93&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;다. 패키지의 설치&lt;/span&gt;&lt;br /&gt;윈도우 명령창에서 &quot;install [패키지이름]&quot; 명령을 사용하는 것도 좋지만, 그냥 PPM을 이용하도록 하겠다. 다시 PPM을 실행시켜보자. 툴바에서 왼쪽 첫번째 그림을 클릭하여 모든 패키지의 목록이 보이도록 한 후에 좀 전에 필요로 하는 패키지의 버전을 찾아서 설치확인을 모두 시켜두자. 그리고 모든 설치확인 표시를 끝났다면, 툴바 오른쪽 세번째 화살표버튼을 선택하여 설치를 진행하자.&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTcwMDAwMDAwMDAxLkpQRw%3D%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;583&quot; width=&quot;575&quot;/&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;설치가 완료되었다면, 다시한번 &quot;checksetup.pl --check-moduels&quot; 명령을 이용하여 빠진것이 있는지 확인을 하자.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;라. Localconfig 작성하기&lt;/span&gt;&lt;br /&gt;모든 패키지의 준비가 완료되었다면, 이제 Localconfig 파일을 작성해보자. 이 파일을 작성하는 방법은 간단하다. 윈도우 명령어창에서 아래와 같은 명령만 하면 된다. 그러면 텍스트 기반으로 몇가지 상황을 확인하고 설치가 진행된다.&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;c:/apache2.2.6/htdocs/bugzilla/checksetup.pl&lt;br /&gt;&lt;br /&gt;설치과정이 끝나면 &quot;localconfig&quot;파일이 설정되어 있는 것을 확인 할 수 있다. 이제 이 파일을 편집할 차례이다. 솔직히 편집할 내용은 거의 없다. 편집기로 이 파일을 열어서 편집할 부분은 MySQL과 관계된 부분이 전부이다.&lt;br /&gt;&lt;br /&gt;$db_name = &#039;bugs&#039;;&lt;br /&gt;$db_user = &#039;bugs&#039;;&lt;br /&gt;$db_pass = &#039;&#039;;&lt;br /&gt;&lt;br /&gt;위의 세가지 값을 취향에 맞게 수정하자. 데이터베이스 이름과 사용자는 그냥 기본설정으로 사용해도 무방하다. 마지막 패스워드는 꼭 추가를 하고 저장을 하자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;3.2 MySQL 설정&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;MySQL 설정을 위해서 MySQL5 GUI Tool을 사용하겠다. 텍스트로 작성해도 되지만 그냥 귀찮기 때문이다. MySQL Administrator 도구를 사용하여(아래 그림 참조) root로 접속을 하자.&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTcwMDAwMDAwMDAxLkpQRw%3D%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;328&quot; width=&quot;425&quot;/&gt;&lt;/div&gt;접속한 후 해야할일은 딱 두가지 이다. 새로운 스키마를 작성하는것(즉, 데이터베이스를 생성)과 사용자를 등록하는 것이다. 위에서 localconfig 파일에 데이터베이스 이름과 사용자 이름을 모두 bugs로 사용하기로 지정을 했기 때문에 그냥 만들면 된다. 아래의 도구는 사용법이 간단하므로 약간 이것저것 눌러보면 쉽게 등록 할 수 있을 것이다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTcwMDAwMDAwMDAyLkpQRw%3D%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;512&quot; width=&quot;640&quot;/&gt;&lt;/div&gt;&lt;br /&gt;사용자를 추가할때는 사용자의 패스워드와 권한을 설정을 해 줘야 하는데 bugs 사용자 등록후 &quot;User Information&quot; 탭에서 localconfig 파일에 설정한 패스워드를 입력하고, &quot;schema Privileges&quot; 탭에서 bugs 데이터베이스에 대한 권한을 설정하면 된다. 설정해야 하는 권한은 아래의 그림을 참조하거나 버그질라 가이드 문서 12페이지를 참조하기 바란다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTcwMDAwMDAwMDAzLkpQRw%3D%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;512&quot; width=&quot;640&quot;/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;3&quot;&gt;3.3 버그질라 설정 마무리&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;MySQL 설정이 완료되었다면 버그질라 설정을 마무리해야할 차례이다. 다시한번 checksetup.pl을 실행시켜주자. 조금전 설정한 데이터베이스로 필요한 테이블을 알아서 생성해 줄것이다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;3.4 아파치 웹 서버 설정&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;개인적으로 아파치 설정이 가장 문제가 많았던 부분이였다. 버그질라가 CGI를 기반으로 동작을 하기 때문에 그 만큼 설정해야 할 부분이 많았기 때문이다. 아래에 제시된 부분 가운데 중복되는 옵션이 있다. 아직 정확히 정리가 되지 않은 상태이며, 정리를 할 생각이다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;가. DirectoryIndex 설정&lt;/span&gt;&lt;br /&gt;&amp;lt;IfModule dir_module&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; DirectoryIndex index.html index.cgi&lt;br /&gt;&amp;lt;/IfModule&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;나. CGI 스크립트 알리아스의 수정&lt;/span&gt;&lt;br /&gt;ScriptAlias /cgi-bin/ &quot;C:/Apache2.2.6/htdocs/bugzilla&quot;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;다. CGI 서비스 디렉토리 설정&lt;/span&gt;&lt;br /&gt;&amp;lt;Directory &quot;C:/Apache2.2.6/htdocs/bugzilla&quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Options +Indexes +ExecCGI +FollowSymLinks&lt;br /&gt;&amp;nbsp; &amp;nbsp; DirectoryIndex index.cgi&lt;br /&gt;&amp;nbsp; &amp;nbsp; AllowOverride All&lt;br /&gt;&amp;nbsp; &amp;nbsp; Order allow,deny&lt;br /&gt;&amp;nbsp; &amp;nbsp; Allow from all&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;라. Perl 설정&lt;/span&gt;&lt;br /&gt;#!c:/Perl/bin/Perl&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;마. ScriptInterpreterSource 주석 해제 및 수정&lt;/span&gt;&lt;br /&gt;ScriptInterpreterSource registry-strict&lt;br /&gt;&lt;br style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;바. CGI 스크립트 핸들러 주석 해제&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot;&gt;AddHandler cgi-script .cgi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.5 윈도우 레지스트리 수정&lt;br /&gt;&lt;br /&gt;윈도우 레지스트리에 CGI가 실행될때 어떤 프로그램이 동작하는지 명시적으로 알려주기 위해서 Perl의 경로를 설정해 줘야 한다. 아래의 키를 레지스트리에 등록하자.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt; font-family: 굴림;&quot; lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt; font-family: 굴림;&quot; lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;2&quot;&gt;HKEY_CLASSES_ROOT\.cgi\Shell\ExecCGI\Command &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;그리고 키값으로 설치한 Perl의 절대 경로를 입력해 주자.&lt;br /&gt;&lt;br /&gt;C:\Perl\bin\perl.exe -T&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;4. 버그질라의 실행&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;이제 모든 준비가 끝났다. 버그질라를 실행해 보자. 버그질라가 설치된 디렉토리까지 URL을 입력하면 아래와 같은 버그질라 메인페이지가 보인다면 성공이다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTcwMDAwMDAwMDAzLkpQRw%3D%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;587&quot; width=&quot;640&quot;/&gt;&lt;/div&gt;&lt;br /&gt;버그질라 작성과정에 입력한 관리자 전자우편주소와 암호를 이용하여 로긴을 한 후 파라메터 등을 설정하자. 파라메터 설정 및 사용방법은 다른 글에서 다루도록 하겠다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;작성 : 양진석&lt;br /&gt;</description>
			<category>버그질라</category>
			<author>민물곰탱이</author>
			<guid>http://esterel-dev.tistory.com/31</guid>
			<comments>http://esterel-dev.tistory.com/31#entry31comment</comments>
			<pubDate>Tue, 16 Oct 2007 02:51:13 +0000</pubDate>
		</item>
		<item>
			<title>2. 편집기의 골격 작성</title>
			<link>http://esterel-dev.tistory.com/30</link>
			<description>&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;패턴 디자이너에&lt;/font&gt; 사용되는 편집기를 본격적으로 작성해 보자. 우선 에디터 작성을 위한 기본 문서인 &quot;&lt;a href=&quot;http://esterel-dev.tistory.com/15&quot;&gt;에디터를 만들자&lt;/a&gt;&quot;를 참조하여 기본적으로 필요로 하는 메소드와 전체적인 편집기의 동작 원리를 이해하자.&lt;br /&gt;&lt;br /&gt;앞에서 언급한 편집기 작성글에도 있지만, GEF를 이용하여 이클립스 플러그-인을 개발하는데 도움을 주는 몇몇 책들은 편집기에 대한 코딩을 하기전에 필요한 모든것을 갖춰 놓고 시작하라고 하지만, 개인적으로는 반대하는 입장이며, 편집기에 대한 이해와 코딩을 먼저할 것을 강조하고 싶다.(데이터모델에 대한 설계는 편집기를 작성하기 전에 시행하는 것이 좋다.) 처음부터 에디터에 대한 코딩을 시작하면 편집기 화면은 빨간펜 선생님이 검사를 하듯이 붉은 줄이 화면에 쫙쫙생기겠지만, 그 붉은색 줄을 하나하나 없애는 과정을 통해서 전반적인 프로그래밍 과정을 따라갈 수 있다.&lt;br /&gt;&lt;br /&gt;패턴 디자이너는 움직일 수 있는 팔렛트를 이용할 것이다. 그러므로 편집기를 위해서 생성되는 클래스는 GraphicalEditorWithFlyoutPalette를 상속받게 될 것이다. 상속받은 클래스를 편집하기 위해서 열어보면 두 개의 메소드에 대해서 골격코드가 마련되어 있다. 뼈대를 붙일 판이 마련되었으니 이제부터 뼈대를 붙여보자. 클래스에 기본적으로 필요로 하는 에디터 도메인과 팔렛트 루트에 대한 어트리뷰트를 추가하자.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;public class PatternDesignerEditor extends GraphicalEditorWithFlyoutPalette {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private &amp;nbsp;&amp;nbsp; DefaultEditDomain &amp;nbsp; &amp;nbsp; &amp;nbsp; m_editDomain; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 편집기를 위한 에디터 도메인&lt;br /&gt;&amp;nbsp; &amp;nbsp; private &amp;nbsp;&amp;nbsp; PaletteRoot &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_palette; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 편집기의 팔렛트루트 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; @Override&lt;br /&gt;&amp;nbsp; &amp;nbsp; protected PaletteRoot getPaletteRoot() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // TODO Auto-generated method stub&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; @Override&lt;br /&gt;&amp;nbsp; &amp;nbsp; public void doSave(IProgressMonitor monitor) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // TODO Auto-generated method stub&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;4&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;1. 기본적인 메소드들을 모두 추가하자.&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;이제 빨간줄이 전혀 생기지 않을 메소드부터 전부 편집기에 추가시켜보자.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;+ PaletteViewerProvider()&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;blockquote&gt;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * PaletteViewerProvider 객체를 반환한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * 반환된 객체에는 팔렛트 구성시 사용된 CombinedTemplateCreationEntries Tool에 대한 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * 드래그-앤-드롭을 지원하기 위한 소스 리스너를 팔렛트 뷰어를 등록시킨다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp; protected PaletteViewerProvider createPaletteViewerProvider()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return new PaletteViewerProvider(getEditDomain())&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; protected void configurePaletteViewer(PaletteViewer viewer)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.configurePaletteViewer(viewer);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; viewer.addDragSourceListener(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new TemplateTransferDragSourceListener(viewer));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;+ isSaveAsAllowed()&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * 편집기에서 다른이름 저장을 허용한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public boolean isSaveAsAllowed()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;+ setInput()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;이 메소드의 경우 직접 모델을 생성하는 역활을 담당하기 때문에 많은 부분이 작성되어야 하는 부분이지만 편집기 골격을 만드는 과정에서는 부모의 메소드를 호출하는것으로 충분하기 때문에 추가를 하자.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; protected void setInput(IEditorInput input)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.setInput(input);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;+ createActions()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;편집기에서 사용할 전역액션을 등록해주는 함수로 필요에 따라 많은 부분을 추가해야 하지만, 편집기 골격을 만드는 과정에서는 부모 메소드를 호출해주는 것만으로 충분한다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;blockquote&gt;/**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * 에디터에서 사용할 전역 액션에 대해서 설정한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; protected void createActions()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.createActions();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/blockquote&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;+ isDirty()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;blockquote&gt;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * 에디터에서 사용하는 커맨드 스택이 변경되었는지 아닌지 확인하는 메소드&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public boolean isDirty()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return getCommandStack().isDirty();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/blockquote&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;+ commandStackChanged()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;blockquote&gt;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * 에디터에서 사용하는 커맨드 스택이 변경되었다면, 프로퍼티 변경을 알리는 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * 이벤트를 발생한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public void commandStackChanged(EventObject event)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(isDirty())&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; firePropertyChange(IEditorPart.PROP_DIRTY);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.commandStackChanged(event);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;2. 그래픽뷰어의 설정&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;그래픽 뷰어에 대한 설정은 두 부분으로 이루어진다. configureGraphicalViewer() 메소드를 설정하는 부분과 initializeGraphicalViewer() 메소드를 설정하는 부분이다. 이 두개의 메소드를 앞에서 언급한 참고문서를 보고 작성을 한다면 아마 빨간줄이 쫙쫙 생길것이다. 지금부터 차근차근 빨간줄을 없애면서 그래픽뷰어를 설정해 보자.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* createGraphicalViewer() 메소드에서 호출되는 메소드&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* 가. RootEditPart의 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* 나. RootEditPart를 뷰어에 등록&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* 다. 뷰어에 에디터파트 팩토리 등록&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp; protected void configureGraphicalViewer()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.configureGraphicalViewer();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GraphicalViewer viewer = getGraphicalViewer();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; viewer.setRootEditPart(root);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; viewer.setEditPartFactory(new PatternDesignerEditPartFactory());&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;우선 configureGraphicalViewer() 메소드부터 살펴보자. 위와 같이 작성을 한다면, setEditPartFactory(..)부분에 빨간줄이 쫙 생길것이다. 이 부분은 뷰어에서 사용할 에디터파트의 팩토리를 등록하는 부분으로 새롭게 에티터파트 팩토리를 위한 클래스를 작성해 주어야 한다.&lt;br /&gt;&lt;br /&gt;우선, 아래와 같이 팩키지를 하나 추가 시키도록 하자. 패키지 이름은 프로젝트 이름과 연관해서 잘 만드는 것이 좋다. 그리고 추가해야 하는 부분이 에디터파트와 관계된 부분이므로 다음과 같이 만들자.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;com.highendsoft.gef.patterndesigner.editparts&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;그리고 새로 추가된 패키지에 팩토리를 구현하는 클래스를 다음과 같이 하나 생성하여 추가를 시키자.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;/**&lt;br /&gt;&amp;nbsp;* 파라메터로 넘어오는 모델의 인스턴스에 따른 해당 에디터파트를 생성한 후 에디터 파트와&lt;br /&gt;&amp;nbsp;* 연결되는 데이터모델과 연결시켜주는 역활을 수행한다. 뷰어에 등록되기 위해서 &lt;br /&gt;&amp;nbsp;* 편집기의 ConfigureGraphicalViewer() 메소드에서 생성되고 등록된다.&lt;br /&gt;&amp;nbsp;* &lt;br /&gt;&amp;nbsp;* @author edeward&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public class PatternDesignerEditPartFactory implements EditPartFactory &lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* 팔렛트에서 에디터파트를 생성하는 과정에서 호출되는 메소드로 파라메터로 넘어오는&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* 에디터파트의 종류에 따라 해당 에디터 파트를 생성하고 모델과 연결한 후 에디터파트를&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* 반환시킨다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp; public EditPart createEditPart(EditPart context, Object model)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EditPart part = null;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return part;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;GoF(Gang of Four)에서 제안한 팩토리 패턴을 사용하는 GEF 프로그램 방식이므로 왜 이렇게 하느냐고 묻지 말고 그냥 하자. 앞으로 이 팩토리 클래스에 뷰어에서 다루는 모든 에디터파트가 생성된다. 그러므로 createEditPart() 메소드의 내용은 자주 변경될 것이므로 잘 봐 두도록 하자.&lt;br /&gt;&lt;br /&gt;지금까지의 과정으로 configureGraphicalViewer() 메소드의 빨간줄은 없어졌을 것이다. 만약에 아직 빨간줄이 존재한다면 그것은 필요한 패키지를 import하지 않은 결과니 재빨리 더블클릭과 Ctrl+F1을 이용하여 import를 시키도록 하자.&lt;br /&gt;&lt;br /&gt;initializeGraphicalViewer() 메소드를 살펴볼 차례이다. 이 메소드는 빨간줄이 아마 더 많이 생길것이다. 그러므로 빨간줄을 없애기 위한 더 많은 작업을 필요로 한다.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * createGraphicalViewer() 메소드에서 호출되는 메소드로 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * configureGraphicalViewer() 메소드 다음에 호출된다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * 가. Contents의 등록&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; * 나. 그래픽 뷰어를 드래그-앤-드롭의 타겟으로 설정&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; protected void initializeGraphicalViewer()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.initializeGraphicalViewer();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Contents의 등록&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GraphicalViewer viewer = getGraphicalViewer();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; viewer.setContents(getModel()); // Diagram의 최상위 모델을 반환한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; viewer.addDropTargetListener(new PatternDesignerDropTargetListener(viewer));&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;우선 viewer.setContents(getModel()) 이라는 부분부터 이야기해보자. 이 부분에 사용된 getModel() 메소드는 단순히 편집기에서 사용하는 최상위 데이터모델을 반납하는 작업만 하는 메소드를 작성해 주면 된다. 그런데 문제는 아직 데이터 모델을 작성하지 않았기 때문에, 데이터 모델을 작성하기 전까지는 계속 빨간색으로 남아있게 된다. 여기서도 데어터 모델이 없는 관계로 그냥 빨간색으로 나두고 지나가자.&lt;br /&gt;&lt;br /&gt;두번째는 뷰어가 드래그-앤-드롭 기능을 지원 할 수 있도록 리스너를 설정하는 부분이다. 그런데 메소드 이름을 잘 살펴보면 TargetListener란다. 그럼 소스에 대한 리스너는 어디에 있을까? 라는 의문이 생긴다. 이 의문을 풀기전에 드래그-앤-드롭 기능이 무엇을 위해서 존재하는 것인지 알아볼 필요가 있다. 여기서는 편집기에 있는 팔렛트로부터 뷰어로 드래그-앤-드롭 기능을 제공하는 것을 의미한다. 즉, 팔렛트에 있는 어떤 아이템(여기서는 에디터파트)을 클릭하고 드래그 해서 그래픽 뷰어에 놓을 수 있음을 의미한다.&lt;br /&gt;&lt;br /&gt;그럼 이제 그래픽 뷰어에 드래그-앤-드롭을 위한 타겟 리스너를 등록하는지 알겠는가? 그럼 소스 리스너는 어디에 있을까? 라는 의문에 대답을 해보자. 그 대답은 앞에서 작성했던 PaletteViewerProvider() 메소드를 살펴보길 바란다. 그 메소드가 반환하는 객체에 소스 리스너가 등록되어 있음을 알 수 있을 것이다.&lt;br /&gt;&lt;br /&gt;드래그-앤-드롭을 위한 타겟 리스너를 등록해 보자. 드래그-앤-드롭 리스너를 위해서는 TemplateTransferDropTargetListener 클래스를 상속받는다. 이 클래스를 상속받는 클래스를 위한 패키지를 하나 추가하자.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;com.highendsoft.gef.patterndesigner.dnd&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;추가한 패키지에 TemplateTransferDropTargetListener 클래스를 상속받은 클래스를 추가하자.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;/**&lt;br /&gt;&amp;nbsp;* 편집기에서 드래그-앤-드롭 기능을 제공하기 위해서는 드래그-앤-드롭의 소스와 타켓을 위한&lt;br /&gt;&amp;nbsp;* 리스너를 필요로 한다. 이 객체의 경우 뷰어에 타켓 리스너로 사용하기 위해서 사용된다.&lt;br /&gt;&amp;nbsp;* TemplateTransferDropTargetListener를 상속받아서 사용한다.&lt;br /&gt;&amp;nbsp;* 타켓 리스너의 경우 편집기의 initializeGraphicalViewer() 메소드에서 호출된다.&lt;br /&gt;&amp;nbsp;* 소스 리스너의 경우 편집기의 createPaletteViewrProvider() 메소드에서 생성된다.&lt;br /&gt;&amp;nbsp;* @author edeward&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public class PatternDesignerDropTargetListener extends&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TemplateTransferDropTargetListener {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public PatternDesignerDropTargetListener(EditPartViewer viewer)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super(viewer);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; public CreationFactory getFactory(Object template)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return (CreationFactory)template;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;편집기 클래스에서 import를 시키면 이제 빨간색 줄이 없어지는 것을 알 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;3. 팔렛트의 등록&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;이제 편집기 골격을 위한 마지막 단계로 팔렛트를 등록하면 된다. 조금 앞의 내용으로 거슬러 올라가 편집기 클래스를 생성할때 자동으로 생성되어 있던 getPaletteRoot() 메소드를 살펴보자.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; @Override&lt;br /&gt;&amp;nbsp; &amp;nbsp; protected PaletteRoot getPaletteRoot() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // TODO Auto-generated method stub&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(m_palette == null)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_palette = PatternDesignerPaletteFactory.createPaletteRoot();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return m_palette;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;m_palette에 팔렛트를 새롭게 생성하여 그 인스턴스를 넘겨주는 것을 알 수 있다. 그리고 아직 팔렛트를 클래스가 없으므로 빨간색 줄이 선명하게 보일 것이다.&lt;br /&gt;&lt;br /&gt;팔렛트를 위한 클래스들을 위한 패키지를 역시 하나 새롭게 추가하자.&lt;br /&gt;&lt;br /&gt;com.highend.gef.patterndesigner.palette&lt;br /&gt;&lt;br /&gt;새롭게 추가된 패키지에 팔렛트 클래스를 추가하자. 팔렛트 클래스의 경우 GEF의 특별한 클래스이 상속이 없는 일반적인 클래스이다.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;/**&lt;br /&gt;&amp;nbsp;* 팔렛트에 대한 전반적인 설정을하는 클래스&lt;br /&gt;&amp;nbsp;* @author edeward&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public class PatternDesignerPaletteFactory {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* 팔렛트 루트를 생성하여 그 인스턴스를 반환한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @return&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp; public static PaletteRoot createPaletteRoot()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PaletteRoot root = new PaletteRoot();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return root;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;팔렛트 클래스는 팔렛트를 구성할때 많은 부분이 변경되어진다. 하지만 위의 createPaletteRoot() 메소드와 같이 기본적인 사항은 변경되지 않는다. 자세한 부분은 팔렛트의 설정부분에서 다루도록 하겠다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;마무리&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;지금까지 편집기를 구성하기 위한 가장 기본적인 골격을 만드는 방법을 살펴봤다. 지금부터 시작으로 많은 부분이 추가되어 질 것이다. 이 예제에 대한 글은 실제적으로 저자가 GEF 에디터를 프로그래밍하는 순서로 구성이 되어 있기 때문에 이런 구성을 싫어 하는 사람도 있을 것이다. 왜냐하면 미리 모든 요리재료를 준비하고 시작을 하지 않기 때문에 이코드 저코드 많은 부분의 수정이 있기 때문이다. 하지만 어디에 쓸지도 모를 요리재료부터 준비하는 것보다 이 방법이 훨씬 좋을것이다. 적어도 요리재료가 어디에 쓰일지는 쉽게 기억할 수 있기 때문이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
			<category>패턴 디자이너</category>
			<author>민물곰탱이</author>
			<guid>http://esterel-dev.tistory.com/30</guid>
			<comments>http://esterel-dev.tistory.com/30#entry30comment</comments>
			<pubDate>Tue, 15 May 2007 05:51:29 +0000</pubDate>
		</item>
		<item>
			<title>1. 패턴 디자이너 프로젝트의 생성</title>
			<link>http://esterel-dev.tistory.com/29</link>
			<description>&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;이클립스용&lt;/font&gt; 플러그-인으로 개발될 &quot;패턴 디자이너&quot;를 위해서 가장먼저 해야할 일은 프로젝트를 생성하는 작업이다. 이클립스에서 플러그-인용 프로젝트를 생성하는 작업은 이 문서를 참조하기 바란다.&lt;br /&gt;&lt;br /&gt;프로젝트 : com.highend.gef.patterndesigner &lt;br /&gt;&lt;br /&gt;프로젝트를 생성한 후 역시 가장먼저 해야할 일은 플러그-인에 대한 정보를 설정하는 작업이다. 첫 화면으로 나오는 매니페스트 편집기를 이용하여 필요한 정보를 채우도록 하자. 매니페스트를 이용한 플러그-인 정보를 설정하는 자세한 작업은 이 문서를 참조하기 바란다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMjUuanBn&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;428&quot; width=&quot;640&quot;/&gt;&lt;/div&gt;&lt;br /&gt;프로젝트에서는 GEF와 EMF를 사용할 예정이기 때문에 Dependency 탭에 개발에 필요한 플러그-인들을 등록해 놓았다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMjUuanBn&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;423&quot; width=&quot;640&quot;/&gt;&lt;/div&gt;&lt;br /&gt;마지막으로 편집기를 작성하기위한 Extension Point를 설정한다. Extension Point에서 편집기에서 처리 할 수 있는 확장자와 Contributor 클래스등을 설정하면 필요한 작업은 일단 매니페스트 편집을 마무리 할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
			<category>패턴 디자이너</category>
			<category>패턴디자이너</category>
			<author>민물곰탱이</author>
			<guid>http://esterel-dev.tistory.com/29</guid>
			<comments>http://esterel-dev.tistory.com/29#entry29comment</comments>
			<pubDate>Tue, 15 May 2007 05:03:44 +0000</pubDate>
		</item>
		<item>
			<title>이클립스 플러그-인 프로젝트 생성절차</title>
			<link>http://esterel-dev.tistory.com/28</link>
			<description>&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;이클립스에서&lt;/font&gt; 이클립스 플러그-인을 개발하기 위해서 어떻게 프로젝트를 생성하는지 알아보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;1. 새로운 프로젝트의 생성&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&quot;File &amp;gt;&amp;gt; New &amp;gt;&amp;gt; Project&quot; 를 통해서 새로운 프로젝트생성시키면 프로젝트 위자드의 첫화면이 우리를 반겨준다. 위자드에서 기본적으로 제공해주는 프로젝트는 많지만 이번에는 &quot;Plug-in Project&quot;를 선택하자. Next 버튼을 눌러서 다음 화면으로 이동을 하자.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMjQuanBn&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;500&quot; width=&quot;525&quot;/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;3&quot;&gt;2. 플러그-인 프로젝트의 설정&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;프로젝트의 이름을 입력하고, 필요한 정보를 설정하자. 타겟 플랫폼 정보도 이 위자드 화면에서 포함하고 있으니 알맞은 타켓 플랫폼을 설정하자. 예제에서는 이클립스 3.2를 타겟 플랫폼으로 설정하였다. 필요한 설정을 완료하였다면 계속해서 다음 화면으로 이동을 하자.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMjQuanBn&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;500&quot; width=&quot;525&quot;/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;3. 플러그-인 정보의 설정&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;마지막 위자드 화면이다. 두번째 화면이 프로젝트에 대한 설정이였다면, 세번째 화면은 이제부터 개발할 플러그-인 자체에 대한 설정이다. &lt;br /&gt;&lt;br /&gt;&quot;Plug-in Properties&quot;에 존재하는 많은 값들가운데, Plug-in ID는 말그대로 플러그-인을 구별하기 위한 식별자이기 때문에 유일한것을 사용하는 것이 좋다. 기본적으로 앞 화면에서 설정한 프로젝트의 이름을 따른다. &quot;Plug-in Name&quot; 과 &quot;Plug-in Provider&quot;는 플러그-인에 대한 설명과 플러그-인을 만든사람에 대한 정보를 작성하는 곳이다. 실제로 이곳에 작성된 정보가 이클리스에 설치된 플러그-인 목록에 나타나게 된다.&lt;br /&gt;&lt;br /&gt;플러그-인의 생명주기(Life cycle)을 제어하는 activator는 반드시 있어야 하는 것으로, 여기서 자동으로 생성하지 않는다면, 결국 사람이 직접 작성을 해주어야 한다. Activator 클래스에 특별한 것을 추가해야 하는 일이 없다면 자동 생성을 이용하도록 하자.&lt;br /&gt;&lt;br /&gt;마지막으로 &quot;리치 클라이언트&quot; 어플리케이션인지 아닌지를 묻는 것이 존재한다. &quot;리치 클라이언트&quot;에 대해서 좀 쉽게 설명하자면 이클립스 밑단에 깔려있는 것으로 이클립스보다는 한단계 낮은 곳에 존재한다. 즉 리치 클라이언트를 이용해서 이클립스 같은 도구를 만들 수 있는 것이다. 리치클라이언트에 대한 자세한 정보는 &quot;이클립스 RCP - 양석호 번역&quot;에서 찾을 수 있다. 여기서는 이클립스의 플러그-인을 작성할 것이므로, &quot;No&quot;로 선택을 하자.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMjMuanBn&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;500&quot; width=&quot;525&quot;/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;4&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;4. 정리&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;지금까지 이클립스 플러그-인 프로젝트를 위한 준비작업이 완료되었다. 위 위자드 화면이 종료되면 이클립스에서 플러그-인 개발을 위한 퍼스펙티브(Perspective)를 사용할 것인지 묻는 대화상자가 나온다. &quot;예&quot;라고 대답하면 플러그-인 개발을 위한 퍼스펙티브로 전환이 이루어지고, plugin.xml을 편집할 수 있는 메니페스토가 화면에 나오게 된다. 메니페스트를 이용한 플러그-인의 본격적인 설정에 대해서는 &lt;a href=&quot;http://esterel-dev.tistory.com/2&quot;&gt;플러그-인 환경설정&lt;/a&gt;에 대한 글을 참조하기 바란다.&lt;br /&gt;</description>
			<category>플러그-인 개발 환경설정</category>
			<category>프로젝트</category>
			<category>플러그인</category>
			<author>민물곰탱이</author>
			<guid>http://esterel-dev.tistory.com/28</guid>
			<comments>http://esterel-dev.tistory.com/28#entry28comment</comments>
			<pubDate>Tue, 15 May 2007 02:48:43 +0000</pubDate>
		</item>
		<item>
			<title>에디터에 그리드(Grid) 적용하기</title>
			<link>http://esterel-dev.tistory.com/27</link>
			<description>&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;5&quot;&gt;편&lt;/font&gt;집기에 격자(Grid)를 적용해 보자. 격자를 이용하면 편집기에 도형을 그릴때 가로/세로로 잘 정렬 할 수 있으니 자주 사용하는 기능가운데 하나이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMjMuanBn&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;293&quot; width=&quot;451&quot;/&gt;&lt;/div&gt;&lt;br /&gt;편집기를 개발할때 루트 에디터 파트를 ScalableFreeformRootEditPart 또는 ScalableRootEditPart를 사용한다면 자체적으로 Grid 레이어를 포함하고 있어서 편집기에서는 그 Grid 레이어를 사용 할 수 있도록 설정만 하면 된다. 하지만 위에서 언급한 두 개의 에디터파트를 루트 에디터파트로 사용하지 않는다면 이야기가 달라진다. 이 경우에 대해서는 이 글에서 다루지 않을 것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;3&quot;&gt;1. 그래픽 뷰어의 설정&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;편집기에 해당하는 클래스에서 편집기의 외관이나 편집기의 액션등을 설정하는 가장 중요한 메소드가 무엇인가? 기억이 나는가? configureGraphicalViewer() 메소드를 생각했다면 GEF에서 대해서 상당히 많은 부분을 이해하고 있는 것이다.&lt;br /&gt;&lt;br /&gt;그래픽 뷰어에서 격자를 사용할 수 있게 아래와 같이 설정을 하자.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;GraphicalViewer viewer = getGraphicalViewer();&lt;br /&gt;...&lt;br /&gt;viewer.setProperty(SnapToGrid.PROPERTY_GRID_ENABLED, true);&lt;br /&gt;viewer.setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE, true);&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;뷰어에서 격자를 사용 할 수 있도록 뷰어의 속성으로 설정을 했다. 뷰어에 속성을 설정함으로써 격자를 편집기의 배경에 보이도록 하기 위해서 더이상 해야 할 일은 없다. 만약 메뉴를 통해서 편집에 존재하는 격자를 보이게 했다가 안보이게 했다가 하고 싶다면 아래의 액션 설정글을 읽고, 그런것을 원하지 않다면 읽지 않고 건너뛰어도 된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;3&quot;&gt;2. 액션의 등록&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;메뉴와 관련된 일을 하려면 ActionBarContributor 클래스를 편집해야 한다. 우선 격자를 제어할 수 있는 액션을 편집기쪽으로 되돌려야 한다. buildAction() 메소드에 아래의 코드를 추가하자.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;addRetargetAction(new RetargetAction(GEFActionConstants.TOGGLE_GRID_VISIBILITY,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;  GEFMessage.ToggleGrid_Label, IAction.AS_CHECK_BOX));&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;위의 소스를 이용하여 체크박스 액션을 하나 생성한것이다.&lt;br /&gt;&lt;br /&gt;이제 위처럼 워크벤치에서 편집기로 넘겨준 액션을 사용 할 수 있도록 메뉴를 하나 추가시켜주자. 메뉴의 추가는 contributeToMenu() 메소드를 사용한다.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;public void contributeToMenu(IMenuManager menuManager)&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; super.contributeToMenu(menuManager);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; MenuManager viewMenu = new MenuManager(&quot;View&quot;);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; viewMenu.add(getAction(GEFActionConstants.TOGGLE_GRID_VISIBILITY));&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;3. 컨테이너 피규어의 편집&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;그리드를 사용할때 컨테이너 피규어에서 주의해야 할 점은 딱 하나이다. 절대 setOpaque(true)를 사용하지 마라는 것이다. 컨테이너 피규어가 불투명한 상태가 되어 버리면 격자가 화면에 보이지 않게 된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;3&quot;&gt;4. 컨테이너 에디터파트의 편집&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;이제 편집기 위로 격자가 보일것이다. 그렇지만 격자가 제 역활을 하려면 컴포넌트가 격자에 쩍쩍 달라붙어야 하지 않을까? 이렇게 격자에 컴포넌트를 쩍쩍 달라붙게 만드는 것을 Snap이라고 하고, GEF에서는 이를 위해서 SnapToGrid 객체를 제공해 주고 있다.&lt;br /&gt;&lt;br /&gt;그러므로 컨테이너 에디터 파트는 SnapToGrid를 아답터 형식으로 지원을 해 주어야 한다. 아래의 코드를 getAdapter() 메소드에 추가 시키자.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; public Object getAdapter(Class key)&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(key == SnapToHelper.class)&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List snaps = new ArrayList();&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Boolean val = (Boolean)getViewer().getProperty(SnapToGrid.PROPERTY_GRID_ENABLED);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(val != null &amp;amp;&amp;amp; val.booleanValue())&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; snaps.add(new SnapToGrid(this));&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(snaps.size() == 0) return null;&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(snaps.size() == 1) return snaps.get(0); &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return super.getAdapter(key);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;3&quot;&gt;5. 정리&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;격자를 사용하려면 역시 루트 에디터파트의 선택이 중요하다. 뷰어에 속성을 설정하면 격자는 화면에 보일것이다. 그리고 컨테이너 에디터 파트에 Snap기능을 추가 시킴으로써 격자기능을 완전하게 만들 수 있다.&lt;br /&gt;&lt;br /&gt;</description>
			<category>에디터(Editor)</category>
			<category>GEF</category>
			<category>Grid</category>
			<author>민물곰탱이</author>
			<guid>http://esterel-dev.tistory.com/27</guid>
			<comments>http://esterel-dev.tistory.com/27#entry27comment</comments>
			<pubDate>Tue, 13 Mar 2007 07:53:29 +0000</pubDate>
		</item>
		<item>
			<title>줌인/줌아웃 기능 설정하기</title>
			<link>http://esterel-dev.tistory.com/26</link>
			<description>&lt;br /&gt;개발하려는 에디터에 줌인/줌아웃 기능을 추가해 보자.&lt;br /&gt;&lt;br /&gt;에디터에 줌인/줌아웃 기능을 구현하려면 실제로 많은 노력을 필요로 하지만, GEF 2.0+ 이상의 버젼부터는 그 기능을 사용자가 쉽게 사용 할 수 있도록 지원을 하고 있다. 아래의 순서대로만 작성을 하면 손쉽게 만들수 있으니 차례대로 알아보도록 하자.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMjIuanBn&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;73&quot; width=&quot;463&quot;/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;1. 내가 만들 에디터는 줌인/줌아웃을 사용할 수 있을까?&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;우선 만들려고 작정한 에디터가 GEF에서 제공하는 줌인/줌아웃 기능을 지원해 줄 수 있는지 알아봐야 한다. 가장 먼저 확인해야 할 것인 RootEditPart이다. 아래의 두개의 RootEditPart를 사용하는가?&lt;br /&gt;&lt;br /&gt;+ ScalableFreeformRootEditPart &lt;br /&gt;+ ScalableRootEditPart&lt;br /&gt;&lt;br /&gt;위 두개의 루트에디터 파트가 아니라면 필요한 대부분의 사항을 일일이 손으로구현해야한다. 그러므로 왠만하여 위의 에디터파트를 사용하자. 두 개의 에디터파트에는 ZoomManager라는 객체를 포함하고 있는데, 이 객체가 실질적으로 줌인/줌아웃을 가능하게 해준다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;3&quot;&gt;2. 에디터의 메인 컨테이너 역활을 담당하는 에디터파트의 피규어는 무엇인가?&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;위에서 언급한 ZoomManager 클래스는 ScalableFigure이 줌인/줌아웃이 될 수 있도록 관리해 주는 역활을 한다. 그러므로 당연히 우리가 구현할 에디터의 메인 컨테이너 역활을 수행하는 에디터파트의 피규어는 ScalableFigure여야 한다는 것이다. GEF에서는 ScalableFigure를 상속받는 두 개의 피규어를 제공하고 있다. 이 클래스를 사용하고 있는가?&lt;br /&gt;&lt;br /&gt;+ ScalableLayeredPane&lt;br /&gt;+ ScalableFreeformLayerPane&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;3&quot;&gt;3. ZoomManager를 워크벤치파트(WorkbenchPart)에 설정하자.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;위의 두 조건을 만족했다면 지금부터 본격적으로 프로그램을 작성해 보자.&lt;br /&gt;&lt;br /&gt;ZoomManager 클래스를 워크벤치파트에 위치시키기 위해서는 편집기가 IAdapter 인터페이스를 설정해 주어야 한다. 편집기 클래스의 getApdater(Class type) 메소드에 줌매니져를 위한 코드를 추가하자.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;public Object getAdapter(Class type)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(type == ZoomManager.class)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;  return ((ScalableFreeformRootEditPart)getGraphicalViewer().&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; getRootEditPart().getZoomManager();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; return super.getAdapter(type);&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;3&quot;&gt;4. ZoomManager 속성설정 및 줌인/줌아웃 액션 추가&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;위에서 언급한 루트에디터파트(예를 들어, ScalableFreeformRootEditPart)를 사용했다면 루트 에디터파트를 생성할때 자동적으로 줌 매니져는 같이 생성되기 때문에 그냥 사용만 하면된다. &lt;br /&gt;&lt;br /&gt;이제 줌 매니져의 속성 및 액션을 추가하자. 이 작업은 전부 편집기 클래스의 configureGraphicalViewer() 메소드에서 이루어진다. 중요한 부분이니 있지 말자.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;protected void configureGraphicalViewer()&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; super.configureGraphicalViewer();&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart();&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; ....&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; // 줌 레벨의 설정&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; List zoomLevels&amp;nbsp; = new ArrayList(3);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; zoomLevels.add(ZoomManager.FIT_ALL);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; zoomLevels.add(ZoomManager.FIT_WIDTH);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; zoomLevels.add(ZoomManager.FIT_HEIGHT);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; root.getZoomManager().setZoomLevelContributions(zoomLevels);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; // 디폴트 줌 배율의 설정, 기본값으로 100%로 설정한다.&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; root.getZoomManager().setZoom(1.0);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; // 줌인/줌아웃 액션의 등록&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; IAction zoomIn = new ZoomInAction(root.getZoomManager());&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; IAction zoomOut = new ZoomOutAction(root.getZoomManager());&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; getActionRegistry().registerAction(zoomIn);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; getActionRegistry().registerAction(zoomOut);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; // 줌인/줌아웃 액션이 키보드에서 할 수 있도록 등록&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; getSite().getKeyBindingService().registerAction(zoomIn);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; getSite().getKeyBindingService().registerAction(zoomOut);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; .....&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;}&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;/blockquote&gt;실제로 줌인/줌아웃 액션은 createActions() 메소드에서 수행을 해도 무방하다. 이곳에서 Action을 설정한 이유는 인수로 ZoomManager를 사용하는 곳이 있으므로 단지 편의를 위해서 했을 뿐이다.&lt;br /&gt;&lt;br /&gt;줌인/줌아웃 액션을 키보드로 할 수있도록 등록하는 부분을 살펴보면 약간의 문제가 있다. 왜냐하면 더이상 이클립스에서 getKeyBindingService() 메소드를 사용하는 것을 허용하지 않기 때문이다. 실제 이클립스 툴에서 다음 코드를 입력하면 더이상 사용하지 말라는 의미에서 중간에 줄이 생기는 것을 볼 수 있다. 하지만 무시하고 사용하자. ㅋㅋㅋ&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;5. 툴바와 메뉴에 줌인/줌아웃 기능을 추가하자.&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;지금까지 필요한 물밑 작업은 다해놓았다. 이제 본격적으로 사용자가 사용할 수 있도록 인터페이스를 생성해야 한다. 가장 대표적인 인터페이스는 역시 아래의 그림과 같이 메뉴와 툴바이다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMjIuanBn&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;73&quot; width=&quot;463&quot;/&gt;&lt;/div&gt;&lt;br /&gt;그럼 여기서 문제를 내보겠다. 메뉴와 툴바에 특정 내용을 추가하려면 GEF의 어떤 부분을 봐야 할까?&lt;br /&gt;&lt;br /&gt;정답을 생각해 보았는가? JFace나 GEF 액션에 대한 글을 읽어보았다면 어렴풋이 떠오르는 이름이 있을 것이다. Contributor가 그것이다. 그렇다면 GEF에서 Contributor라는 이름을 가진 클래스가 무엇이 있을까? &lt;br /&gt;&lt;br /&gt;플러그-인 개발과정에서 처음 본 Menifest 편집기를 통해 개발할 편집기를 추가할때 지정한 ActionbarContributor라는 클래스를 기억하는가?&amp;nbsp; 인터페이스에 대한 대부분의 작업은 이곳에서 이루어지니 반드시 기억을하자.&lt;br /&gt;&lt;br /&gt;우선 툴바(Toolbar)에 줌도구를 추가하자. GEF에서는 줌 도구를 위해서 ZoomComboContributionItem 클래스를 기본적으로 제공해 주고 있다. ActionContributor의 contributeToToolBar()에 소스를 추가하자.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;blockquote&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; public void contributeToToolBar(IToolBarManager toolBarManager)&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.contributeToToolBar(toolBarManager);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ... &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;  &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 툴바에 줌인/줌아웃을 할 수 있는 콤보박스를 추가한다.&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; toolBarManager.add(new Separator());&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; toolBarManager.add(new ZoomComboContributionItem(getPage()));&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;/blockquote&gt;&lt;br /&gt;다음으로 할 일은 메뉴를 추가하는 작업이다. 메뉴를 추가하는 작업은 보통 두 단계로 이루어진다. 첫번째로 할일은 워크벤치에서 기본적으로 지원해주는 액션(우리가 생각할 수 있는 기본 액션은 거의다 워크벤치에서 제공을 해 주고 있다.)을 편집기에서 사용할 수 있도록 하는 작업이고, 두번째로 새로운 메뉴를 추가하여 메뉴바에 등록을 하는 작업이다. 이 두 작업 역시 모두 ActionContributor 클래스에서 이루어진다.&lt;br /&gt;&lt;br /&gt;첫번째 작업부터 해보자. ActionContributor의 buildActions() 메소드를 이용하여 워크벤치의 액션을 편집기에서 사용 할 수 있도록 하자. 줌인/줌아웃 액션 역시 기본적으로 워크벤치에서 제공해주는 액션이므로 이 메소드에서 액션을 등록 할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; protected void buildActions() {&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // TODO Auto-generated method stub&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .....  &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addRetargetAction(new ZoomInRetargetAction());&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addRetargetAction(new ZoomOutRetargetAction());&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt; ActionBarContributer 클래스의 두번째 작업은 워크벤치에서 편집기로 돌려준 액션을 사용할 수 있는 메뉴를 메뉴바에 추가를 하는 일이다.contributeToMenu() 메소드를 사용한다.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; public void contributeToMenu(IMenuManager menuManager)&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.contributeToMenu(menuManager);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // &quot;Edit&quot; 메뉴뒤쪽에 &quot;View&quot; 메뉴를 추가한다.&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MenuManager viewMenu = new MenuManager(&quot;View&quot;);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(getAction(GEFActionConstants.ZOOM_IN) == null)&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println(&quot;ZOOM In Action is null&quot;);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; viewMenu.add(getAction(GEFActionConstants.ZOOM_IN));&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; viewMenu.add(getAction(GEFActionConstants.ZOOM_OUT));&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; menuManager.insertAfter(IWorkbenchActionConstants.M_EDIT,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; viewMenu);&lt;/span&gt;&lt;br style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: verdana,arial,helvetica,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;위의 소스는 View 메뉴를 생성한 후에, Edit 메뉴 뒷쪽에 추가를 시키고 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;6. 정리 및 요약&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;지금까지의 과정을 간략하게 요약을 하면 다음과 같다.&lt;br /&gt;&lt;br /&gt;가. 루트 에디터파트와 메인 컨테이너의 선택&lt;br /&gt;나. 줌 매니져 사용을 위한 Adapter 인터페이스의 작성 및 줌 매니져 속성 및 액션의 등록&lt;br /&gt;다. 툴바 및 메뉴의 등록&lt;br /&gt;&lt;br /&gt;</description>
			<category>에디터(Editor)</category>
			<category>GEF</category>
			<category>줌아웃</category>
			<category>줌인</category>
			<author>민물곰탱이</author>
			<guid>http://esterel-dev.tistory.com/26</guid>
			<comments>http://esterel-dev.tistory.com/26#entry26comment</comments>
			<pubDate>Fri, 09 Mar 2007 05:06:29 +0000</pubDate>
		</item>
		<item>
			<title>Eclipse 플러그인 개발을 위한 타겟 플랫폼 설정 (by 호진)</title>
			<link>http://esterel-dev.tistory.com/24</link>
			<description>&lt;P&gt;이클립스의 플러그인 개발에 있어서 결과물을 적용시킬 플랫폼이 필요합니다. 일명, 타겟 플랫폼이란 것인데, 이는 이클립스 상에서 자유롭게 설정할 수 있습니다. 우리는 개발을 하기위한 목적으로 Eclipse SDK 3.2 등을 받아서 사용을 하게 됩니다. 여기서 개발에 쓰는 통합환경 자기자신을 타겟 플랫폼으로 설정하여 결과물을 확인할 수도 있지만, 다른 플러그인들(e.g. JDT, PDE)과 같이 로드가 되기 때문에 로딩이 느려질 수 있고 나중에 플러그인을 릴리즈(release)하는 데 어려움이 있을 수 있습니다. 따라서 이 글에서는 Eclipse SDK와 별도로 Eclipse Platform SDK를 사용하여 이를 타겟 플랫폼으로 설정하는 방법에 대해 설명합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;1. 준비물&lt;/FONT&gt;&lt;/STRONG&gt;&lt;br /&gt;&lt;br /&gt;타겟 플랫폼을 설정하는데 있어서, 개발에 사용되는 모든 플러그인들을 타겟 플랫폼에서 로딩해야 합니다. 이 글에서는 GEF/EMF 플러그인을 예제로 설명합니다.&lt;br /&gt;&lt;br /&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;1.1. Eclipse Platform SDK&lt;/STRONG&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;Eclipse Platform SDK는 아래 사이트에서 다운로드 받을 수 있습니다.&lt;br /&gt;&lt;A href=&quot;http://www.eclipse.org/downloads/&quot;&gt;http://www.eclipse.org/downloads/&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;사이트에 접속하시면 Other downloads for 3.2.2. 라는 메뉴가 보입니다. 현재 이 글을 쓰는 당시 eclipse의 최신 버젼이 3.2.2. 이므로 뒤에 숫자가 붙었습니다. 클릭해서 들어가보면, 다양한 종류의 다운로드를 제공합니다. Platform SDK 메뉴에서 &quot;eclipse-platform-SDK-3.2.2-win32.zip&quot; 를 다운받으면 됩니다. 압축을 해제하면 eclipse 디렉토리가 있고 그 안에 eclipse.exe 실행파일이 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;1.2. GEF 플러그인&lt;/STRONG&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;GEF 플러그인은 아래 사이트에서 다운로드 받을 수 있습니다.&lt;br /&gt;&lt;A href=&quot;http://www.eclipse.org/gef/&quot;&gt;http://www.eclipse.org/gef/&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;사이트에 접속하여 GEF Downloads에서 최신 GEF를 다운 받습니다. 타겟 플랫폼에 적용할 것이기 때문에 Runtime만 있으면 실행이 되겠지만, 혹시나 다른 플러그인들이 더 들어가있을 수 있으므로, Source code와 Example 을 모두 포함한 GEF ALL 을 다운로드 받고 압축을 해제합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;1.3. EMF 플러그인&lt;br /&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;br /&gt;EMF 플러그인은 아래 사이트에서 다운로드 받을 수 있습니다.&lt;br /&gt;&lt;A href=&quot;http://www.eclipse.org/emf/&quot;&gt;http://www.eclipse.org/emf/&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;사이트에 접속하여 왼쪽 메뉴 Downloads를 클릭합니다. EMF의 경우 runtime만 받으면, 다른 플러그인과의 의존성으로 인해 플러그인 로딩이 제대로 되지 않으므로 EMF SDK (All)을 다운로드 받고 압축을 해제합니다. 여기서 주의할 점은 EMF 최신버젼 2.3.0은 Eclipse 3.3.0 또는 호환가능한 버젼에서만 사용이 가능한데, Eclipse Platform은 현재 3.2.2.까지만 나와있으므로, Eclipse Platform SDK 3.2.2를 사용하기 위해서는 EMF버젼이 2.2.2 또는 2.2.1, 2.2.0 이어야 합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;2. 플러그인 로딩&lt;/FONT&gt;&lt;/STRONG&gt;&lt;br /&gt;&lt;br /&gt;1.1. 에서 설치한 Eclipse Platform SDK 를 실행시키고, 아래 그림처럼 Help 메뉴에서 Software Updates -&amp;gt; Find and Install... 을 선택합니다.&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTUuSlBH&quot; alt=&quot;사용자 삽입 이미지&quot; class=&quot;tt-resampling&quot; height=&quot;524&quot; width=&quot;700&quot;/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;그리고 두번째 메뉴인 Search for new features to install 을 선택하고 Next 를 클릭합니다.&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTkuSlBH&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;538&quot; width=&quot;600&quot;/&gt;&lt;/div&gt;&lt;br /&gt;오른쪽에 New Local Site... 를 선택합니다.&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMjAuSlBH&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;538&quot; width=&quot;600&quot;/&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;폴더 찾아보기 창이 뜨면, GEF-runtime을 해제한 디렉토리 내의 eclipse 를 지정하고 확인 버튼을 누릅니다. 그리고 확인 창이 뜨면, 나중에 보여질 플러그인 이름을 정하고 OK버튼을 누릅니다.&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTcuSlBH&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;342&quot; width=&quot;379&quot;/&gt;&lt;/div&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMjEuSlBH&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;143&quot; width=&quot;356&quot;/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;EMF 역시 똑같이 지정해주면 결과는 아래화면과 같습니다.&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTguSlBH&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;538&quot; width=&quot;600&quot;/&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;Finish를 누르고 설치할 항목들을 선택합니다. 선택 후 Next 버튼을 누릅니다.&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMjIuSlBH&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;500&quot; width=&quot;600&quot;/&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;동의 여부를 물으면, Agree를 선택하고 Next, Finish를 눌러 설치를 마칩니다. 설치가 끝나면 플러그인 적용을 위해서 이클립스를 재시작 할 것인지 묻습니다. 이로써 설치가 완료 되었습니다. 플러그인이 제대로 설치되고 로딩되는지 확인하려면 Help 메뉴에서 About Eclipse Platform 을 선택하고 팝업창이 뜨면 Plug-in Details 를 클릭하여 확인할 수 있습니다.&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTkuSlBH&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;407&quot; width=&quot;700&quot;/&gt;&lt;/div&gt;&lt;/P&gt;&lt;br /&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;3. 타겟 플랫폼 설정&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;우리가 개발에 사용하는 Eclipse SDK 를 실행하고, 위쪽 Window 메뉴에서 Preferences 를 선택합니다. 팝업창이 뜨면, 왼쪽에서 Plug-in Development 를 선택하고 Target Platform 을 선택합니다. 그리고 Browse... 를 눌러서 타겟 플랫폼(Eclipse platform SDK)가 있는 곳으로 설정을 해줍니다.&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUxOTY1QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMTYuSlBH&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;534&quot; width=&quot;700&quot;/&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;&lt;br /&gt;마지막으로 Reload를 눌러서 타겟 플랫폼의 플러그인들을 로드해주고 OK를 눌려서 닫습니다.&lt;/P&gt;</description>
			<category>플러그-인 개발 환경설정</category>
			<author>민물곰탱이</author>
			<guid>http://esterel-dev.tistory.com/24</guid>
			<comments>http://esterel-dev.tistory.com/24#entry24comment</comments>
			<pubDate>Fri, 23 Feb 2007 04:14:40 +0000</pubDate>
		</item>
	</channel>
</rss>

