월요일, 7월 21, 2008

이번에 노트북을 바꾸면서 vista 64 를 설치하고 그전에 그랬든 당연히 zip 기능을 끌려고 했는데 안되더라...
그래서 열심히 검색해본 결과 아래 링크 하나만 제대로 작동 된다.

http://www.vistax64.com/tutorials/93827-zip-file-compressed-folders.html

하지만 위 링크글에서 reg 파일을 다운 받을려면 회원가입하고 이메일 인증까지 거쳐야 한다.

그래서 내용을 옮겨왔다.


OPTION ONE:
압축폴더 끄는 방법
1. 에디터를 열어 아래 내용을 입력후 vistaunzip.reg 라는 이름으로 저장.
Windows Registry Editor Version 5.00

;
; Disable ZIP support in Windows Vista
;
; from Windows Vista Annoyances ( http://Annoyances.org/vista )
;
; restart Windows after applying this patch
; for more information, see http://www.annoyances.org/exec/show/article03-202
;

[-HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}]

[-HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}]

2. vistaunzip.reg 파일을 오른쪽 클릭하여 [Merge|병합] 를 클릭.
3. 보안경고창이 뜨면 [Run|실행] 버튼을 클릭.
4. [Continue|계속] (UAC|사용자계정컨트롤) 클릭, [Yes|예], 그리고 프롬프트가 나타나면 [OK|확인].
5. 변경을 적용하기 위해 컴퓨터 재시작.
6. 잘 작동하는지 확인 후 vistaunzip.reg 파일 삭제.


OPTION TWO:
압축 폴더 키는 방법
1. 에디터를 열어 아래 내용을 입력후 vistazip.reg 라는 이름으로 저장.
Windows Registry Editor Version 5.00

;
; Re-enable ZIP support in Windows Vista
;
; from Windows Vista Annoyances ( http://Annoyances.org/vista )
;
; restart Windows after applying this patch
; for more information, see http://www.annoyances.org/exec/show/article03-202
;

[HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}]
@="CompressedFolder"

[HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}\DefaultIcon]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,7a,00,69,00,\
70,00,66,00,6c,00,64,00,72,00,2e,00,64,00,6c,00,6c,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}\Implemented Categories]

[HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}\Implemented Categories\{00021490-0000-0000-C000-000000000046}]
@=hex(0):

[HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}\InProcServer32]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,7a,00,69,00,\
70,00,66,00,6c,00,64,00,72,00,2e,00,64,00,6c,00,6c,00,00,00
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}\ProgID]
@="CompressedFolder"

[HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}\ShellFolder]
"Attributes"=dword:200001a0
"UseDropHandler"=""

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}]
@="Cabinet File"

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\CLSID]
@="{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}"

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\DefaultIcon]
@="cabview.dll,0"

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\Implemented Categories]

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\Implemented Categories\{00021490-0000-0000-C000-000000000046}]

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\InProcServer32]
@="cabview.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\Shell]
@="none"

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\Shell\find]
"SuppressionPolicy"=dword:00000080

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\Shell\find\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,45,00,78,00,70,00,6c,00,6f,00,72,00,65,00,72,00,2e,00,65,00,78,00,\
65,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\Shell\find\ddeexec]
@="[FindFolder(\"%l\", %I)]"

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\Shell\find\ddeexec\application]
@="Folders"

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\Shell\find\ddeexec\topic]
@="AppProperties"

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\Shell\Open]

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\Shell\Open\Command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,45,00,78,00,70,00,6c,00,6f,00,72,00,65,00,72,00,2e,00,65,00,78,00,\
65,00,20,00,2f,00,69,00,64,00,6c,00,69,00,73,00,74,00,2c,00,25,00,49,00,2c,\
00,25,00,4c,00,00,00
"DelegateExecute"="{11dbb47c-a525-400b-9e80-a54615a090c0}"

[HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}\ShellFolder]
"Attributes"=dword:680001a0



2. vistazip.reg 파일을 오른쪽 클릭하여 [Merge|병합] 를 클릭.
3. 보안경고창이 뜨면 [Run|실행] 버튼을 클릭.
4. [Continue|계속] (UAC|사용자계정컨트롤) 클릭, [Yes|예], 그리고 프롬프트가 나타나면 [OK|확인].
5. 변경을 적용하기 위해 컴퓨터 재시작.
6. 잘 작동하는지 확인 후 vistazip.reg 파일 삭제.

mule을 svn 에서 다운받아서 빌드를 하다 보니

mvn install -DskipTests

라고 타이핑 하라고 한다.

여기서 -DskipTests 는 처음 보는 속성이므로 이에 대해 찾아봤다.

http://www.mail-archive.com/announce@maven.apache.org/msg00138.html

test 들을 skip 하기위해 "-Dmaven.test.skip" 또는 "-Dmaven.test.skip.exec" 대신
"mvn install -DskipTests" 를 사용할 것을 권장한다. ("=true" 는 붙일 필요 없다)

"maven.test.skip" 는 테스트의 컴파일과 실행을 둘다 skip 하고,
"maven.test.skip.exec" 는 테스트를 컴파일은 하지만 실행은 하지 않는다.
이 두 예전 속성들은 여전히 사용되며
새로운 속성인 -DskipTests 는 "-Dmaven.test.skip.exec" 와 같은 의미로 사용되며 (테스트를 컴파일은 하지만 실행은 하지 않음)
이것은 "-Dmaven.test.skip.exec" 보다 타이핑 하기 쉽다.

이 외에도 skipTests 가 나타난 배경이 또 있을듯 한데 이것만으로 만족~

화요일, 5월 13, 2008

자주 하는 일이 아니기 때문에 할때마다 여기저기 검색해보면서 고생을 하게 된다.
그래서 이번에는 작업하면서 google doc 으로 정리를 해보았다.

http://docs.google.com/Doc?id=ddc6cxk6_1103jmpxzrn

토요일, 12월 22, 2007

Mule

작성자 : 김재탁(gagboy@gmail.com)

The Basics

Container 혹은 Mule Model 이라 불리는 mule 은 한마디로 말해 분배가능한 object 중계자이다.

Container 는 운영되는 object 들 혹은 Universal Message Objects TM 들을 관리한다.

짧게는 UMO 라고 불리는 이런 object 들은 자기자신들과 도는 외부 어플리케이션과 통신을 한다.

여기서 통신 포인트를 "Endpoints" 라고 부른다.

아래 다이어그램은 mule server 콤포넌트들을 간단하게 그려본 것이다.


The Mule Manager

Mule Manager 는 Mule 서버 인스턴스(Node 또는 Mule Node 라고 알려진)의 중심이다.

이것의 가장 중요한 역할은 Mule 인스턴스를 위해 connector, endpoint, transformer 와 같은 다양한 object 들을 관리 하는데 있다.

이러한 object 들은 service/component 들 간의 메세지를 컨트롤 하고, 이 object 들이 다루는 Model 과 Component 들에게 서비스를 제공하는데 사용된다.


The Model

Model 은 component 들이 관리되어지고 실행되어지는 컨테이너이다.

이것은 component 들 간의 메세지의 흐름을 컨트롤하고 threading, lifecycle 그리고 pooling 을 관리한다.

디폴트 MuleModel 은 퍼포먼스와 처리량을 최대로 끌어올릴 수 있는 효율적인 event 기반의 큐잉 모델인 SEDA 기반이다.

이 컨테이너는 transaction 관리, transformation(변환) 이벤트, routing(라우팅), 이벤트 상관 관계, 로깅, 감시 그리고 관리 등의 UMO component 들을 위해 서비스 범위를 제공한다.

Mule 는 object 생성을 관리로 부터 분리했다. 이것이 뜻하는 것은 Spring, PicoContainer 또는 Plexus 와 같은 유명한 IoC/DI 컨테이너가 UMO component 들을 생성하는데 사용되도록 한다는 것이다.


UMO Components

Universal Message Object TM 를 의미하는 UMO 는 어느곳에서라도 event 를 보내고 받을 수 있는 object 이다.

UMO component 는 비즈니스 오브젝트이다. 이것들은 들어오는 이벤트에서 비즈니스 로직을 실행하는 콤포넌트들이다.

이러한 컴퍼는트들은 어떤 Mule 관련 코드도 필요 없는 표준 JavaBean 들이다.

Mule 은 component 의 설정에 기반하여 object 들 간의 라우팅과 변환을 처리한다.


Endpoints

Endpoint 는 Mule 의 통신력에 있어서 매우 중요하다. Endpoint 는 두개 혹은 그 이상의 어플리케이션 혹은 저장소 component 들간의 통신 채널을 정의한다.

Endpoint 는 어떤 프로토콜의 오브젝트간의 대화도 통합된 방법으로 할 수 있도록 하는 강력한 기능을 제공한다. Endpoint 는 Endpoint 를 통해서 누가 어떤 그리고 어떻게 메세지들을 받고 혹은 보내는지를 컨트롤 하기 위해서 message filter 들, security interceptor 들 그리고 transaction 정보로 구성된다. 더 자세한 정보를 얻으려면 Mule Endpoints 를 보아라.


External Applications

External application(외부 어플리케이션) 은 어플리케이션 서버 에서 부터 기간계 급여 시스템, 메인프레임 트레이딩 어플리케이션, 클라이언트 어플리케이션 까지 어떤 것도 될 수 있다.

기본적으로 데이타를 제공 혹은 소비할 수 있는 길이 있는 어떤 어플리케이션도 External application 이 될 수 있다는 뜻이다.

Mule 이 endpoint 들을 통해 통신을 처리하기 때문에, UMO component 들은 '어떤 어플리케이션이 데이타를 생산하는가?', '어플리케이션이 어디에 위치해 있는가?', '어떤 전송 프로토콜을 사용하는가?' 에 대한 정보를 가지고 있지 않다.

Mule Objects

Mule 에서 사용되는 전문용어는 약간의 혼란을 가져올 수 있지만, 그 혼란은 아주 간단히 없앨 수 있다.


Object Term Description
Transport transport 또는 "provider", 는 Mule 이 특정한 종류의 전송 혹은 프로토콜을
핸들링 할 수 있도록 지원해주는 오브젝트들을 말한다.
예를 들면 "Email Provider" 는 Mule 이 SMTP, POP 그리고 IMAP 프로토콜을 통해 메세지를 주고 받는것을 가능하게 한다.
Connector connector 는 endpoint 쪽에서 메세지를 주고 받는 object 를 말한다.
Connector 들은 특정 transport 혹은 Porvider 의 일부인 번들로 제공된다.
예를 들어, FileConnector 는 파일 시스템의 파일들을 읽고 쓸수 있다.
Router router 는 connector 에 의해 받은 혹은 connector 에 의해 발송 되어지기 전의 메세지에 어떤 일을 하는 object 를 말한다.
Filter filter 는 connector 로 부터 들어오는 혹은 나가는 메세지를 선택적으로 필터링을 한다. 예를 들면, File Provider 는 파일 이름 패턴 에 의해 어떤 파일을 connector 가 읽을지 제한하는 FilenameWildcardFilter 와 함께 쓰게 된다. Filter 들은 Router 들과 함께 사용된다.
Transformer transformer 는 incoming 또는 outgoing 메세지들을 어떤 방식으로 선택적으로 변환한다.
예를 들어, BytearrayToString transformer 는 byte array 를 String 오브젝트로 변환한다.

금요일, 12월 21, 2007

목요일, 12월 20, 2007

Quartz - Quartz 1 - CronTriggers Tutorial


작성자 : 김재탁(gagboy@gmail.com)

이 튜토리얼의 일부 내용은 Quartz 1.4.2 javadoc 의 CronTrigger 에서 가져왔다.

Introduction

cron 은 오랜시간동안 사용되어진 UNIX 툴이다. 즉 cron 의 스케쥴링 능력은 강력하고 입증된 것이다.

만약에 SimpleTrigger 의 정확한 간격에 의해 실행되는 schedule 이 아닌, 달력과 같은 개념을 바탕으로 작업을 실행시키는 schedule 을 필요로 한다면, SimpleTrigger 보다는 CronTrigger 가 더 어울릴 것이다.

CronTrigger 로는 "매일 금요일 정오", 또는 "매평일(토,일 제외) 9:30분 마다", 또는 "매 월, 수, 금 의 오전 9시~오전 10시 사이에 매 5분마다" 와 같은 스케쥴을 정의 할 수 있다.

또한, SimpleTrigger 와 같이, CronTrigger 는 schedule 의 효력이 시작되는 startTime 과 schedule 이 중지 되는 (optional) endTime 를 설정할 수도 있다.

Format

Cron-Expressions 은 공백으로 분리되는 6~7 개의 문자열로 구성된다. 각 필드들은 어떤 allowed values(허락된 값 - 아래 표 참조) 값도 가지고 있을수 있으며, allowed special characters(허락된 특수문자 - 아래 표 참조) 와 함께 다양한 조합을 만들수 있다:


Field Name Mandatory? Allowed Values Allowed Special Characters
Seconds YES 0-59 , - * /
Minutes YES 0-59 , - * /
Hours YES 0-23 , - * /
Day of month YES 1-31 , - * ? / L W C
Month YES 1-12 or JAN-DEC , - * /
Day of week YES 1-7 or SUN-SAT , - * ? / L C #
Year NO empty, 1970-2099 , - * /


cron 표현식은 다음과 같은 모양이 될수 있다: * * * * ? *
혹은 다음과 같이 더욱 복잡하게되 표현된다: 0 0/5 14,18,3-39,52 ? JAN,MAR,SEP MON-FRI 2002-2010

Special characters

  • * ("all values") 모든값 - 해당 필드의 모든 값. 예를들어 minutes 필드의 "*" 는 "매분" 을 의미한다.
  • ? ("no specific value") 값 정의 안함 - day-of-month 와 day-of-week 에 사용할 수 있다. 이것은 두 필드중 한 필드는 사용하지 않고 다른 한 필드만 사용하려고 할때 유용하다. 예를들어 무슨 요일에 상관 없이 매달 10일에 실행시키고 싶다면 day-of-month 필드에 "10" 을 적고 day-of-week 필드에 "?" 을 적으면 된다. 좀더 명확하게 알고 싶으면 아래 예제를 보도록 한다.
  • - - 범위를 기술한다. 예를들어 Hour 필드의 "10-12" 는 "10, 11, 12 시" 를 의미한다.
  • , - 추가적인 값들을 기술한다. 예를들어 day-of-week 필드의 "MON,WED,FRI" 는 "월요일, 수요일, 금요일" 을 의미한다.
  • / - 증가값을 정의할 때 사용된다. 예를들어, '0/15' 를 Minutes 필드에 기술하면, 이것은 '0 분에서 시작해서 매 15분 마다' 를 의미한다. 만약 '3/20' 을 Minutes 필드에 기술 했다면 이것은 '3분에서 시작해서 그 시간내의 매 20분 마다' 를 의미한다. - 다르게 말하자면 Minutes 필드에 '3,23,43' 이라고 적은것과 같다. '*' 뒤에 '/' 를 사용 할 수도 있다 - 이것은 '/' 전에 0을 가지는 것과 같다. day-of-month 필드의 '1/3' 은 "달의 첫번째 날에서부터 시작하여 매 3일 마다" 를 의미한다.
  • L ("last") - day-of-month 와 day-of-week 에서만 사용 될 수 있다. 이것은 마지막을 의미하는 "last" 의 짧은 표현이지만, 각 두 필드에서는 서로 다른 의미를 가지고 있다. 예를들어 day-of-month 의 "L" 필드는 "월의 마지막 일자" - 즉, 1월에는 31일, 평년(윤년이 아닌) 의 2월에는 28일을 의미한다. 만약 day-of-week 필드에 독립적으로 사용한다면 이것은 "7" 혹은 "SAT" 를 의미한다. 그러나 day-of-week에 다른 값 뒤에 사용된다면 이것은 "해당월의 마지막 XX요일" 을 의미하게 된다 - 예를들어 "6L" 또는 "FRIL" 은 "월의 마지막 금요일" 을 말하게 되는것이다. "L" 옵션을 사용할때 혼란스러운 결과를 얻지 않으려면 list 나 range(범위) 값을 지정하지 말아야 한다.
  • W ("weekday") - 주어진 날짜의 가장 가까운 평일(월~금) 을 정의할때 사용된다. 예를들어, day-of-month 필드에 "15W" 라고 정의했다면 이것은 "해당월의 15 일에 가장 가까운 평일" 을 의미한다. 그러므로 만약 15일이 토요일이라면 trigger 는 금요일인 14일에 실행되며, 15일이 일요일이라면 trigger 는 월요일인 16일에 실행되게 되며, 15일이 화요일이라면 15일에 실행되게 된다. 반면에 day-of-month 필드에 "1W" 라고 정의했고 1일이 토요일이라면, 트리거는 월요일인 3일에 실행된다. 즉 'W' 는 월의 경계를 넘지 않는다. 'W' 문자는 day-of-month 필드가 범위나 리스트가 아닌 하나의 날짜 일때만 사용 될 수 있다.

'L' 과 'W' 문자는 day-of-month 필드에 'LW' 로 함께 쓰일수 있다. 이것은 "월의 마지막 평일" 을 의미한다.

  • # - day-of-week 필드에만 사용될 수 있으며 월의 "몇번째" X요일 을 정의할때 사용된다. 예를들어 day-of-week 필드의 "6#3" 또는 "FRI#3" 은 "월의 세번째 금요일" 을 의미한다. 다른 예제로 "4#5" = 는 5번째 수요일을 의미하는데 만약 해당 월에 5번째 수요일이 없다면 이것은 실행되지 않는다.
  • C ("calendar") 아직 지원 안되는 기능 - 이것은 연관된 Calendar(달력) 으로부터 값이 계산되어 진다는 것을 의미한다. if any. If no calendar is associated, then it is equivalent to having an all-inclusive calendar. A value of "5C" in the day-of-month field means "the first day included by the calendar on or after the 5th". A value of "1C" in the day-of-week field means "the first day included by the calendar on or after Sunday".

months 필드와 days of the week 필드의 케릭터들은 대소문자를 구분하지 않는다. 즉 MON 은 mon 과 같다.

Examples

여기 모든 예제가 있다:

표현식 의미
0 0 12 * * ? 매일 정오에 실행
0 15 10 ? * * 매일 10:15am 에 실행
0 15 10 * * ? 매일 10:15am 에 실행
0 15 10 * * ? * 매일 10:15am 에 실행
0 15 10 * * ? 2005 2005년일 동안 매일 10:15am 에 실행
0 * 14 * * ? 매일 2pm 에서 2:59pm 까지 매분마다 실행
0 0/5 14 * * ? 매일 2pm 에서 2:55pm 까지 5분마다 실행
0 0/5 14,18 * * ? 매일 2pm 에서 2:55pm 까지 5분마다 실행 그리고 매일 6pm 에서 6:55pm 까지 5분마다 실행
0 0-5 14 * * ? 매일 2pm 에서 2:05pm 까지 매분마다 실행
0 10,44 14 ? 3 WED 3월의 모든 수요일에 2:10pm 과 2:44pm 에 실행
0 15 10 ? * MON-FRI 매 월요일, 화요일, 수요일, 목요일, 금요일의 10:15am 에 실행
0 15 10 15 * ? 매월 15일의 10:15am 에 실행
0 15 10 L * ? 매월 마지막날의 10:15am 에 실행
0 15 10 ? * 6L 매월 마지막 금요일의 10:15am 에 실행
0 15 10 ? * 6L 매월 마지막 금요일의 10:15am 에 실행
0 15 10 ? * 6L 2002-2005 2002, 2003, 2004, 그리고 2005 년의 매월 마지막 금요일의 10:15am 에 실행
0 15 10 ? * 6#3 매월 세번째 금요일의 10:15am 에 실행
0 0 12 1/5 * ? 달의 첫번째 날에서 부터 5일 마다 12pm(정오)에 실행
0 11 11 11 11 ? 매 11월 11일의 11:11am 에 실행

day-of-week and day-of-month 필드의 "?" 과 "*" 의 효과를 주의 깊게 보라.

Notes

  • 'C' 문자에 대한 기능이 아직 완성되지 않았다.
  • day-of-week 와 a day-of-month 모두에게 값을 정의하는 기능이 아직 완성되지 않았다 (지금은 두 필드중 한곳에 반드시 "?" 를 적어줘야 한다).
  • 자정에서 1:00 AM 사이에 실행되도록 설정할 때는 주의하라 - "daylight savings(서머타임)" 에 의해 시간이 앞으로 가거나 뒤로 가는것 때문에 실행을 반복하거나 건너 뛸 수 있다.

목요일, 5월 24, 2007

AppFuse QuickStart

AppFuse QuickStart

To start developing Java EE applications with AppFuse 2.x, please following the instructions below:

목차

  1. 새 프로젝트를 만든다.
  2. 새 프로젝트를 구동 시킨다.
  3. 즐겨라.

새 프로젝트를 만든다

  1. JDK 5+ 를 Download 하고 설치 한다.
  2. MySQL 5.x 를 Download 하고 설치 한다.
  3. 로컬(자신의 컴퓨터)에 SMTP server 를 셋업 하거나 다른 hostname(기본적으로 localhost 로 설정되어있다) 을 사용하려면 mail.properties (src/main/resources 안에 있는) 를 수정한다.
  4. Maven 2.0.6 을 Download 하고 install 한다.
    만약 command-line 보다는 Eclipse 에서 프로젝트를 만들길 원한다면 Candy for AppFuse 검토해 보도록 하라.
  5. AppFuse 는 몇몇 다른 특징을 가지고 나왔다. 사용자로서의 여러분의 경험을 최적화하고 심플하게 하기 위하여, 우리는 다수 다른 프로젝트 archetype(starter project) 들을 만들었다. 현재 'basic' 그리고 'modular' 두가지 타입의 AppFuse archtype 이 있다.
    basic archetype 들은 웹 어플리케이션으로만 제공되어질 프로젝트를 만들때 이상적이다.
    "core" 와 "web" 모듈로 이루어져 있는 modular archtype 들은 재사용 가능한 백엔드를 필요로 하는 프로젝트를 만들때 이상적이다.
    이러한 프로젝트를 만드는 명령의 리스트가 아래에 있다. 반드시 groupId 를 여러분의 package 명으로, artifactId 를 여러분의 프로젝트 이름으로 바꾸어야 한다.
    archetype 을 만들때 보게 되는 warning(경고) 메세지들은 예정된 메세지들이다. 만약 마지막에 BUILD SUCCESSFUL 메세지를 보게 된다면 프로젝트는 성공적으로 만들어 진것이다.





    Archetype Command
    JSF Basic mvn archetype:create -DarchetypeGroupId=org.appfuse -DarchetypeArtifactId=appfuse-basic-jsf -DremoteRepositories=http://static.appfuse.org/repository -DarchetypeVersion=2.0-m5 -DgroupId=com.mycompany.app -DartifactId=myproject
    Spring MVC Basic mvn archetype:create -DarchetypeGroupId=org.appfuse -DarchetypeArtifactId=appfuse-basic-spring -DremoteRepositories=http://static.appfuse.org/repository -DarchetypeVersion=2.0-m5 -DgroupId=com.mycompany.app -DartifactId=myproject
    Struts 2 Basic mvn archetype:create -DarchetypeGroupId=org.appfuse -DarchetypeArtifactId=appfuse-basic-struts -DremoteRepositories=http://static.appfuse.org/repository -DarchetypeVersion=2.0-m5 -DgroupId=com.mycompany.app -DartifactId=myproject
    Tapestry Basic mvn archetype:create -DarchetypeGroupId=org.appfuse -DarchetypeArtifactId=appfuse-basic-tapestry -DremoteRepositories=http://static.appfuse.org/repository -DarchetypeVersion=2.0-m5 -DgroupId=com.mycompany.app -DartifactId=myproject
    JSF Modular mvn archetype:create -DarchetypeGroupId=org.appfuse -DarchetypeArtifactId=appfuse-modular-jsf -DremoteRepositories=http://static.appfuse.org/repository -DarchetypeVersion=2.0-m5 -DgroupId=com.mycompany.app -DartifactId=myproject
    Spring MVC Modular mvn archetype:create -DarchetypeGroupId=org.appfuse -DarchetypeArtifactId=appfuse-modular-spring -DremoteRepositories=http://static.appfuse.org/repository -DarchetypeVersion=2.0-m5 -DgroupId=com.mycompany.app -DartifactId=myproject
    Struts 2 Modular mvn archetype:create -DarchetypeGroupId=org.appfuse -DarchetypeArtifactId=appfuse-modular-struts -DremoteRepositories=http://static.appfuse.org/repository -DarchetypeVersion=2.0-m5 -DgroupId=com.mycompany.app -DartifactId=myproject
    Tapestry Modular mvn archetype:create -DarchetypeGroupId=org.appfuse -DarchetypeArtifactId=appfuse-modular-tapestry -DremoteRepositories=http://static.appfuse.org/repository -DarchetypeVersion=2.0-m5 -DgroupId=com.mycompany.app -DartifactId=myproject
    Core (backend only) mvn archetype:create -DarchetypeGroupId=org.appfuse -DarchetypeArtifactId=appfuse-core -DremoteRepositories=http://static.appfuse.org/repository -DarchetypeVersion=2.0-m5 -DgroupId=com.mycompany.app -DartifactId=myproject

    만약 MySQL 5.x 데이타베이스가 설치 되어 있고 root 계정을 패스워드 없이 접근할 수 있도록 되어 있다면 AppFuse 를 바로 구동시켜 볼 수 있다. 만약 embedded database 를 사용하는걸 선호한다면, 우리가 최근에 추가한 H2, HSQLDB, 등등.. 을 위한 Database Profiles 가 있다.

MySQL 보안
패스워드 없는 root 로 MySQL 을 작동시키는것은 보안상 해서는 안될 행동이다. 여러분의 데이타베이스가 만들어진 다음에는 다음 명령을 통해 root 패스워드를 변경할수 있다:
    mysql --user=root --pass='' mysql -e "update user set password=password('newpw') where user='root'; flush privileges;"

AppFuse 는 기본적으로 username "root" 에 빈 password 를 사용한다. 이런 값을 변경하려면 여러분 프로젝트의 pom.xml 파일의 아래쪽에 있는 <jdbc.username> 과 <jdbc.password> 속성값을 수정해야 한다.


어플리케이션을 구동 시킨다

이제 AppFuse 를 구동시키는것은 쉽다. archetype 프로젝트가 한번 만들어 지면, Maven 은 hibernate3 를 이용하여 테이블들을 만들고 dbunit 을 이용하여 샘플 데이타를 넣었을 것이다. 이제 여러분이 할 일은 Jetty 컨테이너를 구동시키고 여러분의 어플리케이션을 보는일 뿐이다.

  1. JAR 파일들과 Tomcat 을 다운로드 하고 여러분의 프로젝트를 통합 테스트를 하기 위해, 콤멘드 라인에서 프로젝트 디렉토리로 이동(cd) 하고 mvn integration-test 명령을 실행한다. 이제 담배(^^)나 한대 피고 오도록 하자~. 모든것을 다운로드 하고 테스트 하는데는 약 5~10분정도 걸린다.
  2. 여러분의 어플리케이션을 보려면 프로젝트 디렉토리에서 mvn jetty:run-war 명령을 실행하면 된다. Maven 은 Jetty 서버를 시작시킬것이고 브라우져 를 열고 http://localhost:8080 으로 이동하면 여러분은 여러분의 어플리케이션을 볼 수 있을 것이다. 만약 modular archetype 을 사용 한다면, mvn jetty:run-war 명령을 여러분 프로젝트의 web 디렉토리에서 실행시켜야 한다.
    관리 계정을 위한 기본 username/password 는 admin/admin 이고 일반 유저는 user/user 이다.
  3. AppFuse 로 부터 파일들을 덮어쓰려면 mvn war:inplace 명령을 실행하라. 이것은 의존되는 WARs 를 여러분이 직접 파일들을 수정할 수 있는 src/main/webapp 디렉토리에 추출할 것이다. source tree 에 war 가 풀려지면 mvn jetty:run 을 실행할 수 있다. 이것은 즉석에서 파일들을 수정할수 있게 하며, Jetty 는 수정된 파일들을 필요에 따라서 reload 할 것이다. 이 방식의 단 한가지 문제점은 프로젝트 안에 "풀어진 AppFuse" 는 업그레이드 하기 힘들다는 것이다. 우리는 mvn war:inplace 를 실행하기 전에 여러분의 프로젝트를 source control (cvs or svn, etc..) 에 올리길 권고한다. 이 방법이, 어떤 것을 checked in (덮어쓰기) 하고 무엇을 삭제 해야 할지 결정 하기 쉽게 해준다. 만약 jetty:run 을 실행할때 OutOfMemory 에러가 생긴다면, 이 메일링 리스트 쓰레드 를 보아라.
개발 환경
AppFuse 기반의 어플리케이션을 개발하기 위해 어떻게 컴퓨터를 세팅해야 하는지에 대한 자세한 설명을 위해 개발 환경 설정 을 보아라.

데이타베이스 설정 변경
MySQL 데이타베이스 세팅을 바꾸려면, 간단히 pom.xml 하단에 있는 <jdbc.*> 프로퍼티들을 바꿔주면 된다. MySQL 이 아닌 다른 데이타 베이스를 사용 하려면 Database Profiles 을 보도록 하라.

여러분의 어플리케이션을 개발하라

여러분은 Eclipse, IDEA 또는 NetBeans 를 사용하여 여러분의 어플리케이션을 개발할 수 있습니다. Eclipse 를 쓴다면, project file 을 생성하기 위해 mvn install eclipse:eclipse 을 실행하면 됩니다. IDEA 는, mvn idea:idea 을 실행하면 됩니다. IDE Reference Guide 에서 더 많은 설명을 볼 수 있다.

Tutorials 은 여러분의 어플리케이션 개발을 시작하는데 도움을 줄 것이다.