13.07.2015 Views

9.12.CRUD 소스 코드 생성 - Anyframe

9.12.CRUD 소스 코드 생성 - Anyframe

9.12.CRUD 소스 코드 생성 - Anyframe

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Anyframe</strong>Version 5.1.0저작권 © 2008-2011 삼성SDS본 문서의 저작권은 삼성SDS에 있으며 <strong>Anyframe</strong> 오픈소스 커뮤니티 활동의 목적하에서 자유로운 이용이 가능합니다. 본 문서를 복제, 배포할경우에는 저작권자를 명시하여 주시기 바라며 본 문서를 변경하실 경우에는 원문과 변경된 내용을 표시하여 주시기 바랍니다. 원문과 변경된문서에 대한 상업적 용도의 활용은 허용되지 않습니다. 본 문서에 오류가 있다고 판단될 경우 이슈로 등록해 주시면 적절한 조치를 취하도록하겠습니다.


<strong>Anyframe</strong>VI. App. Server Configurations ...................................................................................... 13318. WebLogic .................................................................................................... 13418.1. core plugin 사용 시 ............................................................................ 13418.2. cxf plugin 사용 시 .............................................................................. 13618.3. hibernate plugin 사용 시 ..................................................................... 13918.4. tiles plugin 사용 시 ............................................................................ 13919. JEUS ......................................................................................................... 14119.1. IAM plugin 사용 시 ............................................................................ 14119.2. cxf plugin 사용 시 .............................................................................. 14120. JBoss ........................................................................................................ 14220.1. core plugin 사용 시 ............................................................................ 142iv


I.Introduction<strong>Anyframe</strong>은 Spring 기반에서 다양한 best-of-breed 오픈 소스를 통합 및 확장하여 구성한 어플리케이션 프레임워크,MVC 아키텍처를 준수하여 웹 어플리케이션의 프리젠테이션 레이어를 구조적으로 개발할 수 있도록 지원하는 웹프레임워크를 제공하며 프레임워크 기반의 업무용 프로그램 개발을 효과적으로 진행할 수 있도록 기술 공통 서비스, 템플릿 기반의 프로젝트 구조 및 샘플 코드, 매뉴얼 등을 제공한다. 또한 Eclipse Plugin 형태의 <strong>Anyframe</strong> IDE를 제공함으로써 기존 방식보다 훨씬 쉽고 빠르게 <strong>Anyframe</strong> 기반 개발 환경을 구성할 수 있도록 Scaffolding, 코드생성 기능 등을 지원한다.


1.Overview<strong>Anyframe</strong>은 오픈 소스 어플리케이션 개발 Framework로 다음과 같은 특징을 가지고 있다.• 순수 객체 중심의(POJO) 어플리케이션 개발 지원 : 프레임워크로 인해서 기본 설계와 상세 설계가이중으로 진행되거나, 개발 시 설계 모델이 구현체와 불일치 되는 것을 줄이기 위해 순수 객체 중심의(POJO) 어플리케이션 개발을 지원한다.• Dependency Injection을 통한 의존 관계 처리 : 인터페이스 중심의 개발을 가이드하고 객체나 컴포넌트간의 참조 관계는 Dependency Injection을 통해 처리함으로써 구현체의 변경에 따른 영향력을최소화한다.• 개발자는 비즈니스 로직에만 집중하여 구현 : 로깅, 트랜잭션, 예외처리 등과 같은 비기능 영역에 대한 코드가 업무 기능 개발 영역에서 분리될 수 있도록 함으로써, 개발자는 비즈니스 로직에만 집중하여 구현할 수 있다.• Singleton, Factory 패턴 등 유용한 패턴 실행 지원 : 직접적인 패턴 구현 없이도 Singleton, Factory 패턴 등의 실행을 지원함으로써, 어플리케이션 개발시 인스턴스의 생성 관리, 데이터 무결성 확보 등을 위해 유용한 패턴 등을 직접 구현하는 어려움을 해결해준다.• MVC Model2 아키텍처 가이드 : Layered Architecture에 기반한 Java EE 웹 어플리케이션을 작성할때 프리젠테이션 로직과 비지니스 로직을 완전히 분리하여 프리젠테이션 레이어를 구조적으로 개발할 수 있다.<strong>Anyframe</strong>은 아래와 같은 기능을 제공한다.• 오픈 소스 통합 및 Best Practice 제공을 위한 플러그인 환경 제공 : 사용자가 원하는 Plugin 들을 적절히 선택하고 설치함으로써 해당 프로젝트에 최적화된 샘플 프로젝트를 손쉽게 구성할 수 있도록지원한다. 자세한 내용은 Plugin 구조를 참고하도록 한다.• 재사용 가능한 기술 공통 서비스 제공 : DB 접근 및 SQL 처리, 캐쉬, WAS와 연동 등과 같은 중요 기능에 대해 재사용 가능한 기술 공통 서비스를 제공함으로써 보다 빠르고 안정적인 개발을 지원한다.• 선언적으로 트랜잭션 통제 : Java EE 환경과 독립적으로 JTA이나 JDBC 데이터 소스에 대해 별도의트랜잭션 처리를 위한 코딩없이 간단한 설정만으로 선언적으로 트랜잭션을 통제할 수 있는 기능을지원한다.• 웹 화면 개발 시 필요한 공통 기능 제공 : 어플리케이션 개발에 공통적으로 필요한 화면흐름 제어,에러처리, 일원화된 권한처리 등 다양한 부분을 프레임워크화하여 Model2 방식의 일관되고 쉬운 개발을 지원한다.• 다양한 웹 클라이언트 기술과 용이한 연계 가능 : 최근 관심이 높아지고 있는 Ajax, 상용 X-internet 툴등 다양한 웹 클라이언트 기술과 쉽게 연동되는 구조를 제공한다.또한 <strong>Anyframe</strong> 기반으로 프로젝트 수행 시, 개발자들의 개발 편의성을 극대화할 수 있도록 <strong>Anyframe</strong>설치, 프로젝트 생성 및 코드 생성 기능을 포함한 <strong>Anyframe</strong> IDE를 제공한다. Command Line Interface혹은 Eclipse Plugin 형태의 <strong>Anyframe</strong> IDE를 통해 <strong>Anyframe</strong> 설치에서부터 프로젝트 구조, 코드 생성, 빌드 수행에 이르기까지 개발 프로세스 전반에 걸쳐 도움을 받을 수 있다.2


2.License<strong>Anyframe</strong> Java는 라이센스 정책으로 Apache Licence, Version 2.0을 채택한다. 단, <strong>Anyframe</strong> 내에서 사용된 외부 오픈 소스의 경우 원 오픈 소스의 라이센스 정책을 따른다.http://www.apache.org/licenses/LICENSE-2.03


3.기술 지원<strong>Anyframe</strong>에 대한 기술 지원은 <strong>Anyframe</strong> 오픈소스 커뮤니티 사이트( http://www.anyframejava.org/ )의포럼 [http://www.anyframejava.org/forum] 메뉴를 통해 이루어지며, 단순 질의 응답에서부터 소스 코드에 대한 구체적인 가이드 및 해결책을 제시한다. 특정 프로젝트를 위한 기술 컨설팅 지원이 필요한 경우 <strong>Anyframe</strong> 오픈소스 커뮤니티 사이트의 연락처 [http://www.anyframejava.org/about/contactus] 를통해 요청할 수 있다. 또한, 이슈관리시스템인 JIRA( http://dev.anyframejava.org/jira/ )를 통해, BugFix, Improvements, New Features 에 대한 이슈들을 요청할 수 있다. 자세한 사용방법은 이곳 [http://www.anyframejava.org/development/issue] 을 참조하도록 한다.4


4.유지 보수<strong>Anyframe</strong> 오픈소스 커뮤니티 사이트( http://www.anyframejava.org/ )를 통해 릴리즈된 최신버전 및 이전 버전에 해당하는 라이브러리, 매뉴얼 등을 제공받을 수 있으며 패치 및 업그레이드되는 파일의 경우에도 오픈소스 커뮤니티 사이트를 통해 제공된다. 오픈소스 커뮤니티 사이트의 첫페이지를 통해서공지되므로 필요 시 참조하도록 한다.5


5.시스템 사양하드웨어와 소프트웨어 요구 사항은 다음 테이블에 작성되어 있다. 아래 작성된 하드웨어 사양 이하의 시스템에서도 <strong>Anyframe</strong>을 사용할 수 있으나, 빠른 성능을 위해서는 아래 사양을 권고한다. 또한 아래 작성된 Storage의 경우, <strong>Anyframe</strong> 전체 설치 파일에서부터 Eclipse, Tomcat, MiPlatform 등 모든 관련 파일 설치를 합하여 작성된 것으로 <strong>Anyframe</strong> 만으로는 1GB 이하의 용량을 차지하고 있다. 소프트웨어 요구 사항은 반드시 충족시켜줘야 한다.아래 하드웨어 요구 사항은 <strong>Anyframe</strong> IDE Eclipse Plugin을 사용할 때 권고되는 사양으로, <strong>Anyframe</strong> IDE를 사용하지 않고 <strong>Anyframe</strong> 기반의 어플리케이션 개발 시에는 아래 하드웨어 요구 사항을 따르지 않고,제시된 사양에 비해 저사양에서 <strong>Anyframe</strong>을 사용할 수도 있다.표 5.1. System Requirements(HW)HardwareRequirementsMemoryStorageDescription1024MB RAM 이상1GB 하드 디스크 공간표 5.2. System Requirements(SW)SoftwareRequirementsJDKEclipse IDEDescription1.5.x VersionEclipse 3.3.x Version 이상 지원(Europa/Ganymede/Galileo)6


II.Installation<strong>Anyframe</strong>은 4.6.0 이후부터 오픈 소스 기반으로 어플리케이션을 개발할 때 요구되는 다양한 오픈 소스들이 통합된템플릿 기반의 프로젝트 구조 및 샘플 코드를 Maven/Ant를 이용하여 자동으로 구성할 수 있도록 지원한다. 이로인해, 어플리케이션 개발 초기에 프로젝트 특성에 맞는 개발 환경을 구성하는데 소요되는 시간을 대폭 줄이고, 프로젝트에 필요한 최적의 샘플을 제공받을 수 있게 될 것이다.


6.Maven본 장에서는 해당 프로젝트에서 빌드 도구로써 Maven을 채택한 경우 CLI를 이용하여 <strong>Anyframe</strong> 기반의개발 환경을 쉽게 구성하는 방법에 대해 설명하고자 한다. Maven을 기반으로 개발 환경을 구성하려면다음과 같은 순서로 작업을 진행한다.• Maven 설치 및 환경 설정• 프로젝트 구조 생성• Plugin 설치• 어플리케이션 실행6.1.Maven 설치 및 환경 설정여기서는 빌드 도구로 Maven을 사용할 경우, 본격적인 <strong>Anyframe</strong> 기반의 개발 환경 구성 전에 선행되어야 하는 작업들에 대해 설명하고자 한다.Maven(http://maven.apache.org/) [http://maven.apache.org/] 은 POM(Project Object Model) 정보를기반으로 대상 프로젝에 대한 빌드, 리포팅, 문서화 등을 지원하는 오픈소스 툴이다. 먼저 Maven을 설치한 후, <strong>Anyframe</strong> 설치를 위한 환경 설정 방법에 대해 알아보도록 하자.1. <strong>Anyframe</strong> 설치 대상 PC에 Maven이 설치되어 있지 않은 경우, Maven을 설치하도록 한다. (본문서에서는 Maven Ver.2.2.1을 기반으로 설치 작업을 진행할 것이다.) Maven 사이트 [http://maven.apache.org/] 로부터 Maven(apache-maven-2.2.1-bin.xxx)을 다운로드받은 후, 원하는 위치에압축을 해제한다.2. 설치된 Maven을 기반으로 <strong>Anyframe</strong> 설치 작업을 진행할 때, <strong>Anyframe</strong> Repository(http://dev.anyframejava.org/maven/repo)로부터 참조 라이브러리를 다운로드할 수 있도록 하기 위해[MAVEN 설치 폴더]/conf/settings.xml 파일을 열고 다음과 같이 속성을 추가로 정의해준다.(settings.xml 파일 다운로드를 원할 경우 여기를 참조한다.)myprofileanyframe-repositoryhttp://dev.anyframejava.org/maven/repotrueanyframe-pluginrepository for <strong>Anyframe</strong>http://dev.anyframejava.org/maven/repocentralInternal Mirror of Central Plugins Repositoryhttp://www.ibiblio.org/maven2/pluginsremote8


MavenInternal Mirror of Central Plugins Repositoryhttp://repo1.maven.org/maven2중략...myprofile3. 작업 대상 PC에서 MAVEN을 인식할 수 있도록 하기 위해서 시스템 변수로 MAVEN_HOME을 추가하고, [MAVEN 설치 폴더]를 값으로 지정해준다.또한 시스템 변수 PATH에 다음과 같이 '%MAVEN_HOME%/bin' 을 추가한다.4. 설치 및 환경 설정 작업이 완료되었다면 Maven이 성공적으로 설치되었는지 확인해 보도록 하자.Command 창을 띄우고 mvn -version 과 같이 명령어를 입력하여 다음과 같은 정보가 에러없이 표시되는지 확인한다.5. 이제 Maven 기반에서 Command Line Interface를 활용하여 <strong>Anyframe</strong> 기반 개발 환경 구성이 가능해졌다.6.2.프로젝트 구조 생성<strong>Anyframe</strong> 기반의 개발 환경 구성을 위해서, 먼저 프로젝트의 기본 구조를 생성해보자. Command 입력창을 열고 다음과 같이 Maven Command를 입력하여 anyframe-basic-archetype을 설치한다. (<strong>Anyframe</strong>Archetype에 대한 자세한 내용은 본 매뉴얼의 Archetype 설명을 참고하도록 한다.)mvn archetype:generate-DarchetypeCatalog="http://dev.anyframejava.org/maven/repo/archetype-catalog.xml"위와 같이 명령어를 입력하면 Command 창에 archetypeCatalog 속성값으로 정의된 http://dev.anyframejava.org/maven/repo/archetype-catalog.xml 파일 내에 정의된 Maven Archetype 목록이 제시될 것이다. 제시된 Maven Archetype 목록 중 최신 anyframe-basic-archetype에 해당하는 번호('1')를선택한다. 등록된 anyframe-basic-archetype의 버전이 여러개일 경우 버전을 선택할 수 있도록 버전 목록이 제시된다. 여기서는 최신 버전인 5.1.0을 선택할 것이다.9


MavenChoose archetype:1: http://dev.anyframejava.org/maven/repo/archetype-catalog.xml ->org.anyframe.archetype:anyframe-basic-archetype (anyframe basic archetype (latest stable5.1.0))2: http://dev.anyframejava.org/maven/repo/archetype-catalog.xml ->org.anyframe.archetype:anyframe-service-archetype (anyframe service archetype (lateststable 2.1.0))3: http://dev.anyframejava.org/maven/repo/archetype-catalog.xml ->anyframe.archetype:anyframe-basic-archetype (-)Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 1샘플 프로젝트 생성을 위해 다음과 같이 각 인자에 대한 값을 입력한다.Define value for property 'groupId': : myappDefine value for property 'artifactId': : myprojectDefine value for property 'version': 1.0-SNAPSHOT: 1.0.0Define value for property 'package': myapp: anyframeConfirm properties configuration:groupId: myappartifactId: myprojectversion: 1.0.0package: anyframeY: y입력한 속성값을 기반으로 'myproject'라는 이름의 샘플 프로젝트가 생성될 것이다. 다음 그림은anyframe-basic-archetype 설치를 통해 구성된 샘플 프로젝트의 기본 모습이다.이제 생성한 프로젝트 디렉토리로 이동하여 계속해서 <strong>Anyframe</strong>에서 제공하는 다양한 Plugin을 설치할수 있다.cd myproject6.3.Plugin 설치<strong>Anyframe</strong> 4.6.0 이후부터는 다양한 오픈 소스들이 통합된 템플릿 기반의 샘플 코드, 참조 라이브러리집합을 plugin이라 칭하며, 다양한 유형의 plugin을 제공한다.여기서는 <strong>Anyframe</strong>의 다른 plugin이 동작하는 데 기본적으로 필요한 plugin인 core plugin을 설치해보자.Command 창을 띄우고 앞서 설치한 [샘플 프로젝트 설치 폴더]/db/hsqldb 폴더로 이동하여 start.cmd(or start.sh) 파일을 더블클릭함으로써 샘플용으로 제공되는 hsqldb를 시작시킨다. 해당 Plugin 실행을위해 DB 데이터 추가가 필요한 경우 선택한 Plugin 설치시 DB 데이터 추가 작업도 함께 이루어지므로DB를 시작시켜 놓아야 한다. 만일 선택한 Plugin 설치시 DB가 시작되지 않았다면 Plugin 설치 이후 제공되는 DB 스크립트 파일([샘플 프로젝트 설치 폴더]/db/scripts/{plugin명-insert-data-db명}.sql)을 직접실행시키면 된다. 또한 샘플용으로 제공되는 hsqldb가 아닌 다른 DB 기반에서 Plugin을 설치하고자 하는 경우에는 DB 변경을 참고하도록 한다.10


MavenCommand 창을 띄우고 샘플 프로젝트 설치 폴더로 이동하여 다음과 같이 명령어를 입력한다. (Plugin설치와 관련된 자세한 내용은 Maven 기반 install command를 참조한다.)mvn anyframe:install -Dname=corecore plugin의 동작을 위해서는 datasource, logging, spring plugin이 필요하므로 아래와 같이 출력될 것이다. 계속 설치를 진행하고자 하는 경우 'y'를 입력한다.Resolving plugin dependencies ...Dependencies Resolved.------------------------------------------------------------------------------ Install datasource 1.0.0Install spring 1.0.0Install core 1.0.3Install logging 1.0.0------------------------------------------------------------------------------Is this OK? (y, n):다음과 같은 명령어를 입력하면 샘플 프로젝트를 대상으로 설치된 Plugin 목록을 확인할 수 있을 것이다.mvn anyframe:installed core 1.0.3 1.0.3datasource 1.0.0 1.0.0spring 1.0.0 1.0.0logging 1.0.0 1.0.0core plugin과 동일한 방법으로 다른 Plugin들을 추가로 설치할 수 있다. 설치할 수 있는 Plugin 목록을조회하려면 다음과 같은 명령어를 사용한다.mvn anyframe:list11


Maven기존 Maven 사용자 유의 사항<strong>Anyframe</strong>에서는 Maven 기반에서 <strong>Anyframe</strong> 관련 라이브러리 다운로드시에 참조 관계에놓인 모든 <strong>Anyframe</strong> 및 3rd-party 라이브러리들이 한꺼번에 다운로드되는 현상을 막기 위해 각 라이브러리들 간의 참조 관계를 끊은 상태로 <strong>Anyframe</strong> Repository에 배포하고 있다.때문에 기존 Maven 사용자들은 Local Repository에 이미 존재하는 3rd-party 라이브러리가 가진 참조 관계에 문제가 생겨 <strong>Anyframe</strong> 설치시에 오류가 발생할 수 있다. 따라서 설치에 문제가 있는 경우에는 Local Repository를 삭제한 후 재설치해 볼 것을 권장한다.6.4.어플리케이션 실행특정 Plugin 설치 후 구성된 샘플 어플리케이션이 정상적으로 동작하는지 쉽게 확인할 수 있도록<strong>Anyframe</strong>에서는 Jetty 서버에 어플리케이션을 deploy하여 바로 실행해볼 수 있는 Command를 제공한다.Command 창을 띄운 후, 샘플 프로젝트 설치 폴더 위치로 이동하여 다음과 같이 Maven 명령어를 입력하면 Jetty 기반에서 샘플 어플리케이션을 시작시킬 수 있다.mvn clean jetty:runJetty가 정상적으로 실행되면 'Started Jetty Server'라는 INFO 레벨의 로그 메세지가 콘솔창에 보일 것이다.WAS가 정상적으로 시작되었으면 웹브라우저를 열고, 주소창에 http://localhost:8080/myproject(http://localhost:8080/${샘플 프로젝트 이름})와 같이 입력하여 샘플 어플리케이션이 정상적으로 실행되는지 확인해본다. 다음은 core plugin만 설치된 경우 샘플 어플리케이션의 초기 화면이다.12


Maven화면에서 Core 링크를 클릭하면 영화 정보를 관리할 수 있는 페이지로 이동한다.6.5.Resources• 다운로드다음은 앞서 언급한 Maven의 settings.xml 파일이다. settings.xml 파일을 다운로드받은 후, [MAVEN설치 폴더]/conf 내에 복사한다.표 6.1. Download ListNamesettings.xmlDownloadDownload [http://dev.anyframejava.org/docs/anyframe/ide/2.0.0/reference/download/installation/settings.xml]13


7.Ant본 장에서는 해당 프로젝트의 빌드 도구가 Ant인 경우, CLI를 이용하여 <strong>Anyframe</strong> 기반의 개발 환경을쉽게 구성하는 방법에 대해서 설명하고자 한다. Ant를 기반으로 개발 환경을 구성하려면 다음과 같은순서로 작업을 진행한다.• <strong>Anyframe</strong> 설치 및 환경 설정• 프로젝트 구조 생성• Plugin 설치• 어플리케이션 실행7.1.<strong>Anyframe</strong> 설치 및 환경 설정여기서는 빌드 도구로 Ant를 사용할 경우, 본격적인 <strong>Anyframe</strong> 기반의 개발 환경 구성 전에 선행되어야 하는 작업들에 대해 설명하고자 한다. Ant는 <strong>Anyframe</strong> 배포판에 포함되어 있으므로, <strong>Anyframe</strong>을 설치하면 Ant가 자동적으로 함께 설치된다. <strong>Anyframe</strong>은 압축파일로 배포되며, 다음과 같은 순서에 의하여 설치한다.1. <strong>Anyframe</strong>을 설치하기 위한 [시스템 사양]을 확인한다.2. <strong>Anyframe</strong>의 최신 배포판을 http://www.anyframejava.org/project/anyframe#downloads 에서 확인한다.3. <strong>Anyframe</strong>의 최신 배포판("anyframe-x.x.x.zip")을 사용자의 컴퓨터에 내려받는다.4. 내려받은 최신 배포판의 압축을 원하는 폴더에 푼다.5. 압축을 풀면 다음과 같은 구조를 확인할 수 있다. 여기서 압축을 푼 위치가 <strong>Anyframe</strong>이 설치된 root 경로가 되며 이후 매뉴얼 내용에서 [<strong>Anyframe</strong> Home]이라 통칭하도록 한다. <strong>Anyframe</strong>에서 제공하는 모든 라이브러리들과 빌드 도구인 Ant, 프로젝트 및 코드 생성 템플릿, 공통 빌드 스크립트, 샘플 HSQLDB등이 모두 함께 설치된다.• applications : <strong>Anyframe</strong>에서 제공하는 Command를 이용하여 프로젝트 생성시 생성된 프로젝트들이 위치하게 되는 기본 디렉토리 (Command의 옵션을 통해 변경 가능)• bin : <strong>Anyframe</strong> Command 실행을 위한 Script 포함• ide : <strong>Anyframe</strong> Command 관련 라이브러리 및 공통 빌드 Script 파일들, 빌드 도구인 Ant, 샘플을위한 HsqlDB, <strong>Anyframe</strong> IDE Editor에서 Hudson 연계를 위한 파일들(anyframe-ide-eclipse-hudson-X.X.X.jar, web.xml) 포함14


Ant• licenses : <strong>Anyframe</strong>을 통해 배포되는 CLI 라이브러리와 <strong>Anyframe</strong> Repository로 부터 다운받을 수있는 3rd party 라이브러리들에 대한 라이센스 본문과 정리된 목록• repo : <strong>Anyframe</strong> 및 <strong>Anyframe</strong>에서 참조하는 3rd party 라이브러리 파일들 포함• templates : 프로젝트 생성 및 코드 생성을 위한 템플릿 파일들 포함• changelog.txt : 버전 별 변경 사항 로그• license.txt : <strong>Anyframe</strong> 라이센스(Apache License)• readme.txt : <strong>Anyframe</strong> 소개 및 기본 사항6. <strong>Anyframe</strong>에서 제공하는 개발 환경 구성 관련 Command들을 Ant를 기반으로 실행하기 위해서 다음과 같이 환경설정을 한다.<strong>Anyframe</strong> 설치 폴더 하위의 bin 폴더에서 command 창을 실행 시킨 다음, env 명령어를 입력하여env.bat 파일을 실행시킨다. env 명령 실행을 통해서 ANT_HOME, PATH, CLASSPATH, MAINCLASS 등의 환경 변수 설정이 이루어진다.이 때, <strong>Anyframe</strong>을 설치한 경로를 값으로 가지는 ANYFRAME_HOME 환경 변수가 필요한데, 시스템의 환경 변수로 등록할 수도 있고, 아래 그림처럼 command창에서 set 명령어를 이용하여 등록할 수도 있다. (단, command 창에서 등록한 환경변수는 해당 창에서만 유효하고, 새로운 command 창을열었을 경우에는 다시 등록해주어야 한다.)ANYFRAME_HOME/bin>envERROR: Environment variable ANYFRAME_HOME not set.ANYFRAME_HOME/bin>set ANYFRAME_HOME=C:/ats-x.x.x/anyframe-x.x.xANYFRAME_HOME/bin>env주의 사항Windows 환경에서는 env.bat 파일을 Command창에서 실행시키고, Unix 환경(ex. MacOS 등)에서는 우선 bin 폴더 하위의 파일들에 대해서 실행 권한을 부여(chmod 755 *)한 후, env.sh 파일을 실행(source env.sh)시킨다. 수행시켜야 할 command는 각 내용의 괄호안을 참고하도록 한다.7. 이제 Ant 기반에서 Command Line Interface를 활용하여 <strong>Anyframe</strong> 기반 개발 환경 구성이 가능해졌다.7.2.프로젝트 구조 생성<strong>Anyframe</strong> 기반의 개발 환경 구성을 위해서, 먼저 프로젝트의 기본 구조를 생성한다. 'env' command실행을 통해 환경 변수 정보가 설정된 command 창에서 다음과 같이 Command를 입력하여 anyframebasic-archetype을설치한다. (<strong>Anyframe</strong> Archetype에 대한 자세한 내용은 본 매뉴얼의 Archetype 설명을 참고하도록 한다.)anyframe create-project이 명령어를 통해 anyframe-basic-archetype이 설치되어 [<strong>Anyframe</strong> Home]/applications 폴더에 프로젝트가 생성된다.다음 그림은 anyframe-basic-archetype 설치를 통해 구성된 샘플 프로젝트의 기본 모습이다.15


Ant이제 생성한 프로젝트 디렉토리로 이동하여 계속해서 <strong>Anyframe</strong>에서 제공하는 다양한 Plugin을 설치할수 있다.cd ../applications/myproject7.3.Plugin 설치<strong>Anyframe</strong> 4.6.0 이후부터는 다양한 오픈 소스들이 통합된 템플릿 기반의 샘플 코드, 참조 라이브러리집합을 plugin이라 칭하며, 다양한 유형의 plugin을 제공한다.여기서는 <strong>Anyframe</strong>의 다른 plugin이 동작하는 데 기본적으로 필요한 plugin인 core plugin을 설치해보자.Command 창을 띄우고 앞서 설치한 [샘플 프로젝트 설치 폴더]/db/hsqldb 폴더로 이동하여 start.cmd(or start.sh) 파일을 더블클릭함으로써 샘플용으로 제공되는 hsqldb를 시작시킨다. 해당 Plugin 실행을위해 DB 데이터 추가가 필요한 경우 선택한 Plugin 설치시 DB 데이터 추가 작업도 함께 이루어지므로DB를 시작시켜 놓아야 한다. 만일 선택한 Plugin 설치시 DB가 시작되지 않았다면 Plugin 설치 이후 제공되는 DB 스크립트 파일([샘플 프로젝트 설치 폴더]/db/scripts/{Plugin명-insert-data-db명}.sql)을 직접실행시키면 된다. 또한 샘플용으로 제공되는 hsqldb가 아닌 다른 DB 기반에서 Plugin을 설치하고자 하는 경우에는 DB 변경을 참고하도록 한다.'env' command 실행을 통해 환경 변수 정보가 설정된 command 창에서 샘플 프로젝트 설치 폴더로 이동(예를 들어, myproject 라는 프로젝트를 생성시켰다면 myproject 폴더에서 command를 실행시키도록 한다.)하여 다음과 같이 명령어를 입력한다. (Plugin 설치와 관련된 자세한 내용은 Ant 기반 installcommand를 참조한다.)anyframe install corecore plugin의 동작을 위해서는 datasource, logging, spring plugin이 필요하므로 아래와 같이 출력될 것이다. 계속 설치를 진행하고자 하는 경우 'y'를 입력한다.[install] Resolving plugin dependencies ...[install] Dependencies Resolved.16


Ant[install] ------------------------------------------------------------------------------[install] [install] Install datasource 1.0.0[install] Install spring 1.0.0[install] Install core 1.0.3[install] Install logging 1.0.0[install] ------------------------------------------------------------------------------[install] Is this OK? (y, n):Plugin이 정상적으로 설치되었다면, 지정한 패키지 경로에 해당 Plugin 샘플 소스 코드가 생성되어 있고, src/main/webapp/WEB-INF/lib에 Plugin 관련 라이브러리가 설치되어 있을 것이다.Command 창을 띄우고 샘플 프로젝트 설치 폴더로 이동하여 다음과 같은 명령어를 입력하면 샘플 프로젝트를 대상으로 추가된 Plugin 목록을 확인할 수 있다.anyframe installed[installed] [installed] core 1.0.3 1.0.3[installed] datasource 1.0.0 1.0.0[installed] spring 1.0.0 1.0.0[installed] logging 1.0.0 1.0.0core plugin과 동일한 방법으로 다른 Plugin들을 추가로 설치할 수 있다. 설치할 수 있는 Plugin 목록을조회하려면 다음과 같은 명령어를 사용한다.anyframe list17


Ant7.4.어플리케이션 실행특정 Plugin 설치 후 구성된 샘플 어플리케이션이 정상적으로 동작하는지 쉽게 확인할 수 있도록<strong>Anyframe</strong>에서는 Jetty 서버에 어플리케이션을 deploy하여 바로 실행해볼 수 있는 Command를 제공한다.'env' command 실행을 통해 환경 변수 정보가 설정된 command 창에서, 샘플 프로젝트 설치 폴더 위치로 이동하여 다음과 같이 명령어를 입력하면 Jetty 기반에서 샘플 어플리케이션을 시작시킬 수 있다.anyframe runJetty가 정상적으로 시작되면 'Started Jetty Server'라는 INFO 레벨의 로그 메세지가 콘솔창에 보일 것이다.WAS가 정상적으로 시작되었으면 웹브라우저를 열고, 주소창에 http://localhost:8080/myproject(http://localhost:8080/${샘플 프로젝트 이름})와 같이 입력하여 샘플 어플리케이션이 정상적으로 실행되는지 확인해본다. 다음은 core plugin만 설치된 경우 샘플 어플리케이션의 초기 화면이다.화면에서 Core 링크를 클릭하면 영화 정보를 관리할 수 있는 페이지로 이동한다.'anyframe run' 명령어를 실행하면 프로젝트 dist 폴더 하위에 jetty-temp라는 폴더가 생성되어 Jetty가구동되게 된다. 배포 이후에 클래스나 JAR 파일, JSP 파일 등을 반영하고 Jetty로 재확인하고 싶다면 이폴더의 해당 위치에 배포하도록 한다.18


8.Eclipse IDE<strong>Anyframe</strong> IDE 툴의 기능은 Command Line 기반으로도 제공되며, Eclipse Plugin 형태로도 제공된다. 여기서는 Eclipse를 위한 <strong>Anyframe</strong> IDE를 설치하는 방법에 대해서 설명하고 있다.8.1.Maven 기반 개발 환경으로 설치1. <strong>Anyframe</strong> IDE 플러그인 설치는 <strong>Anyframe</strong> Plugin Update Site를 통해서 설치할 수 있다. 외부 인터넷연결이 안되거나 네트웍에 문제가 있는 경우 아래의 노트 [Update Site를 이용하지 않고 <strong>Anyframe</strong>IDE Eclipse Plugin 설치하기] 내용을 참고하여 설치하도록 한다.ㄱ.Eclipse의 Help > Install New Software... 메뉴를 선택한다.ㄴ.[Available Software] 화면: 사용하는 Eclipse에 m2eclipse를 설치하지 않은 경우에만 해당되는 사항이다. 우측 상단의 Add...버튼을 클릭하여 m2eclipse Plugin Update Site 2개를 추가하도록 한다. 첫번째 Update Site의 Name에는 m2eclipse Update Site를, Location에는 http://m2eclipse.sonatype.org/sites/m2e를 입력한다. 두번째 Update Site의 Name에는 m2eclipseextras Update Site를, Location에는 http://m2eclipse.sonatype.org/sites/m2e-extras를 입력한다. 이렇게 m2eclipse update site에 대한 url 주소를 추가해 주면, 이후 <strong>Anyframe</strong> IDE Plugin 설치 시 함께 설치된다.ㄷ.[Available Software] 화면: 우측 상단의 Add...버튼을 클릭하여 <strong>Anyframe</strong> Plugin Update Site를 추가하도록 한다. 이때 Name에는 <strong>Anyframe</strong> Plugin Update Site를, Location에는 http://dev.anyframejava.org/update를 입력한다.ㄹ.[Available Software] 화면: 중앙에 <strong>Anyframe</strong> Plugin Update Site 를 루트로 하는 Plugin Tree가 나타난다. (<strong>Anyframe</strong> Common, <strong>Anyframe</strong> IDE, <strong>Anyframe</strong> Query Manager 목록 조회됨) 여기서 하단 항목 중 "Contact all update sites during install to find required software" 체크 박스를 해제하여 다른 Plugin이 함께 설치되는 것을 방지한다. 그러나 사용하는 Eclipse에 m2eclipse를 설치하지 않은 상태라면 체크 박스에 체크를 하여 m2eclipse가 함께 설치되도록 한다.ㅁ.[Available Software] 화면: Plugin Tree 중 <strong>Anyframe</strong> IDE을 선택하고 하단의 Next 버튼을 클릭한다.ㅂ.[Install Details] 화면: <strong>Anyframe</strong> IDE하위로 <strong>Anyframe</strong> Common plugin이 보이게 된다. <strong>Anyframe</strong> IDE사용 시 <strong>Anyframe</strong> Common이 필요하므로 참조관계에 의해 함께 설치된다. 확인 후 Next 버튼을클릭한다.ㅅ.[Review Licenses] 화면: 좌측의 Plugin을 선택하면 우측에 License text가 나온다. <strong>Anyframe</strong>Common과 <strong>Anyframe</strong> IDE에 대해서 우측 하단의 "I accept the terms of the license agreements"구문에 동의하고 Finish 버튼을 클릭한다.ㅇ.[Security Warning] 화면: 팝업창에서 설치 진행 여부 물을 때 OK 버튼을 선택한다.ㅈ.[Software Updates] 화면: 팝업창이 뜨고, "Would you like to restart now?" 질문에 Yes 버튼을 선택한다.<strong>Anyframe</strong> Plugin Update Site를 이용한 설치 전 주의 사항<strong>Anyframe</strong> IDE Plugin이 설치하려고 하는 Eclipse의 dropins나 plugins 혹은 addins 폴더에 이미 설치되어 있다면 Update Site를 통해 설치될 Plugin과 중복되어 문제를 일으킬수 있으므로 반드시 dropins나 plugins 혹은 addins 폴더에 <strong>Anyframe</strong> IDE Plugin이 설치되어 있는지 확인하고 설치되어 있다면 제거한 후, Update Site를 통해 설치하도록 한다. Update Site를 통해 설치한 경우 물리적인 <strong>Anyframe</strong> IDE Plugin 파일은 plugins 폴더 하위에 위치하게 된다.19


Eclipse IDE2. "Help > About Eclipse Platform (또는 About Eclipse SDK) > Plug-in Details" 를 통해 정상적으로설치되었는 지 확인한다.☞ About Eclipse Platform (또는 About Eclipse SDK) 메뉴는 Windows용 Eclipse의 경우 Help 메뉴에서, Mac OS X용 Eclipse의 경우 Eclipse 메뉴에서 확인할 수 있다.☞ Eclipse 루트 폴더 하위의 plugins 폴더 내로 org.anyframe.common.eclipse.core_xxx.jar와org.anyframe.ide.eclipse.core_xxx.jar 파일이 설치되어있는지 확인해볼 수 있다.3. <strong>Anyframe</strong> IDE 플러그인을 포함한 전체 <strong>Anyframe</strong> IDE의 설치가 완료되었다. <strong>Anyframe</strong> IDE의 기능을사용하여 개발하기 이전에 반드시 Eclipse Preferences 설정 내용을 참고하여 환경 설정을 모두 끝마치도록 한다.Update Site를 이용하지 않고 <strong>Anyframe</strong> IDE EclipsePlugin 설치하기<strong>Anyframe</strong> IDE 플러그인은 <strong>Anyframe</strong> 포탈사이트에서 다운받은 anyframe-X.X.X.zip 파일을이용해서 설치할 수 있다.1. <strong>Anyframe</strong> 포탈 사이트에서 anyframe-X.X.X.zip 을 다운받는다.2. 압축을 풀고 anyframe-X.X.X/ide/eclipse-plugins 폴더 내에 있는 2개의 플러그인 패키지 파일들(org.anyframe.[제품명].eclipse[.*]_x.x.x.jar)를 "[eclipse 설치 폴더]/plugins"로 복사한다.plugins 폴더에는 다음 두가지 플러그인 패키지가 존재한다.• org.anyframe.common.eclipse.core_x.x.x.jar : <strong>Anyframe</strong> plugins의 공용 라이브러리및 공통 메뉴 제공• org.anyframe.ide.eclipse.*_x.x.x.x.jar : <strong>Anyframe</strong> IDE 플러그인☞ 현재 <strong>Anyframe</strong> Common 플러그인의 경우 , <strong>Anyframe</strong> IDE 설치 파일 내에 함께 배포되어 손쉽게 설치할 수 있도록 제공하고 있다. 하지만 <strong>Anyframe</strong> Common 플러그인은 독립적으로 배포되고 사용될 수 있는 플러그인이므로 추후 <strong>Anyframe</strong> Common 플러그인 버전이 업데이트되고, 업데이트된 버전을 사용하고자 한다면 <strong>Anyframe</strong> IDE에서 배포한 구버전 <strong>Anyframe</strong> Common 플러그인을 제거하고 업데이트된 플러그인 패키지를 설치하도록 한다.m2eclipse plugin 설치는 m2eclipse update site (http://m2eclipse.sonatype.org/sites/m2e, http://m2eclipse.sonatype.org/sites/m2e-extras)를 통해서 설치하도록 한다.8.2.Ant 기반 개발 환경으로 설치Ant 기반 개발 시 <strong>Anyframe</strong> IDE Eclipse Plugin 설치 방법은 Maven 기반의 개발 시 <strong>Anyframe</strong> IDE EclipsePlugin 설치 방법과 동일하다. <strong>Anyframe</strong> IDE Eclipse Plugin 설치 방법은 Maven 기반 개발의 [<strong>Anyframe</strong>IDE Eclipse Plugin 설치]를 참조한다.8.3.Eclipse Preferences 설정<strong>Anyframe</strong> IDE 을 이용하여 생성한 프로젝트 실행을 위해 필요한 환경설정을 한다. <strong>Anyframe</strong> IDE의 환경설정은 Eclipse Preferences 창을 통해 수행한다.[1] Maven 기반 개발 환경에서는 다음과 같이 Preferneces 정보를 설정하도록 한다.20


Eclipse IDE• 프로젝트 빌드 타입 설정 : 생성할 프로젝트의 빌드 타입을 지정하고, 빌드방식에 따른 Home 정보를 세팅한다. 지정한 프로젝트 빌드 타입에 따라 IDE 플러그인에서 제공하는 프로젝트 생성화면이다르게 제공된다.• Window >> Preferences >> <strong>Anyframe</strong> Tools >> IDE 에서 MAVEN 선택Maven Home setting : Maven이 설치된 경로 지정표 8.1. MAVEN_HOME 및 Settings.xml 설정MAVEN_HOME 및 Settings.xml 설정Maven 빌드 방식을 채택하여 프로젝트를 생성하고자 하는 경우, 로컬에 Maven이 설치되어 있어야 하며 설치된 Maven에 대한 시스템 변수 MAVEN_HOME이 설정되어야 한다. 또한, Maven프로젝트가 바라봐야 할 Remote Repository 정보에 대해 settings.xml 에 정의가 필요하다. 이에대한 자세한 가이드는 <strong>Anyframe</strong> 포탈의 Quick Start의 [ Maven 설치 및 환경설정 부분 [http://www.anyframejava.org/project/anyframe/quickstart] ]을 참조한다.• Window >> Preferences >> Maven >> User Settings 에서 User Settings 경로 확인User Settings : <strong>Anyframe</strong> Repository(http://dev.anyframejava.org/maven/repo) 속성이 추가된settings.xml 파일 경로 설정Maven 빌드 방식을 채택하여 프로젝트를 생성하는 경우 이클립스에 M2Eclipse가 설치되어 있어야 한다. 이는 생성된 프로젝트가 M2Eclipse 프로젝트 형태로 전환되기 때문인데, 이 때 M2Eclipse가 바라보는 settings.xml 은 Window >> Preferences >>Maven >> User Settings 에 정의되어 있는 경로의 파일이다. <strong>Anyframe</strong> Repository(http://dev.anyframejava.org/maven/repo) 속성이 추가되어 있는 settings.xml 파일 경로가 Preferences에 설정되어 있는지 확인하고, 경로가 맞지 않다면 수정하도록 한다.• [선택] Archetype 버전 설정 : Basic Archetype 버전과 Service Archetype 버전을 설정하여 프로젝트생성 시 사용할 Archetype을 선택할 수 있게 한다. 설정하지 않은 경우, 최신 버전의 Archetype을 이용하여 프로젝트가 생성된다.• Window >> Preferences >> <strong>Anyframe</strong> Tools >> IDE 에서 MAVEN 선택[Optional] Archetype Version setting : Archetype 버전 설정Basic Archetype Version과 Service Archetype Version을 설정할 수 있다. 우측의 콤보 박스를 선택하여 버전 목록을 확인해볼 수 있는데 로컬 환경에 archetype-catalog.xml 파일이 존재하면 이 파일로부터 버전 목록을 얻고, 로컬 환경에 파일이 존재하지 않으면 원격 Repository로부터 archetypecatalog.xml파일을 다운로드 받아서 버전 목록을 얻어온다.• Log Level 설정 : Maven 명령어 수행 시 나오는 로그 정보들을 레벨(ERROR, INFO, DEBUG) 별로 구분하여 확인해볼 수 있도록 설정한다. 디폴트로 INFO 레벨이 설정되어 있다.• Window >> Preferences >> <strong>Anyframe</strong> Tools >> IDE 에서 MAVEN 선택Log Level setting : 로그 레벨 설정ERROR, INFO, DEBUG 중 하나의 로그 레벨을 선택하도록 한다. ERROR를 선택하면 실제 Maven명령어 실행 시 명령어 파라미터로 "-q"를 입력한 것과 동일한 기능으로 에러 로그로 제공되는 로그 메시지들만 보여지게 된다. INFO를 선택하면 실제 Maven 명령어 실행 시 기본적으로 보여지는 로그 메시지들이 보인다. DEBUG를 선택하면 실제 Maven 명령어 실행 시 명령어 파라미터로 "--debug"를 입력한 것과 동일한 기능으로 디버그성 로그 메시지들이 모두 함께 보여지게 된다.• Server 설정 : 어플리케이션이 구동될 WAS로 Tomcat v6.0을 사용한다.Window >> Preferences >> Server >> Runtime Environments 에서 Add..클릭21


Eclipse IDEName : Apache Tomcat v6.0Tomcat Installation directory : [Tomcat 이 설치된 root 경로]JRE : Workbench default JRE[2] Ant 기반 개발 환경에서는 다음과 같이 Preferneces 정보를 설정하도록 한다.• 프로젝트 빌드 타입 설정 : 생성할 프로젝트의 빌드 타입을 지정하고, 빌드방식에 따른 Home 정보를 세팅한다. 지정한 프로젝트 빌드 타입에 따라 IDE 플러그인에서 제공하는 프로젝트 생성화면이다르게 제공된다.• Window >> Preferences >> <strong>Anyframe</strong> Tools >> IDE 에서 ANT 선택<strong>Anyframe</strong> Home : <strong>Anyframe</strong>이 설치된 root 경로 지정.Offline : <strong>Anyframe</strong>과 연관된 라이브러리를 online으로 연결해서 지원받을지 여부 결정. 체크를 하는 경우 [<strong>Anyframe</strong> 을 설치한 root 폴더 경로]/repo 에 있는 라이브러리만 사용, 체크하지 않는 경우는 필요한 라이브러리가 로컬에 없는 경우 remote로 부터 다운받는다.표 8.2. ANT HOME 설정ANT HOME 설정• Ant Home 변경 : Window >> Preferences >> Ant >> Runtime >> Classpath Tab >> 우측 하단의 Ant Home.. 버튼 클릭path : [<strong>Anyframe</strong> 이 설치된 root 경로]/ide/ant• [선택] Archetype 버전 설정 : Basic Archetype 버전과 Service Archetype 버전을 설정하여 프로젝트생성 시 사용할 Archetype을 선택할 수 있게 한다. 설정하지 않은 경우, 최신 버전의 Archetype을 이용하여 프로젝트가 생성된다.• Window >> Preferences >> <strong>Anyframe</strong> Tools >> IDE 에서 ANT 선택[Optional] Archetype Version setting : Archetype 버전 설정Basic Archetype Version과 Service Archetype Version을 설정할 수 있다. 우측의 콤보 박스를 선택하여 버전 목록을 확인해볼 수 있는데 로컬 환경에 archetype-catalog.xml 파일이 존재하면 이 파일로부터 버전 목록을 얻고, 로컬 환경에 파일이 존재하지 않으면 원격 Repository로부터 archetypecatalog.xml파일을 다운로드 받아서 버전 목록을 얻어온다.• Log Level 설정 : Ant 명령어 수행 시 나오는 로그 정보들을 레벨(ERROR, INFO, DEBUG) 별로 구분하여 확인해볼 수 있도록 설정한다. 디폴트로 INFO 레벨이 설정되어 있다.• Window >> Preferences >> <strong>Anyframe</strong> Tools >> IDE 에서 ANT 선택Log Level setting : 로그 레벨 설정ERROR, INFO, DEBUG 중 하나의 로그 레벨을 선택하도록 한다. ERROR를 선택하면 빌드 스크립트파일을 기준으로 실제 Ant 명령어 실행 시 ERROR 로그 레벨을 설정한 것과 동일하게 에러 로그로제공되는 로그 메시지들만 보여지게 된다. INFO를 선택하면 실제 Ant 명령어 실행 시 기본적으로보여지는 로그 메시지들이 보인다. DEBUG를 선택하면 실제 Ant 명령어 실행 시 DEBUG 로그 레벨을 설정한 것과 동일하게 디버그성 로그 메시지들이 모두 함께 보여지게 된다.• Server 설정 : 어플리케이션이 구동될 WAS로 Tomcat v6.0을 사용한다.Window >> Preferences >> Server >> Runtime Environments 에서 Add..클릭Name : Apache Tomcat v6.022


Eclipse IDETomcat Installation directory : [Tomcat 이 설치된 root 경로]JRE : Workbench default JRE23


III.CommandsCommand Line Interface(이하 CLI)만을 사용하여 Maven 또는 Ant 기반에서 프로젝트 생성, Plugin 설치/삭제,Domain/CRUD 소스 코드 생성, 빌드 및 실행 등의 작업을 수행할 수 있다. (CLI 기반에서 Command를 직접 입력하여 실행하는 경우, 본 매뉴얼에서 정의한 필수 Command Argument를 생략하거나 Command Arguments 이외의 값을 설정하면 올바르게 동작하지 않을 수 있으므로 유의하도록 한다.)


9.Maven Commands해당 프로젝트에서 빌드 도구로써 Maven을 채택한 경우 CLI를 이용하여 <strong>Anyframe</strong> 기반 개발 환경을구성해 보도록 하자. 본 장에서는 먼저 <strong>Anyframe</strong> Maven Command에 대해 알아보고 이들 Command를활용하는 방법에 대해 구체적으로 살펴볼 것이다. 아직 Maven 환경이 제대로 갖추어지지 않은 경우에는 본 매뉴얼의 Installation - Maven 설치 및 환경 설정을 참고하여 환경이 제대로 세팅되었는지 확인해 보도록 한다.9.1.<strong>Anyframe</strong> Maven Commands<strong>Anyframe</strong>에서는 자체 구현한 'anyframe-maven-plugin'이라는 Maven Plugin을 제공함으로써 <strong>Anyframe</strong>Repository 내에 등록된 다양한 <strong>Anyframe</strong> Plugin들을 다운로드하여 설치/삭제/조회하거나 Domain/CRUD 소스 코드를 생성할 수 있도록 지원한다.9.1.1.anyframe-maven-plugin 정의 확인Maven 기반의 프로젝트에서 anyframe-maven-plugin을 사용하기 위해서는 해당 프로젝트 폴더 하위의pom.xml 파일 내에 다음과 같이 maven plugin 정의가 추가되어 있어야 한다.중략...중략...org.codehaus.mojoanyframe-maven-pluginx.x.xhsqldbhsqldb2.0.09.1.2.Command 목록anyframe-maven-plugin은 <strong>Anyframe</strong>만의 고유 기능을 수행할 수 있도록 구현된 다양한 MavenMojo(Maven-old-java-object) 클래스들로 구성되어 있으며 각 Mojo는 한 개의 Goal과 매핑된다. 여기에서Goal이란 Maven에서 사용되는 용어로써 한번의 실행으로 이루어지는 특정 기능 단위라고 볼 수 있다.다음은 anyframe-maven-plugin을 구성하는 Goal의 목록으로, 사용자는 Command 창에서 mvn anyframe:{goal}과 같이 명령어를 입력함으로써 원하는 기능을 실행할 수 있게 된다. Option은 -D{option}=...와 같은 형태로 명령어 입력 뒤에 추가하면 된다.helpGoal사용 가능한 Command 목록을 보여준다.Descriptioncommand : 상세조회하고자 하는 Goal의 이름을 입력한다.[선택]install25


Maven CommandsGoalDescriptionanyframe-basic-archetype(또는 anyframe-service-archetype) 설치 후, 생성된 샘플 프로젝트 구조를 기반으로 지정된 Plugin을 설치한다. 다음과 같은 Option을 가진다.name : 설치 대상 Plugin 명을 지정한다. [필수]version : 설치 대상 Plugin Version을 지정한다. [선택]uninstall이미 설치된 Plugin을 삭제한다. 다음과 같은 Option을 가진다.name : 삭제 대상 Plugin 명을 지정한다. [필수]excludes : Plugin 삭제 시에 특정 파일은 삭제되지 않도록 지정할 수 있다. [선택]create-model테이블 당 1개의 Domain 클래스를 생성한다. 테이블명 지정시에는 대소문자를 구분하므로 유의하여 테이블명을 입력해야 한다. 특히, 해당하는 DB에 맞게 대소문자를표현해야 한다. hsqldb, oracle의 경우 대문자로 테이블명을 표현해야 하고, mysql의경우 테이블명을 소문자로 표현해야 한다.table : Domain 클래스 생성을 위한 대상 테이블명을 정의한다. 여러 개의 테이블을대상으로 할 경우에는 "," 기호를 구분자로 이용한다. 또한 대상 테이블이 다른 테이블과 Relation 관계에 놓여 있다면 Relation 관계에 놓여 있는 테이블을 같이 정의해주도록 한다. [선택, 기본값은 '*'로써 모든 테이블에 대해 Domain 클래스 생성]package : 생성될 Domain 클래스의 패키지를 정의한다. [선택, 기본값은 해당 프로젝트의 대표 패키지 + ".domain"]create-crud하나의 Domain 클래스를 기준으로 기본 CRUD 기능을 구현한 비즈니스 레이어, 프리젠테이션 레이어에 속한 소스 코드를 생성한다.entity : CRUD 소스 코드 생성을 위한 대상 Domain 클래스를 정의한다. 클래스명만정의한 경우에는 해당 프로젝트의 대표 패키지 + ".domain" 하위에서 해당 Domain클래스를 찾게 된다. 따라서 다른 패키지에 해당 Domain 클래스가 존재하는 경우 해당 클래스의 패키지명까지 포함하여 정의해주도록 한다. [필수]package : 생성될 CRUD 소스 코드의 패키지를 정의한다. [선택, 기본값은 해당 프로젝트의 대표 패키지 + {입력된 Entity 클래스 이름(소문자)}]scope : 생성될 CRUD 소스 코드를 영역을 한정하는데 사용된다. scope을 "service"로정의한 경우 비즈니스 레이어 영역의 CRUD 소스 코드만 생성된다. [선택, 기본값은"all"로써 프리젠테이션 레이어, 비즈니스 레이어의 모든 소스 코드를 생성]change-db현재 사용중인 DB를 변경하고자 할 때 DB 변경으로 인해 영향받는 속성 정보들을 일괄 변경해준다. (해당 프로젝트 내의 META-INF/project.mf 파일 내에 정의된 DB 정보를 기준으로 동작함.)참고현재 <strong>Anyframe</strong>에서 제공하는 Plugin들은 기본인 HsqlDB외에 Oracle,Sybase, MySQL, DB2를 위한 리소스를 추가로 제공하고 있다.inplaceupdate-catalog생성된 샘플 프로젝트 하위의 src/main/webapp/WEB-INF/lib 폴더에 pom.xml 파일을기준으로 샘플 어플리케이션 실행에 필요한 모든 참조 라이브러리를 다운로드한다.{user.home}/.anyframe 디렉토리 내에 존재하는 plugin-catalog-essential.xml과 plugin-catalog-optional.xml 파일을 <strong>Anyframe</strong> Repository(http://dev.anyframejava.org/maven/repo) 내의 최신 plugin catalog 파일로 교체해준다. 이26


Maven CommandslistinfoGoalDescription로써 Plugin 목록 조회시 최신 정보를 조회할 수 있도록 한다. {user.home}/.anyframe디렉토리 내에 plugin-catalog-essential.xml과 plugin-catalog-optional.xml 파일이 없을경우에도 활용 가능하다.설치 가능한 Plugin의 이름과 버전 정보를 보여준다.지정한 Plugin의 상세 정보를 조회할 수 있다.name : 조회하고자 하는 Plugin의 이름을 지정한다. [필수]list-updateinstalled현재 생성된 샘플 프로젝트에 설치된 Plugin 중 버전 업데이트 가능한 Plugin 목록을보여준다.설치된 Plugin 현황 및 해당 Plugin의 최신 버전 정보를 보여준다.9.2.프로젝트 구조 생성생성할 샘플 프로젝트의 기본 구조 생성을 위해 적절한 <strong>Anyframe</strong> Archetype을 설치해야 한다. 이후이를 기반으로 <strong>Anyframe</strong>을 활용한 개발 환경 구성이 가능해진다. <strong>Anyframe</strong> 4.6.0 이후부터 anyframebasic-archetype,anyframe-service-archetype을 제공하고 있으며 'web' 타입의 프로젝트는 anyframebasic-archetype이,'service' 타입의 프로젝트는 anyframe-service-archetype이 설치된다. 본 장에서는 anyframe-basic-archetype을 기준으로 설명을 진행할 것이다. (<strong>Anyframe</strong> Archetype에 대해서는Archetype을 참고하도록 한다.)먼저 anyframe-basic-archetype을 설치해 보도록 하자.1. Command 창을 띄우고 다음과 같이 명령어를 입력하여 anyframe-basic-archetype 설치를 시작한다.mvn archetype:generate-DarchetypeCatalog="http://dev.anyframejava.org/maven/repo/archetype-catalog.xml"위와 같이 명령어를 입력하면 Command 창에 archetypeCatalog 속성값으로 정의된 http://dev.anyframejava.org/maven/repo/archetype-catalog.xml 파일 내에 정의된 Maven Archetype 목록이 제시될 것이다.Choose archetype:1: http://dev.anyframejava.org/maven/repo/archetype-catalog.xml ->org.anyframe.archetype:anyframe-basic-archetype (anyframe basic archetype (latest stable5.1.0))2: http://dev.anyframejava.org/maven/repo/archetype-catalog.xml ->org.anyframe.archetype:anyframe-service-archetype (anyframe service archetype (lateststable 2.1.0))3: http://dev.anyframejava.org/maven/repo/archetype-catalog.xml ->anyframe.archetype:anyframe-basic-archetype (-)Choose a number or apply filter (format: [groupId:]artifactId, case sensitivecontains): : 1위와 같이 archetype-catalog.xml 파일 내에 정의된 anyframe-basic-archetype 이라는 이름의 archetype이 Command 창에 제시됨을 알 수 있다. 제시된 Maven Archetype 목록 중 최신 anyframe-basicarchetype에해당하는 번호('1')를 선택한다.2. archetype-catalog.xml 파일에 등록된 anyframe-basic-archetype의 버전이 여러개일 경우 아래와 같이버전을 선택할 수 있도록 버전 목록이 제시될 것이다. 설치할 anyframe-basic-archetype의 버전에 해당하는 번호를 선택하면 된다. (등록된 anyframe-basic-archetype의 버전이 1개일 경우 버전 목록이제시되지 않고 바로 다음 단계로 이동한다.)3. 샘플 프로젝트 생성을 위해 다음과 같이 각 인자에 대한 값을 입력한다.27


Maven CommandsDefine value for property 'groupId': : myappDefine value for property 'artifactId': : myprojectDefine value for property 'version': 1.0-SNAPSHOT: 1.0.0Define value for property 'package': myapp: anyframeConfirm properties configuration:groupId: myappartifactId: myprojectversion: 1.0.0package: anyframeY: yParameter Description Default ValuegroupId 설치 대상 프로젝트의 groupId이다. N/AartifactId설치 대상 프로젝트의 artifactId로써 해당 프로젝트를 설치할대상 폴더명과 프로젝트명이 된다.version 설치 대상 프로젝트의 version이다. 1.0-SNAPSHOTpackage설치 대상 프로젝트 내 소스 코드에 대한 대표 패키지명이 된다.N/AgroupId로 정의한 값anyframe-basic-archetype-x.x.x.jar 라이브러리가 Maven Local Repository 내에 존재하지 않는 경우 앞서 settings.xml 파일에 정의한 <strong>Anyframe</strong> Repository로부터 이를 다운로드하고, 입력한 속성값을 기반으로 샘플 프로젝트가 생성될 것이다. (settings.xml 파일 내의 를 별도로 정의하지 않은 경우 Maven Local Repository는 기본적으로 {user.home}/.m2/repository가 될 것이다.)4. 다음은 anyframe-basic-archetype 설치를 통해 구성된 샘플 프로젝트의 기본 모습이다. 설치된 샘플프로젝트명은 myproject이며, 하위에 다양한 용도의 폴더를 포함하고 있다.5. anyframe-basic-archetype 설치 완료 후에는 어플리케이션 실행을 참조하여 정상 동작 여부를 확인하도록 한다.9.2.1.Archetype개발 프로젝트의 구조 생성을 위해 반드시 미리 설치되어야 하는 <strong>Anyframe</strong> archetype의 구조에 대해 살펴보자. (<strong>Anyframe</strong> 4.6.0 이후부터는 웹 프로젝트 구조 생성을 위한 anyframe-basic-archetype과 서비스프로젝트 구조 생성을 위한 anyframe-service-archetype을 제공한다.)9.2.1.1.anyframe-basic-archetypeanyframe-basic-archetype은 프리젠테이션 레이어와 비즈니스 레이어로 구성된 웹 프로젝트의 기본구조를 정의하고 있는 Maven Archetype이다. 따라서, 명령어 mvn archetype:generate를 이용하면,anyframe-basic-archetype 내에 정의된 웹 프로젝트 구조가 정해진 위치에 생성된다.28


Maven Commands다음은 anyframe-basic-archetype의 src/main/resources 하위에 위치한 주요 구성 요소를 표현한 그림이다.archetype-resources는 리소스 템플릿을 관리하기 위한 용도의 폴더로써 pom.xml 파일과 함께 다음과같은 하위 폴더를 가진다. pom.xml 파일 내에는 anyframe-basic-archetype 설치 후, 생성될 샘플 어플리케이션 실행 및 소스 코드 품질 검토 결과 리포팅 등에 필요한 Maven Plugin들이 정의되어 있다. 다음은 archetype-resources 폴더를 구성하는 주요 하위 폴더/파일에 대한 설명이다.FolderMETA-INF.settingsdb/hsqldbsrc/main/javasrc/main/resourcessrc/main/webappsrc/test/javasrc/test/resourcesDescriptionPlugin 설치 정보를 관리하기 위한 plugin-installed.xml 파일과 샘플 프로젝트 및 DB정보 등을 포함한 각종 Meta 정보 관리를 위한 project.mf 파일을 가진다.Eclipse 프로젝트 정보를 관리한다.샘플 어플리케이션 실행에 필요한 샘플 DB이다.소스 코드를 관리하기 위한 용도의 폴더를 가진다.Spring, SpringMVC 기반의 어플리케이션 실행을 위한 속성 정의 파일과 메시지 파일,쿼리문을 정의하고 있는 매핑 XML 파일들을 관리하기 위한 용도의 폴더를 가진다.웹 어플리케이션을 위한 웹 리소스(*.jsp, *.css, *.js ...)들을 관리하기 위한 용도의폴더를 가진다.테스트 코드를 관리하기 위한 용도의 폴더를 가진다.테스트 코드 실행에 필요한 리소스들을 관리하기 위한 용도의 폴더를 가진다.META-INF는 anyframe-basic-archetype의 리소스 템플릿에 대한 Meta 정보를 관리하기 위한 용도의 폴더로써 다음과 같은 하위 폴더를 가진다.mavenFolderDescription리소스 템플릿을 이용하여 샘플 프로젝트를 생성할 때 필요한 Meta 정보를 관리하는 archetype-metadata.xml 파일을 가진다.9.2.1.2.anyframe-service-archetypeanyframe-service-archetype은 비즈니스 레이어로만 구성된 서비스 프로젝트의 기본 구조를 정의하고 있는 Maven Archetype이다. 따라서, 명령어 mvn archetype:generate를 이용하면, anyframe-servicearchetype내에 정의된 서비스 프로젝트 구조가 정해진 위치에 생성된다.29


Maven Commands참고anyframe-service-archetype으로 인해 생성된 서비스 프로젝트의 경우 해당 프로젝트를 대상으로 <strong>Anyframe</strong> Plugin을 설치하더라도 선택된 Plugin 관련 샘플 코드/속성 파일은 추가되지 않고 참조 라이브러리만 추가된다는 것을 기억하도록 하자.다음은 anyframe-service-archetype의 src/main/resources 하위에 위치한 주요 구성 요소를 표현한 그림이다.archetype-resources는 리소스 템플릿을 관리하기 위한 용도의 폴더로써 pom.xml 파일과 함께 다음과같은 하위 폴더를 가진다. pom.xml 파일 내에는 anyframe-service-archetype 설치 후, 생성될 샘플 어플리케이션 실행 및 소스 코드 품질 검토 결과 리포팅 등에 필요한 Maven Plugin들이 정의되어 있다. 다음은 archetype-resources 폴더를 구성하는 주요 하위 폴더/파일에 대한 설명이다.FolderMETA-INF.settingsdb/hsqldbsrc/main/javasrc/main/resourcessrc/test/javasrc/test/resourcesDescriptionPlugin 설치 정보를 관리하기 위한 plugin-installed.xml 파일과 샘플 프로젝트 및 DB정보 등을 포함한 각종 Meta 정보 관리를 위한 project.mf 파일을 가진다.Eclipse 프로젝트 정보를 관리한다.샘플 어플리케이션 실행에 필요한 샘플 DB이다.소스 코드를 관리하기 위한 용도의 폴더를 가진다. 어플리케이션 개발에 공통적으로필요한 기본 Exception 클래스 및 Aspect 클래스를 포함하고 있다.Spring, SpringMVC 기반의 어플리케이션 실행을 위한 속성 정의 파일과 메시지 파일,쿼리문을 정의하고 있는 매핑 XML 파일들을 관리하기 위한 용도의 폴더를 가진다.어플리케이션 개발에 공통적으로 필요한 기본 속성 정의 파일을 포함하고 있다.테스트 코드를 관리하기 위한 용도의 폴더를 가진다.테스트 코드 실행에 필요한 리소스들을 관리하기 위한 용도의 폴더를 가진다. CRUD소스 코드 생성시 활용할 샘플 데이터 정보를 관리하기 위한 XML 파일을 포함하고있다.META-INF는 anyframe-service-archetype의 리소스 템플릿에 대한 Meta 정보를 관리하기 위한 용도의 폴더로써 다음과 같은 하위 폴더를 가진다.30


Maven CommandsmavenFolderDescription리소스 템플릿을 이용하여 샘플 프로젝트를 생성할 때 필요한 Meta 정보를 관리하는 archetype-metadata.xml 파일을 가진다.9.3.Plugin 설치<strong>Anyframe</strong> 4.6.0 이후부터는 다양한 오픈 소스들이 통합된 템플릿 기반의 샘플 코드, 참조 라이브러리집합을 Plugin이라 칭하며, 다양한 유형의 Plugin을 제공한다.<strong>Anyframe</strong>의 Plugin들은 필수(Essential) Plugin과 선택(Optional) Plugin으로 나눌 수 있다. 필수 Plugin에는 core, spring, datasource, logging 과 같이 다른 Plugin이 동작하는데 기본적으로 필요한 기능들을가진 Plugin들이 속해 있고, 선택 Plugin에는 hibernate, cxf-jaxrs, fileupload 등과 같이 어플리케이션 개발시 사용할 수 있는 여러 기능들을 제공하는 Plugin들로 구성되어 있다. (Plugin에 대한 자세한 내용은Plugin 목록과 Plugin 구조를 참조하도록 한다.)다음에서는 기본적인 Command 사용법을 언급하고 있으므로 <strong>Anyframe</strong> Commmand Option에 대해서는 Command 목록내에 제시된 해당 Command의 설명을 참고하도록 한다.<strong>Anyframe</strong>의 Plugin은 특정 Plugin이 동작하는 데 필요한 Plugin을 Dependent Plugin으로 설정할 수 있다. 그래서 특정 Plugin 설치 시에 Dependent Plugin이 설치되지 않았을 경우 자동으로 우선 설치될 수있도록 한다.여기서는 다른 <strong>Anyframe</strong> Plugin들의 동작을 위한 기반을 제공하는 필수 Plugin인 core plugin을 설치해보도록 하자.1. Command 창을 띄우고 앞서 설치한 [샘플 프로젝트 설치 폴더]/db/hsqldb 폴더로 이동하여 start.cmd(or start.sh) 파일을 더블클릭함으로써 샘플용으로 제공되는 hsqldb를 시작시킨다. 해당 Plugin 실행을 위해 DB 데이터 추가가 필요한 경우 선택한 Plugin 설치시 DB 데이터 추가 작업도 함께 이루어지므로 DB를 시작시켜 놓아야 한다. 만일 선택한 Plugin 설치시 DB가 시작되지 않았다면 Plugin 설치 이후 제공되는 DB 스크립트 파일([샘플 프로젝트 설치 폴더]/db/scripts/{plugin명-insert-data-db명}.sql)을 직접 실행시키면 된다. 또한 샘플용으로 제공되는 hsqldb가 아닌 다른 DB 기반에서 Plugin을 설치하고자 하는 경우에는 DB 변경을 참고하도록 한다.주의 사항Windows 환경에서는 start.cmd 파일을 CLI 상에서 실행시키고, Unix 환경(ex. Mac OS등)에서는 우선 hsqldb 폴더 하위의 파일들에 대해서 실행 권한을 부여(chmod 755 *)한 후, start.sh 파일을 실행(./start.sh)시킨다.2. Command 창을 띄우고 샘플 프로젝트 설치 폴더로 이동(예를 들어, myproject 라는 프로젝트를 생성시켰다면 myproject 폴더에서 command를 실행시키도록 한다.)하여 다음과 같이 명령어를 입력한다. 여기서는 core plugin을 설치할 것이므로 name 옵션의 값으로 'core'를 입력하여 core plugin 설치 작업을 진행한다.mvn anyframe:install -Dname=core31


Maven Commands위와 같이, Plugin install 명령어를 입력하면 설치하고자 하는 Plugin의 dependency 관계 및 현재 프로젝트에 설치여부를 파악하여 최종적으로 설치될 Plugin들의 목록을 출력해주고 사용자의 승인을기다린다. core plugin의 동작을 위해서는 datasource, logging, spring Plugin이 필요하므로 위와 같이출력될 것이다. 계속 설치를 진행하고자 하는 경우 'y'를 입력한다.Essential Pluginscore, datasource, logging, spring plugin은 필수 plugin으로, datasource, logging, springplugin은 단독으로 설치할 수 없고, core를 설치하면 4가지 plugin이 모두 설치된다.3. Plugin 설치 완료 후에는 어플리케이션 실행을 참조하여 정상 동작 여부를 확인하도록 한다.4. Command 창을 띄우고 샘플 프로젝트 설치 폴더로 이동하여 다음과 같은 명령어를 입력하면 샘플프로젝트를 대상으로 설치된 Plugin 목록을 확인할 수 있을 것이다.mvn anyframe:installedcore plugin과 동일한 방법으로 다른 Plugin들을 추가로 설치할 수 있다.또한 이미 설치된 Plugin이라 하더라도 다음과 같이 명령어에 version옵션을 추가하여 다른 버전으로교체할 수 있다. 이 경우 해당 Plugin이 참조하는 다른 Plugin(Dependent Plugin)도 호환되는 버전으로교체될 수 있다. Plugin 버전 변경으로 인해 관련된 참조라이브러리 버전도 변경될 수 있음에 유의한다.mvn anyframe:install -Dname=... -Dversion=...기존 Maven 사용자 유의 사항<strong>Anyframe</strong>에서는 Maven 기반에서 <strong>Anyframe</strong> 관련 라이브러리 다운로드시에 참조 관계에놓인 모든 <strong>Anyframe</strong> 및 3rd-party 라이브러리들이 한꺼번에 다운로드되는 현상을 막기 위해 각 라이브러리들 간의 참조 관계를 끊은 상태로 <strong>Anyframe</strong> Repository에 배포하고 있다.때문에 기존 Maven 사용자들은 Local Repository에 이미 존재하는 3rd-party 라이브러리가 가진 참조 관계에 문제가 생겨 <strong>Anyframe</strong> 설치시에 오류가 발생할 수 있다. 따라서 설치에 문제가 있는 경우에는 Local Repository를 삭제한 후 재설치해 볼 것을 권장한다.32


Maven Commands9.4.Plugin 삭제샘플 프로젝트를 대상으로 설치된 Plugin들은 삭제가 가능하다. 단, 삭제하고자 하는 Plugin을 다른Plugin이 사용하고 있는 경우에는 삭제할 수 없다. 이 경우, Dependency 관계를 가지는 Plugin들을 먼저삭제한 후에 본래 삭제하려고 했던 Plugin을 삭제해야한다.특정 Plugin 삭제를 요청한 경우 삭제 대상 Plugin 이름을 포함한 모든 폴더 및 파일들이 해당 프로젝트로부터 제거될 것이다. 따라서 특정 Plugin을 삭제하기 전에 개발을 진행하면서 추가한 리소스가 삭제대상에 포함되지 않는지 체크해 볼 것을 권장한다.1. Command 창을 열고 샘플 프로젝트 설치 폴더로 이동하여 다음과 같이 명령어를 입력한다.mvn anyframe:uninstall -Dname=...excludes 옵션을 사용하면 plugin 삭제 시에 삭제 대상에서 제외시킬 파일을 지정할 수 있다.삭제하려고 하는 Plugin을 나머지 Plugin에서 사용하고 있지 않다면 문제없이 삭제될 것이다.2. Command 창을 열고 샘플 프로젝트 설치 폴더로 이동하여 다음과 같은 명령어를 입력하면 해당Plugin이 정상적으로 삭제되었는지 확인할 수 있다.mvn anyframe:installed삭제된 plugin 관련 파일이나 디렉토리는 '[샘플 프로젝트 root 폴더]/uninstalled' 하위에 plugin을 삭제한 시점별로 디렉토리에 백업되어 있으므로 복구가 가능하다.9.5.Plugin 목록 조회설치할 수 있는 Plugin 목록을 조회하려면 다음과 같은 명령어를 사용한다.mvn anyframe:list33


Maven Commands설치 가능한 Plugin 목록은 Plugin Catalog 파일 기반으로 조회되는데 <strong>Anyframe</strong>에서는 먼저 해당 파일이'{user.home}/.anyframe' 디렉토리에 존재하는지 체크해 보고 있을 경우 해당 파일에 정의된 Plugin 정보를 활용하게 된다. 만일 '{user.home}/.anyframe' 디렉토리에 해당 파일이 존재하지 않으면 <strong>Anyframe</strong>Repository인 http://dev.anyframejava.org/maven/repo/에 있는 plugin-catalog-essential.xml과 plugincatalog-optional.xml파일을 '{user.home}/.anyframe' 디렉토리에 다운로드하고 이 파일을 활용하게 된다. 한번 다운로드한 Local의 Plugin Catalog 파일을 <strong>Anyframe</strong> Repository 내의 최신 Plugin Catalog 파일과 동기화하기 위해서는 Plugin Catalog Update를 참조하도록 한다.9.6.설치된 Plugin 목록 조회다음의 command를 실행하면 샘플 프로젝트를 대상으로 설치된 Plugin들의 이름과 버전 및 각 Plugin의 최신 버전 정보를 확인할 수 있다.mvn anyframe:installed설치된 Plugin 정보는 샘플 프로젝트 하위의 META-INF/plugin-installed.xml 파일에 기록된다.9.7.Plugin 정보 조회특정 Plugin의 상세한 정보를 조회하고자 하는 경우 다음과 같은 command를 이용하면 된다.34


Maven Commandsmvn anyframe:info -Dname=...예를 들어, core plugin의 상세 정보를 조회하면 아래와 같이 출력된다.Name : coreGroupId : org.anyframe.pluginArtifactId : anyframe-core-piLatest Version : x.x.xSamples : IncludedReleases : 1.0.0-SNAPSHOT,1.0.0.RC1,1.0.0,1.0.1-SNAPSHOT, 1.0.1, ...Dependencies : datasource(1.0.0-SNAPSHOT


Maven Commands9.10.DB 변경앞서 언급한 바와 같이 Plugin 설치를 통해 생성된 샘플 프로젝트는 기본적으로 hsqldb를 기반으로 동작하도록 구성되어 있다. 그런데 만약 샘플 프로젝트의 실행 DB를 변경하고자 원한다면 다음과 같은작업을 수행해야 한다. (현재 샘플을 제공하고 있는 <strong>Anyframe</strong> 플러그인은 hsqldb, oracle, sysbase, db2,mysql DB에 대해서만 동작하도록 지원하고 있다.)1. 설치된 샘플 프로젝트 설치 폴더 하위의 META-INF/project.mf 파일을 열고 기 정의된 DB 정보를 적절하게 수정한다.db.type=hsqldbdb.name=sampledbdb.schema=PUBLICdb.server=localhostdb.port=-1db.driver=org.hsqldb.jdbcDriverdb.url=jdbc:hsqldb:hsql://localhost/sampledbdb.userId=SAdb.password=db.lib=db/hsqldb/hsqldb-2.0.0.jardb.dialect=org.hibernate.dialect.HSQLDialectdb.groupId=hsqldbdb.artifactId=hsqldbdb.version=2.0.0위에 제시된 각 속성은 다음과 같은 의미를 지닌다.Propertydb.typedb.namedb.schemadb.serverdb.portdb.driverdb.urldb.userIddb.passworddb.libdb.dialectdb.groupIdDescription해당 DB에 대한 대표명을 정의한다. 특정 Plugin 설치 실행해야 할 DB 스크립트가 있다면 db.type 값을 포함하고 있는 스크립트 ({plugin name}-insert-data-{db.type}.sql, {plugin name}-delete-data-{db.type}.sql) 파일이 실행되도록 하는데 사용된다. (예를 들어, db.type이 oracle일 때 security plugin을 설치하면 security-insertdata-oracle.sql파일이 실행됨.)해당 DB의 이름을 지정한다.해당 DB의 Schema를 정의한다.해당 DB를 가진 서버의 IP를 정의한다.해당 DB를 위한 서버의 port를 정의한다.해당 DB에 대한 Driver Class명을 정의한다.해당 DB에 대한 URL을 정의한다.해당 DB에 접근하기 위한 User Id를 정의한다.해당 DB에 접근하기 위한 Password를 정의한다.해당 DB에 접근하여 Connection을 얻어오기 위해 참조해야 하는 DB Library 위치를 정의한다. (절대 경로 또는 샘플 프로젝트 위치 기준으로 상대 경로로 정의할 수있다. 상대 경로 정의시 ./src/main/..와 같은 형태나 src/main/..와 같은 형태로 정의하도록 한다. /src/main/..와 같은 형태로 정의하는 경우 절대 경로로 인식하여해당 파일을 찾지 못할 수 있다.) 샘플 어플리케이션 실행시 DB Library를 인식할수 있도록 하기 위해서 [샘플 프로젝트 설치 폴더]/src/main/webapp/WEB-INF/lib폴더 내에 저장할 것을 권장한다.해당 DB의 Hibernate Dialect 클래스를 정의한다.Maven Repository 내에 존재하는 해당 DB의 Library에 대한 groupId를 정의한다.(Maven을 활용하는 경우에 한정됨.)36


Maven CommandsPropertydb.artifactIddb.versionDescriptionMaven Repository 내에 존재하는 해당 DB의 Library에 대한 artifactId를 정의한다.(Maven을 활용하는 경우에 한정됨.)Maven Repository 내에 존재하는 해당 DB의 Library에 대한 version을 정의한다.(Maven을 활용하는 경우에 한정됨.)db.schema.use 해당 DB가 Sybase DB일 경우, 지정해야 하는 속성으로 User 정보 셋팅시 DBSchema 정보를 사용할지 여부를 정의한다. 단, Sybase 버전에 따라 속성값은 변경될 수 있음에 유의하도록 한다. (default=false)2. Command 창을 띄운 후, 샘플 프로젝트가 있는 위치로 이동하여 다음과 같이 Maven 명령어를 입력함으로써 앞서 수정한 DB 정보에 맞게 현재까지 설치된 Plugin의 모든 DB 관련 리소스들을 수정할 수 있다.mvn anyframe:change-db3. DB 관련 설정 정보가 정상적으로 변경되었는지 확인한다.프로젝트 코드 내 DataSource Service 설정 정보 및 Hibernate, Query Service 관련 정보들이 변경되었는지 확인한다.9.11.Domain 소스 코드 생성<strong>Anyframe</strong> 4.6.0 이후부터 새롭게 추가된 기능으로 이미 만들어져 제공된 Plugin들을 설치하는 작업 외에 새로 개발할 어플리케이션을 위해 구성된 DB 테이블을 기반으로 Domain 클래스를 생성할 수 있다.(이어질 설명에서는 기본적인 Command 사용법만을 언급하고 있으므로 <strong>Anyframe</strong> Commmand Option에 대한 자세한 내용은 Command 목록내에 제시된 해당 Command의 설명을 참고하도록 한다.)<strong>Anyframe</strong>에서 기본적으로 제공하는 SampleDB 내에 포함된 모든 테이블을 대상으로 Domain 클래스를 생성해 보도록 하자.1. Command 창을 띄운 후, 샘플 프로젝트가 있는 위치로 이동하여 다음과 같이 Maven 명령어를 입력함으로써 특정 테이블과 매핑되는 Domain 클래스를 생성시킬 수 있다.mvn anyframe:create-model• ex) mvn anyframe:create-model -Dtable="*" -Dpackage=com.sds.emp.domain위 예제는 모든 테이블에 대해 Domain Class를 생성하되, 프로젝트 생성 시 지정한 대표 패키지(ex. com.sds.emp) 하위의 domain 패키지 내에 생성하는 command 이다.해당 DB에 속한 전체 테이블이 아닌 특정 테이블에 대해서만 Domain 클래스를 생성하고자 할 경우에는 다음과 같이 -Dtable={table명}을 직접 입력해주면 된다.mvn anyframe:create-model -Dtable=BOARD_MASTER,BOARD또한 해당 테이블에 대해 이미 생성된 Domain 클래스가 있을 경우에는 다음과 같이 overwrite할지 묻게 될 것이다. overwrite하지 않고 싶으면 "N"를 입력하여 Domain 클래스 생성 작업을 종료할 수 있다.2. Domain 클래스가 정상적으로 생성되었는지 확인한다.37


Maven CommandsDomain 클래스 생성시 지정한 패키지 내에, camelcase 적용된 테이블 이름의 도메인 클래스가 존재하면 성공적으로 생성된 것이다. 다음은 BOARD 테이블과 매핑되는 Board.java 코드의 일부분이다.@Entity@Table(name = "BOARD")//@Table의 schema 속성은 default 템플릿을 활용하여//sybase DB와 hibernate dao framework을 사용할때 정의됨//@Table의 catalog 속성은 catalog 정보가 존재할 경우 정의됨public class Board implements Serializable {private BoardId id = new BoardId();private BoardMaster boardMaster;private String boardName;중략...public BoardId getId() {return this.id;}public void setId(BoardId id) {this.id = id;}@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "BOARD_MASTER_ID", nullable = false,insertable = false, updatable = false)public BoardMaster getBoardMaster() {return this.boardMaster;}public void setBoardMaster(BoardMaster boardMaster) {this.boardMaster = boardMaster;}@Column(name = "BOARD_NAME", nullable = false, length = 150)public String getBoardName() {return this.boardName;}public void setBoardName(String boardName) {this.boardName = boardName;}}3. 자동생성되는 Domain 클래스 소스 코드에 대해서 각 개발자 혹은 프로젝트 상황에 맞게 템플릿 파일을 수정하여 사용할 수 있다.템플릿 확장에 관한 상세한 내용은 Template Customizing를 참고하도록 한다. Maven의 경우, 템플릿 파일들은 '{user.home}/.anyframe/templates' 디렉토리에 존재하고 이중 Domain 클래스에 대한템플릿 파일은 templates 하위의 [템플릿명]/source/model 폴더 내에 있으므로 수정 시 활용하도록한다. (Pojo.ftl 등)<strong>9.12.CRUD</strong> 소스 코드 생성DB 테이블을 기반으로 생성한 Domain 클래스를 통해 기본 CRUD 기능을 수행하는 소스 코드들을 생성할수 있다. (이어질 설명에서는 기본적인 Command 사용법만을 언급하고 있으므로 <strong>Anyframe</strong> CommmandOption에 대한 자세한 내용은 Command 목록내에 제시된 해당 Command의 설명을 참고하도록 한다.)앞서 생성한 Domain 클래스 중 하나를 선택하여 CRUD 소스 코드를 생성해 보도록 하자.CRUD 소스 코드가 정상적으로 자동 생성되지 않는 경우CRUD 소스 코드가 정상적으로 생성되지 않는 경우, {user.home}/.anyframe/templates에존재하는 소스 코드 템플릿 파일에 문제가 있을 수도 있으므로 이 디렉토리를 삭제한 후에 다시 anyframe:create-crud command를 실행시켜 보기를 권장한다.38


Maven Commands1. Command 창을 띄운 후, 샘플 프로젝트가 있는 위치로 이동하여 다음과 같이 Maven 명령어를 입력함으로써 특정 Domain을 중심으로 기본적인 CRUD 기능을 수행하는 소스 코드들을 생성할 수 있다.또한 package 옵션을 이용하면 생성될 CRUD 관련 코드들의 package를 지정할 수 있다.mvn anyframe:create-crud -Dentity=...예를 들어, 'mvn anyframe:create-crud -Dentity=Board'라고 실행하면 Board 객체를 CRUD 할 수 있는소스코드를 생성하게 된다.해당 Domain 클래스에 대해 이미 생성된 CRUD 소스 코드가 있을 경우에는 다음과 같이 overwrite할지 묻게 될 것이다. overwrite하지 않고 싶으면 "N"를 입력하여 CRUD 소스 코드 생성 작업을 종료할 수 있다.또한, 비즈니스 레이어 코드만 생성하고자 하는 경우 아래와 같이 -scope 옵션을 추가하여 명령어를 실행할 수도 있다.mvn anyframe:create-crud -Dentity=Board -Dscope=servicescope 옵션에 대한 상세한 내용은 Command 목록을 참조하길 바란다.2. 비즈니스 레이어 코드(서비스인터페이스, 서비스구현클래스, DAO구현클래스 등)가 정상적으로 생성되었는지 확인한다.다음은 도메인 클래스 Board.java를 기반으로 생성된 자바 코드와 속성파일 등의 일부분이다.• 서비스 인터페이스 (src/main/java/{대표패키지}/{package}/service/{Entity 클래스명}Service.java)public interface BoardService{void create(Board board) throws Exception;void remove(BoardId id) throws Exception;...}• 서비스 구현클래스 (src/main/java/{대표패키지}/{package}/service/impl/{Entity 클래스명}ServiceImpl.java)@Service("boardService")@Transactional(rollbackFor = {Exception.class}, propagation = Propagation.REQUIRED)public class BoardServiceImpl implements BoardService {@Inject@Named("boardDao")private BoardDao boardDao;public void create(Board board) throws Exception {this.boardDao.create(board);39


Maven Commands}}public void remove(BoardId id) throws Exception {this.boardDao.remove(id);}...• DAO 클래스 (src/main/java/{대표패키지}/{package}/service/impl/{Entity 클래스명}Dao.java)@Repository("boardDao")public class BoardDao extends SimpleJdbcDaoSupport {@Value("#{contextProperties['pageSize'] ?: 10}")int pageSize;@Value("#{contextProperties['pageUnit'] ?: 10}")int pageUnit;@Injectpublic void setJdbcDaoDataSource(DataSource dataSource) throws Exception {super.setDataSource(dataSource);}public void create(Board board) throws Exception {String sql = "INSERT INTO BOARD (BOARD_ID, BOARD_DESC, BOARD_MASTER_ID,BOARD_NAME, BOARD_ORDER, BOARD_TOPICS, REG_DATE) "+ "VALUES (?, ?, ?, ?, ?, ?, ?)";this.getSimpleJdbcTemplate().update(sql,new Object[] {board.getId().getBoardId(),board.getBoardDesc(), board.getId().getBoardMasterId(),board.getBoardName(), board.getBoardOrder(),board.getBoardTopics(), board.getRegDate()});}public void remove(BoardId id) throws Exception {String sql = "DELETE FROM BOARD WHERE BOARD_ID = ? AND BOARD_MASTER_ID = ?";this.getSimpleJdbcTemplate().update(sql, new Object[] {id.getBoardId(),id.getBoardMasterId()});}...}• MessageSoruce (src/main/resources/message/message-generation.properties)# -- Board-STARTboard.id.boardId=Board Idboard.id.boardMasterId=Board Master Idboard.boardDesc=Board Descboard.boardName=Board Nameboard.boardOrder=Board Orderboard.boardTopics=Board Topicsboard.regDate=Reg Date# -- success messages --success.board.create=Board has been added successfully.success.board.update=Board has been updated successfully.success.board.delete=Board has been deleted successfully.# -- error messages --40


Maven Commandserror.boardserviceimpl.create=Board data not createderror.boardserviceimpl.create.solution=Enter correct data for mandatory fieldor enter data according to formats means date format as yyyy-mm-dderror.boardserviceimpl.create.reason=Entered incorrect data for Board...• 통합 테스트케이스 (src/test/java/{대표패키지}/{package}/service/{Entity 클래스명}ServiceTest.java)@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = { "file:./src/main/resources/spring/context-*.xml" })public class BoardServiceTest{@Inject@Named("boardService")private BoardService boardService;@Test@Rollback(value=true)public void manageBoard() throws Exception {//1. create a new boardBoard board = getBoard();if(boardService.get(board.getId()) != null)boardService.remove(board.getId());}}...boardService.create(board);...참고META-INF/project.mf 에서 project.daoframework 값을 변경하지 않았을 경우 기본DAO Framework은 springjdbc로 설정되어 있다. (위에서 보여준 DAO 구현 클래스는springjdbc로 설정되어 있는 경우의 모습이다.) 설정할 수 있는 DAO Framework로는springjdbc, query, hibernate, ibatis2 가 있다.META-INF/project.mf 에서 project.daoframework 값을 "hibernate"으로 설정하여 DAOFramework으로 Hibernate을 채택한 경우, 생성된 CRUD 소스 코드는 Hibernate을 사용하는 형태를 갖추게 될 것이다. 단, <strong>Anyframe</strong> Hibernate Plugin이 설치되어야만 생성된코드가 정상 동작할 수 있다.마찬가지로 <strong>Anyframe</strong> IDE를 통해서 생성할 소스코드의 Template Type을 디폴트로 지정된 값 이외의 값으로 설정하고 싶은 경우에도 이와 관련된 <strong>Anyframe</strong> Plugin이 설치되어 있어야 생성된 프로젝트가 정상적으로 동작할 수 있다.예를 들어, Template type을 'miplatform'으로 선택하여 소스코드를 생성하고자 하는 경우, 프로젝트 설정 파일(project.mf)의 project.template의 값을 miplatform으로 변경하는 것 뿐만 아니라 <strong>Anyframe</strong>의 miplatform Plugin을 설치하여야 한다.3. 프리젠테이션 레이어 코드 (비즈니스 서비스와 통신을 하기 위한 컨트롤러 클래스, JSP 등)가 정상적으로 생성되었는지 확인한다.다음은 도메인 클래스 Board.java를 기반으로 생성된 컨트롤러, JSP 등의 일부분이다.• 컨트롤러 (src/main/java/{대표패키지}/{package}/web/{Entity 클래스명}Controller.java)@Controller41


Maven Commands@RequestMapping("/board.do")public class BoardController {@Inject@Named("boardService")private BoardService boardService;...@RequestMapping(params = "method=createView")public String createView(Model model) throws Exception {model.addAttribute(new Board());}}return "generation/board/form";• JSP (src/main/webapp/WEB-INF/jsp/generation/{Entity 클래스명(소문자)}/*.jsp)Home &gt; Boardfunction fncCreateBoardView() {document.location.href="";}...• 단위 테스트케이스 (src/test/java/{대표패키지}/{package}/web/{Entity 클래스명}ControllerTest.java)@RunWith(JMock.class)public class BoardControllerTest {private BoardController controller;private String SUCCESS_CREATEVIEW = "generation/board/form";private String SUCCESS_CREATE = "redirect:/board.do?method=list";private String SUCCESS_GET = "generation/board/form";private String SUCCESS_UPDATE = "redirect:/board.do?method=list";private String SUCCESS_LIST = "generation/board/list";private String SUCCESS_REMOVE = "redirect:/board.do?method=list";private Mockery context = new JUnit4Mockery();private BoardService mockService = null;@Beforepublic void setUp() throws Exception {System.setProperty("log4j.configuration", "log4j-test.xml");}this.mockService = context.mock(BoardService.class);this.controller = new BoardController();this.controller.setBoardService(this.mockService);public void setBoardController(BoardController controller) {this.controller = controller;42


Maven Commands}@Testpublic void testCreateView() throws Exception{String viewName = this.controller.createView(new ExtendedModelMap());}...assertEquals("returned correct view name", SUCCESS_CREATEVIEW, viewName);4. CRUD 소스 코드 생성 후에는 어플리케이션 실행을 참조하여 정상 동작 여부를 확인하도록 한다.주의 사항anyframe-service-archetype으로 생성된 서비스 타입의 프로젝트일 경우, hibernate나miplatform plugin 설치 시에 관련 spring 설정 파일(context-*.xml)이 설치되지 않는다. 따라서, dao framework을 hibernate으로 설정하거나, 소스 코드 template type을 miplatform으로 선택하여 소스코드를 생성한 경우, 관련 속성 파일이 존재하지 않아서 자동 생성된테스트 케이스는 수행시 오류가 발생하게 된다. "Fail to ApplicationContext..." 에러가 발생하면 hibernate나 miplatform plugin의 spring 설정 파일을 추가해 주도록 한다.9.12.1.CRUD 소스코드 생성 후 런타임 시 발생하는에러 해결 TipCRUD 소스코드는 정상적으로 생성되었지만 런타임시에 발생할 수 있는 문제에 대해서 해결방법을 알아본다.• map 소스코드 템플릿 + oracle DB + query dao framework을 사용할 때 timestamp 타입의 데이터가 있는 경우• 현상) 입력/수정 화면에서 create/update 할 때 ORA-01843 : not a valid month 에러 발생• 원인) 쿼리문에서 timestamp 타입 format을 지정해야 함• 해결책)create/update 쿼리의 timestamp 타입 컬럼에 아래와 같이 포맷적용to_timestamp(timestamp 타입 컬럼,'yyyy-mm-dd hh24:mi:ssxff')• map 소스코드 템플릿 + hsqldb DB를 사용할때 bit 타입 데이터가 있는 경우• 현상) 입력/수정 화면에서 create/update 할 때 java.sql.SQLException 에러 발생• 원인) bit타입 컬럼의 값은 DB에 1 또는0으로 저장되어야 하는데, 화면에서는 true/false(또는 null)값을 사용하기 때문에 invalid character value for cast exception 발생• 해결책) bit타입 컬럼에 대해 controller 나 service 에서 true/false(또는 null)로 넘겨오는 값을 1 또는 0으로 변환하는 로직 추가해야 함// j 컬럼이 bit 타입인 경우if (hashMapModel.getMap().get("j") != null &&hashMapModel.getMap().get("j").equals("true"))hashMapModel.getMap().put("j", "1");elsehashMapModel.getMap().put("j", "0");• time 타입 데이터가 있는 경우• 현상) 입력/수정 화면에서 create/update 할 때 Fali to convert 오류 발생43


Maven Commands• 원인)Time 타입 데이터(시:분:초)가 request parameter에 String으로 담겨지기 때문에, Domain 클래스와 Binding 될때 데이터 바인딩이 되지 않음• 해결책)Domain 클래스에서 time 타입 컬럼을 string 타입으로 선언하여 사용9.12.2.Template CustomizingMaven의 경우, 템플릿 파일들은 '{user.home}/.anyframe/templates' 디렉토리에 존재하고 CRUD 소스코드 생성에 관련된 템플릿 파일은 templates 하위의 [템플릿명]/source 폴더 내에 있으므로 수정 시활용하도록 한다. templates 폴더를 살펴보면 아래와 같이 default,map, miplatform 폴더가 존재하고 그하위로 각각 source 폴더가 존재하고 있음을 확인할 수 있다.소스 코드 템플릿을 확장한다는 것은 <strong>Anyframe</strong> IDE를 통해 생성되는 도메인 클래스, CRUD 소스 코드에대해서 각 개발자 혹은 프로젝트 상황에 맞게 수정하여 사용할 수 있다는 것으로 여기서는 FreeMarkerTemplate을 수정함으로써 소스 코드 템플릿을 확장할 수 있다. FreeMarker에 대한 자세한 내용은FreeMarker 사이트 [http://freemarker.org/] 를 참조하도록 한다.프로젝트의 타입(Web/Service) 정보와는 무관하게 소스 코드 템플릿 확장 방법은 동일하다. 단 템플릿파일 목록 작성 시 타입 정보를 다르게 구분하여 설정해주면 된다.9.12.2.1.템플릿 폴더 생성FreeMarker Template(*.ftl) 파일들을 수정하여 자동 생성되는 소스 코드에 대한 템플릿을 확장해보도록 한다. default 템플릿을 확장하여 ext 템플릿을 구성해보자.[Template Home]/default 폴더 전체를 복사한 후 이름을 ext로 변경시켜서 [Template Home]/ext 폴더를 만들고 [Template Home]/ext/source 폴더 하위의 template.config 파일이 있는지 확인한다.9.12.2.2.템플릿 파일 목록 작성(template.config)template.config 파일을 열고 소스 코드 생성에 필요한 템플릿 파일 목록을 작성한다. template.config 파일 내 작성되는 정보는 소스 코드 생성 시 필요한 코드 템플릿 목록 정보로 default 템플릿을 통해 제공되는 템플릿 정보는 다음 표와 같다. 타입 별 템플릿 파일에 대한 설명으로, template.config 파일 내 템플릿목록으로 작성되어야 CRUD 소스 코드 생성 시 결과 코드로 생성된다. service 타입 템플릿은 BusinessLayer 코드 생성 시 사용되는 템플릿이고, web 타입 템플릿은 Presentation Layer 코드 생성 시 사용된다.template.config 파일 내 템플릿 정보 등록 시 아래와 같은 항목 내용을 작성하도록 한다.• type: service, web 타입• ftl: freemarker template 파일• src: 생성될 소스 코드 파일 명• {basepkg-name} : 대표패키지• {class-name} : 엔티티 클래스 명• mergeSrc: 생성된 소스 코드를 반영할 파일명• mergeKey: 생성된 소스 코드를 반영할 위치정보 key• share: sample db data 공유 여부를 true, false로 설정• dao: springjdbc, query, hibernate, ibatis2 중 dao framework 설정• description: 템플릿 설명44


Maven Commands표 9.1. Service Type template configuration 일부 예시 (소스 코드)type ftl src mergeSrc mergeKey share dao descriptionservice service/ src/test/java/servicetest.ftname}/service/{basepkg-{classname}ServiceTest.javaservice service/ src/main/java/service.ftl {basepkgname}/service/{classname}Service.javaservice service/ src/main/java/serviceimpl.ftname}/service/{basepkg-impl/{classname}ServiceImpl.javaservice dao/ src/main/java/springjdbc/ {basepkgname}/service/dao.ftlimpl/{classname}Dao.javaservice dao/ src/main/java/hibernate/ {basepkgname}/service/dao.ftlimpl/{classname}Dao.javaservice dao/query/dao.ftlsrc/main/java/{basepkgname}/service/impl/{classname}Dao.javaservice dao/ src/main/java/ibatis2/ {basepkgname}/service/dao.ftlimpl/{classname}Dao.javatrue N/A service 에 대한통합 test casefalse N/A serviceinterface classfalse N/A serviceimplementationclassfalsespringjdbcspring jdbc daoimplementationclassfalse hibernatehibernate daoimplementationclassfalse query query daoimplementationclassfalse ibatis2 ibatis2 daoimplementationclass45


Maven Commands표 9.2. Service Type template configuration 일부 예시 (설정 파일)type ftl src mergeSrc mergeKey share dao descriptionservice dao/ merge/{class-sampledata.ftname}-sampledata.xmlservice dao/query/src/main/resources/sql/service dao/ src/main/hibernate/ resources/dynamic-hibernatehibernate.ftldynamic-hibernate-{classname}.xmlmapping-query/mappingquery.ftquery-{classnamelower}.xmlservice web/ merge/{class-/src/main/ApplicationResources.ftlname}- resources/ApplicationResources.propertiesmessage/messagegeneration.properties/src/test/resources/sampledata.xml# -- {classname}-STARTfalse N/A test sample dbdatafalsehibernatehibernatedynamic hqlmapping xml filefalse query query servicemapping xml filefalse N/A messagesourceproperties 파일46


Maven Commands표 9.3. Web Type template configuration 일부 예시type ftl src mergeSrc mergeKey share dao descriptionwebweb/ src/test/java/spring/ {basepkgname}/web/controllertest.ftl{classname}ControllerTest.javafalse N/A spring mvccontroller classtest casewebweb/ src/main/java/spring/ {basepkgname}/web/controller.ftl{class-name}Controller.javafalse N/A spring mvccontroller classwebweb/spring/listview.ftlsrc/main/webapp/WEB-INF/jsp/generation/{class-namelower}/list.jspfalse N/A list view jsppagewebweb/spring/formview.ftlsrc/main/webapp/WEB-INF/jsp/generation/{class-namelower}/form.jspfalse N/A detail view jsppagewebweb/ merge/{class-menu.ftlname}-menu.jsp/src/main/webapp/sample/layouts/gen/left-gen.jspfalse N/A menu jsp page9.12.2.3.템플릿 파일(*.ftl) 수정[Template Home]/ext/source 폴더 하위에서 확장하고 싶은 ftl 파일들을 선정하여 수정하도록 한다.source 폴더 하위에 있는 ftl 파일들은 원하는 폴더로 묶어서 관리할 수 있다. 현재에는 다음 표와 같이4개의 폴더(model, service, dao, web)로 구분되어 있다. 자유롭게 변경할 수 있다. 단, 폴더명과 ftl 파일명 변경 시 위에서 설명한 template.config 파일 내 ftl 항목 내용도 반드시 변경시켜줘야 한다.표 9.4. template folderfolder namemodelservicedaowebdescription도메인 클래스 생성 시 사용되는 ftl들 존재service 클래스/테스트 케이스 및 Spring bean 설정 파일 ftl들 존재샘플 데이터, hibernate/query dao 클래스 및 Spring bean 설정 파일 ftl들 존재메뉴, message resource, spring mvc 클래스/테스트 케이스 및 Spring bean 설정 파일, JSP ftl들 존재예를 들어 service 생성 시 기본 CRUD 메소드 외 다른 메소드를 추가해보자.• [Template Home]/ext/source/service/service.ftl 파일을 열어 다음과 같이 getProcedureList 메소드를 추가한다.47


Maven CommandsgetProcedureList의 리턴 타입이 List 이므로 클래스 상단에 import 구문을 추가해줘야 함에 유의하도록 한다.package ${package}.service;import java.util.List;import anyframe.common.Page;import anyframe.common.util.SearchVO;중략...import ${pojo.packageName}.${pojo.shortName};public interface ${pojo.shortName}Service{void create(${pojo.shortName} ${pojoNameLower}) throws Exception;List getProcedureList(SearchVO searchVO) throws Exception;}이 ftl 구문 내에서 클래스, 메소드 등의 이름을 변경하거나 내용을 수정할 수 있다. serviceinterface(service.ftl) 클래스에 대한 내용 수정 시 service implementation(service-impl.ftl) 클래스에 대한 내용도 함께 수정해줘야 함에 유의하도록 한다.• [Template Home]/ext/source/service/service-impl.ftl 파일을 열어 다음과 같이 getProcedureList 메소드를 추가한다.getProcedureList의 리턴 타입이 List 이므로 클래스 상단에 import 구문을 추가해줘야 함에 유의하도록 한다.package ${package}.service.impl;import java.util.List;import anyframe.common.Page;import anyframe.common.util.SearchVO;import ${package}.service.${pojo.shortName}Service;중략...public class ${pojo.shortName}ServiceImpl implements ${pojo.shortName}Service {@Inject@Named("${pojoNameLower}Dao")${pojo.shortName}Dao ${pojoNameLower}Dao;public void create(${pojo.shortName} ${pojoNameLower}) throws Exception {this.${pojoNameLower}Dao.create(${pojoNameLower});}public List getProcedureList(SearchVO searchVO) throws Exception{중략...}}9.12.2.4.템플릿 파일(*.ftl) 변수템플릿 파일(*.ftl)을 수정하기 위해서는 일반 문자열 자체를 변경하여 클래스나 메소드 명을 변경시킬수도 있으나 템플릿 파일 내 사용되는 변수(${변수명})를 이용하여 수정 시 좀더 다양하게 템플릿을 확장시킬 수 있다.48


Maven Commands다음은 템플릿 파일 내에서 자주 사용되는 변수에 대한 설명을 표로 나타낸 것이다.표 9.5. FTL 파일 내 변수 목록namepojo.shortNamepojoNameLowerpojo.packageNamepackagepojo.identifierProperty.namedescriptionCRUD 대상이 되는 도메인 클래스명(ex. Board)CRUD 대상이 되는 도메인 클래스명의 소문자 형태(ex. board)CRUD 대상이 되는 도메인 클래스의 패키지명소스 코드 생성 시 생성되는 클래스의 상위 패키지로 어플리케이션 대표 패키지명도메인 클래스의 Primary Key에 해당하는 속성명다음은 아래와 같이 사용되는, 템플릿 파일 내에서 FreeMarker 구문을 통해 사용되는 로직에 대한 설명을 표로 나타낸 것이다.


Maven Commands표 9.6. FTL 파일 내 로직logicpojo.getAllPropertiesIterator()c2j.isComponent(pojo.identifierProperty)c2j.isComponent(field)c2h.isCollection(field)c2h.isManyToOne(field)dbdata.getSampleDataSet(pojo)description도메인 클래스의 모든 속성 정보를 얻어냄도메인 클래스의 Primary Key에 해당하는 속성이Composite Key 클래스로 구성되었는지 여부를 리턴함도메인 클래스의 해당 field 속성이 primitive type이아닌 클래스로 구성되었는지 여부를 리턴함도메인 클래스의 해당 field 속성이 Collection 클래스로 구성되었는지 여부를 리턴함도메인 클래스의 해당 field 속성이 many to one 관계에 있는지 여부를 리턴함DB 테이블 별 컬럼값에 해당하는 샘플 데이터 값을 얻어냄참고pojo(POJOClass), c2j(Cfg2JavaTool), c2h(Cfg2HbmTool), data(<strong>Anyframe</strong>DataHelper),dbdata(<strong>Anyframe</strong>DBData), util(StringUtils) 등은 템플릿 파일 내에서 각 클래스의 메소드를호출하여 로직을 수행할 수 있도록 해주는 변수들로 <strong>Anyframe</strong> IDE 내에서 설정해주고 있다. 현재 제공되는 템플릿 파일내에서 사용되고 있는 모습을 참조하여 작성하도록 한다.9.12.2.5.변경된 템플릿 파일(*.ftl) 적용확장된 ftl 파일을 실제 CRUD 소스 코드 생성 시 사용해본다.CLI 혹은 Eclipse Plugin 툴을 이용하여 CRUD 소스 코드를 생성시켜서 변경된 템플릿 파일이 정상적으로 반영되었는지 확인한다. 소스 코드 생성 시 에러가 발생하지 않고, 실제 어플리케이션을 구동시켜서 정상적으로 동작해야 한다.9.13.참조 라이브러리 다운로드Maven 기반의 프로젝트는, pom.xml에 프로젝트에서 참조하는 dependency 라이브러리를 정의하고Maven Local Repository에 실제 라이브러리의 바이너리 파일들이 존재하는 형태로 빌드를 수행한다.그런데, 다음의 command를 실행하면 pom.xml에 정의된 dependency 라이브러리를 모두 WEB-INF/lib폴더로 다운로드해준다.mvn anyframe:inplace9.14.어플리케이션 실행특정 Plugin 설치 후 또는 코드 자동 생성 결과로 구성된 샘플 어플리케이션이 정상적으로 동작하는지확인하기 위해서는 Command 창에 명령어를 직접 입력하거나 Eclipse를 이용할 수 있다.다음에서는 Maven Command를 직접 입력하거나 Eclipse를 이용하여 샘플 어플리케이션을 시작시키는방법에 대해서 살펴보도록 한다. (본 문서에서는 Jetty, Tomcat을 기준으로 설명이 진행된다.)샘플 어플리케이션의 정상 동작 여부를 체크하기 위해서는 먼저 사용할 DB가 시작되어 있어야 한다.<strong>Anyframe</strong> Plugin 설치로 구성되는 샘플 프로젝트는 기본적으로 hsqldb를 사용하도록 구성되어 있다. 따라서, [샘플 프로젝트 설치 폴더]/db/hsqldb/start.cmd (or start.sh) 파일을 더블 클릭하여 DB를 시작시키도록 한다. (hsqldb가 아닌 다른 DB를 사용하고자 하면 DB 변경 방법을 참조하도록 한다.) [샘플50


Maven Commands프로젝트 설치 폴더]/db/hsqldb 폴더 내에 제공되는 sqltool.cmd (or sqltool.sh) 파일은 hsqldb용 SQLEditor를 시작시키는 용도로 제공된다. DB 작업 수행 후 결과를 확인하고자 할 때 유용하게 활용할 수있을 것이다.9.14.1.Jetty 기반의 어플리케이션 실행1. Command 창을 띄운 후, 샘플 프로젝트 설치 폴더 위치로 이동하여 다음과 같이 Maven 명령어를 입력하면 Jetty 기반에서 샘플 어플리케이션을 시작시킬 수 있다.mvn clean jetty:run2. Jetty가 정상적으로 실행되면 Started Jetty Server라는 INFO 레벨의 로그가 콘솔창에 보일 것이다.(TestCase에서 JMock클래스 때문에 컴파일 오류가 발생하는 경우, Ctrl+C키를 이용해서 Jetty서버를 중지하고, Command창에서 'mvn anyframe:install -Dname=test'를 실행하여 test Plugin을 설치한후 다시 Jetty를 실행시킨다.)3. WAS가 정상적으로 시작되었으면 웹브라우저를 열고, 주소창에 http://localhost:8080/myproject(http://localhost:8080/${샘플 프로젝트 이름})와 같이 입력하여 샘플 어플리케이션이 정상적으로실행되는지 확인해본다. 다음은 core plugin만 설치된 경우 샘플 어플리케이션의 초기 화면이다.Plugin이 추가 설치될 때마다 테이블의 왼쪽 Installed Plugins 칸에 추가된 Plugin에 대한 샘플을 확인할 수 있도록 링크가 추가될 것이다. CRUD 소스 코드를 자동으로 생성시키면 테이블의 오른쪽Generated CRUD Codes 칸에 만들어진 기능을 확인할 수 있는 링크가 추가된다.다음은 Core 링크를 클릭하였을 때 이동한 페이지의 모습이다.9.14.2.Eclipse WTP, m2eclipse를 이용하여 Tomcat기반의 어플리케이션 실행Eclipse를 이용하여 샘플 어플리케이션을 실행시키려는 경우 Eclipse에서 Maven 관련 작업을 수행할 수있도록 지원하는 m2eclipse plugin을 설치할 것을 권장한다. m2eclipse plugin이 미설치된 경우, UpdateSite (m2eclipse core update site : http://m2eclipse.sonatype.org/sites/m2e, m2eclipse extras updatesite : http://m2eclipse.sonatype.org/sites/m2e-extras)를 통해 설치할 수 있다. m2eclipse plugin을 설치하지 않고 Eclipse WTP만을 이용하여 샘플 어플리케이션을 실행시키고자 하는 경우에는 본 문서의Eclipse WTP만을 이용하여 Tomcat 기반의 어플리케이션 실행 방법을 참조하도록 한다.1. 설치된 샘플 프로젝트를 Eclipse 내로 import한 이후 해당 프로젝트에 대해 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴에서 Maven > Enable Dependency Management를 선택함으로써 샘플 프로젝51


Maven Commands트 관련 컴파일 에러를 해결하도록 한다. (※ 간혹 Enable Dependency Management를 적용하고 나면프로젝트의 Build Path에서 src/main/resources의 내용이 exclude되어 문제가 발생하는 경우가 있다. 이 때는, 해당 프로젝트에 대해 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴에서 Build Path >Configure Build Path... 메뉴를 클릭하여 Source 탭에서 src/main/resources의 'Excluded:**'를 선택하고 오른쪽에 Remove 버튼을 클릭하여 exclude 설정을 해제한다. TestCase가 정상적으로 동작할수 있도록 src/test/resources/의 'Exclude:**' 도 같은 방법으로 조치한다.) (TestCase에서 JMock클래스 때문에 컴파일 오류가 발생하는 경우, Command창에서 'mvn anyframe:install -Dname=test'를실행하여 test Plugin을 설치하고, Eclispe에서 해당 프로젝트를 Refresh한다.)2. 이 후, 해당 프로젝트에 대해 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴에서 Run As > Run onServer를 선택함으로써 Tomcat Server에 어플리케이션을 배포하여 샘플 어플리케이션이 정상적으로 실행되는지 확인해본다.3. 다음은 core plugin만 설치된 경우 샘플 어플리케이션의 초기 화면이다.Plugin이 추가 설치될 때마다 테이블의 왼쪽 Installed Plugins 칸에 추가된 Plugin에 대한 샘플을 확인할 수 있도록 링크가 추가될 것이다. CRUD 소스 코드를 자동으로 생성시키면 테이블의 오른쪽Generated CRUD Codes 칸에 만들어진 기능을 확인할 수 있는 링크가 추가된다.다음은 Core 링크를 클릭하였을 때 이동한 페이지의 모습이다.9.14.3.Eclipse WTP만을 이용하여 Tomcat 기반의 어플리케이션 실행Eclipse WTP만을 이용하여 Maven Project가 아닌 일반 Dynamic Web Project 형태로 샘플 어플리케이션을 실행시키기 위해서는 해당 어플리케이션에서 참조 라이브러리를 인식할 수 있도록 필요한 라이브러리를 [샘플 프로젝트 설치 폴더]/src/main/webapp/WEB-INF/lib 폴더에 추가해주는 작업이 필요하다.1. Command 창을 띄운 후, 샘플 프로젝트가 있는 위치로 이동하여 다음과 같이 Maven 명령어를 입력함으로써 해당 어플리케이션이 참조하는 라이브러리들을 [샘플 프로젝트 설치 폴더]/src/main/webapp/WEB-INF/lib 폴더에 복사할 수 있다.mvn anyframe:inplace2. 설치된 샘플 프로젝트를 Eclipse 내로 import한 이후 해당 프로젝트에 대해 컴파일 에러가 존재하지않는지 체크한다. 그리고 해당 프로젝트에 대해 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴에서Run As > Run on Server를 선택함으로써 Tomcat Server에 어플리케이션을 배포하여 샘플 어플리케이션이 정상적으로 실행되는지 확인해본다.3. 다음은 core plugin만 설치된 경우 샘플 어플리케이션의 초기 화면이다.52


Maven CommandsPlugin이 추가 설치될 때마다 테이블의 왼쪽 Installed Plugins 칸에 추가된 Plugin에 대한 샘플을 확인할 수 있도록 링크가 추가될 것이다. CRUD 소스 코드를 자동으로 생성시키면 테이블의 오른쪽Generated CRUD Codes 칸에 만들어진 기능을 확인할 수 있는 링크가 추가된다.다음은 Core 링크를 클릭하였을 때 이동한 페이지의 모습이다.대상이 되는 샘플 어플리케이션을 기준으로 특정 Plugin이 설치/삭제될 때마다 참조 라이브러리에 대해 변경 사항이 발생하게 된다. 따라서 Eclipse WTP만 이용하여 Tomcat을 실행하는 경우 변경된 사항을 해당 어플리케이션에 반영하기 위해서는 매번 Maven 명령어(mvn anyframe:inplace)를 실행해주어야 한다는 점에 유의하도록 한다.<strong>Anyframe</strong>에서 제공하는 Plugin을 설치함으로써 생성된 샘플 프로젝트는 기본적으로 Maven을 기반으로 하고 있으므로 Maven에서 지원하는 기능들을 동일하게 실행할 수 있다. 예를 들어 'mvn test'와 같은 명령어를 실행함으로써 샘플 프로젝트 내의 테스트 코드를 실행해 볼 수 있으며 'mvn package'와 같은 명령어를 실행함으로써 샘플 프로젝트를 war 형태로 패키징 가능하다. 이 외에도 다양한 ReportingPlugin들에 대한 정의를 포함하고 있으므로 'mvn site'와 같은 명령어를 실행하는 경우 현재 개발 프로젝트에 포함된 소스 코드에 대한 분석 결과를 HTML 형태로 얻어낼 수 있게 될 것이다.9.15.Plugin 빌드 파일 자동 생성앞서 설명한 command들을 활용하여 구성한 프로젝트를 <strong>Anyframe</strong> Plugin으로 등록할 수도 있다. 이를위해서는 먼저 <strong>Anyframe</strong> Plugin으로 빌드하기 위한 설정파일이 필요한데, activate-plugin 명령어를 이용하여 디폴트 설정 값을 가진 빌드 파일을 자동으로 생성할 수 있다.mvn anyframe:activate-plugin위의 명령어를 실행하면 신규 Plugin 프로젝트 루트 폴더 하위에 plugin-build.xml 파일이 생성될 것이다.Plugin 빌드 파일 생성 및 수정과 관련된 자세한 내용은 Plugin 빌드 파일 자동 생성 및 수정에 설명되어 있다.9.16.Plugin 패키징 수행Plugin 빌드 파일을 기반으로 package-plugin 명령어를 통해 Plugin 패키징 작업을 수행할 수 있다.mvn anyframe:package-pluginPlugin 패키징과 관련된 자세한 내용은 Plugin 빌드 파일 자동 생성 및 수정을 참고하기 바란다.53


Maven Commands9.17.Plugin 로컬 환경 배포 및 확인패키징이 완료된 Plugin 파일을 개발자 로컬 환경에 배포한 후 사용해 보려면 아래의 명령어를 실행하면 된다.mvn anyframe:install-pluginfile정상적으로 plugin이 로컬 환경에 배포되었다면, mvn anyframe:list 명령어를 실행시켜 새로이 등록된plugin을 확인할 수 있을 것이다.Plugin 로컬 환경 배포와 관련된 자세한 내용은 Plugin 로컬 환경 배포 및 확인에서 확인할 수 있다.9.18.Plugin 배포 및 확인신규 Plugin을 다른 사람들과 공유하기 위해서 deploy-pluginfile 명령어를 실행시켜서 원격 Repository에 배포할 수 있다. <strong>Anyframe</strong>의 원격 Repository(http://dev.anyframejava.org/maven/repo)에 배포하는경우가 아니라면 원하는 원격 Repository에 대한 repositoryId와 url 정보를 명령어 실행 시 옵션으로 지정해주어야 한다.mvn anyframe:deploy-pluginfilePlugin 배포와 관련된 자세한 내용은 Plugin 배포 및 확인을 참고한다.54


10.Ant Commands해당 프로젝트에서 빌드 도구로써 Ant를 채택한 경우 CLI환경에서 <strong>Anyframe</strong> 기반 개발 환경을 구성해보도록 하자. 본 장에서는 먼저 <strong>Anyframe</strong> Ant Command에 대해 알아보고 이들 Command를 활용하는 방법에 대해 구체적으로 살펴볼 것이다. 아직 Ant 환경이 제대로 갖추어지지 않은 경우에는 본 매뉴얼의Installation - <strong>Anyframe</strong> 설치 및 환경 설정을 참고하여 환경이 제대로 세팅되었는지 확인해 보도록 한다.10.1.<strong>Anyframe</strong> Ant CommandsAnt를 기반으로 Command Line Interface에서 <strong>Anyframe</strong>에서 제공하는 Command들을 사용하여 <strong>Anyframe</strong>Plugin 설치, 프로젝트 생성, Domain 클래스 및 CRUD 소스 코드 생성, 빌드 및 실행 등의 작업을 수행할 수 있다. CLI(Command Line Interface) 기반의 command를 실행하여 작업하는 경우, 아래 매뉴얼에서 정의한 command arguments 이외의 값 설정 혹은 반드시 필요한 arguments 생략 시 올바르게 동작하지 않을 수 있으므로 유의하도록 한다.10.1.1.Command 목록다음은 <strong>Anyframe</strong>에서 제공하는 Command 목록으로 사용자는 Command 창에서 아래의 명령어를 입력함으로써 원하는 기능을 실행할 수 있게 된다. Option은 '-{option} {option값}'과 같은 형태로 명령어 뒤에 추가로 입력하면 된다.Commandcreate-anyframeprojectanyframe installPLUGIN_NAMEanyframe uninstallPLUGIN_NAMEDescription생성할 샘플 프로젝트의 기본 구조 생성을 위해 사용하는 명령어이다. 이후 이를 기반으로 <strong>Anyframe</strong>을 활용한 개발 환경 구성이 가능해진다. 프로젝트 생성command는 다음과 같은 Option을 가진다.• pjtname : 프로젝트 이름을 지정할 수 있는 옵션으로 이름을 지정하지 않는 경우 'myproject'라는 디폴트 이름으로 프로젝트가 생성된다. [선택]• pjttype : 프로젝트의 type을 지정한다. 'service'로 지정하는 경우 Java 프로젝트로 생성되고, 'web'으로 지정하는 경우 dynamic 웹 프로젝트로 생성된다. 기본값은 'web'이다. [선택]• package : 프로젝트의 대표 패키지명을 입력한다. 이후 소스 코드 생성 시 기준이 되는 소스 패키지명이 된다. [선택]• apphome : 프로젝트가 생성될 위치를 설정한다. 옵션값을 설정하지 않으면 기본적으로 [<strong>Anyframe</strong> Home] 디렉토리 하위의 applications 폴더 아래에 생성된다. [선택]• offline : 네트워크 사용이 용이하지 않은 경우에 offline 옵션을 true로 설정하면 이후 모든 Command 실행시 offline으로 동작한다. 단, 이 경우 LocalRepository([<strong>Anyframe</strong> Home]/repo)에 필요한 라이브러리가 없을 경우에 정상적으로 동작하지 않을 수 있다. [선택, 기본값은 'false']생성된 샘플 프로젝트 구조를 기반으로 지정된 Plugin을 설치한다. PLUGIN_NAME위치에 설치 대상 Plugin명을 지정한다.이미 설치된 Plugin을 삭제한다. PLUGIN_NAME에 삭제할 Plugin명을 지정한다.anyframe uninstall command는 다음과 같은 Option을 가진다.55


Ant CommandsCommandcreate-anyframemodelanyframe createcrudENTITYupdate-anyframecataloganyframe listanyframe changedbanyframe infoPLUGIN_NAMElist-anyframeupdateDescription• excludes : Plugin 제거시 제외하고 싶은 파일 명을 입력한다. 예를 들어, contexthibernate-services.xml을 Hibernate Plugin 삭제 시 삭제되지 않게 하기 위해서는 -excludes context-hibernate-services.xml 로 옵션을 설정해준다. [선택]테이블 당 1개의 Domain 클래스를 생성한다. 테이블명 지정 시에는 대소문자를구분하므로 유의하여 테이블명을 입력해야 한다. 특히, 해당하는 DB에 맞게 대소문자를 표현해야 한다. hsqldb, oracle의 경우 대문자로 테이블명을 표현해야 하고, mysql의 경우 테이블명을 소문자로 표현해야 한다.• table : Domain 클래스 생성을 위한 대상 테이블명을 정의한다. 여러 개의 테이블을 대상으로 할 경우에는 "," 기호를 구분자로 이용한다. 또한 대상 테이블이다른 테이블과 Relation 관계에 놓여 있다면 Relation 관계에 놓여 있는 테이블을 반드시 같이 정의해주도록 한다. [선택, 기본값은 '*'로써 모든 테이블에 대해 Domain 클래스 생성]• package : 생성될 Domain 클래스의 패키지를 정의한다. [선택, 기본값은 해당프로젝트의 대표 패키지 + ".domain"]하나의 Domain 클래스를 기준으로 기본 CRUD 기능을 구현한 비즈니스 레이어,프리젠테이션 레이어에 속한 소스 코드를 생성한다. ENTITY 위치에 CRUD 소스코드 생성을 위한 대상 Domain 클래스를 정의한다. 클래스명만 정의한 경우에는해당 프로젝트의 대표 패키지 + ".domain" 하위에서 해당 Domain 클래스를 찾게된다. 따라서 다른 패키지에 해당 Domain 클래스가 존재하는 경우 해당 클래스의패키지명까지 포함하여 정의해주도록 한다.• package : 생성될 CRUD 소스 코드의 패키지를 정의한다. [선택, 기본값은 해당프로젝트의 대표 패키지 + {입력된 Entity 클래스 이름(소문자)}]• scope : 생성될 CRUD 소스 코드를 영역을 한정하는데 사용된다. scope을"service"로 정의한 경우 비즈니스 레이어 영역의 CRUD 소스 코드만 생성된다.[선택, 기본값은 "all"로써 프리젠테이션 레이어, 비즈니스 레이어의 모든 소스코드를 생성]현재 사용 중인 DB를 변경하고자 할 때 DB 변경으로 인해 영향받는 속성 정보들을 일괄 변경해준다. (해당 프로젝트 내의 META-INF/project.mf 파일 내에 정의된DB 정보를 기준으로 동작함.)참고현재 <strong>Anyframe</strong>에서 제공하는 Plugin들은 기본인 HsqlDB외에 Oracle,Sybase, MySQL, DB2를 위한 리소스를 추가로 제공하고 있다.{user.home}/.anyframe 디렉토리 내에 존재하는 plugin-catalog-essential.xml과 plugin-catalog-optional.xml 파일을 <strong>Anyframe</strong> Repository(http://dev.anyframejava.org/maven/repo) 내의 최신 plugin catalog 파일로 교체해준다. 이로써 Plugin 목록 조회시 최신 정보를 조회할 수 있도록 한다.{user.home}/.anyframe 디렉토리 내에 plugin-catalog-essential.xml과 plugincatalog-optional.xml파일이 없을 경우에도 활용 가능하다.설치 가능한 Plugin의 이름과 버전 정보를 보여준다.지정한 Plugin의 상세 정보를 조회할 수 있다. PLUGIN_NAME 위치에 조회하고자하는 Plugin의 이름을 지정한다.현재 생성된 샘플 프로젝트에 설치된 Plugin 중 버전 업데이트 가능한 Plugin 목록을 보여준다.56


Ant CommandsCommandanyframe installedanyframe buildDescription설치된 Plugin 현황 및 해당 Plugin의 최신 버전 정보를 보여준다.현재 샘플 어플리케이션을 Ant를 이용하여 빌드한다. 사용가능한 option은 다음과 같다.• deploy : 프로젝트 배포 형태를 정의할 수 있다. "class" 혹은 "jar"를 입력한다.WEB-INF/classes 폴더 하위에 클래스 형태로 배포할 때 class로 설정하고, WEB-INF/lib 폴더 하위에 jar 파일 형태로 배포할 때 jar로 설정한다. [선택, 기본값은 'class']• war : -war를 옵션을 사용하면 프로젝트가 생성된 폴더 하위의 dist 폴더에 프로젝트명.war 파일을 생성 한다.• clean : -clean을 옵션을 추가하면 프로젝트가 생성된 폴더 하위의 dist 폴더 전체를 삭제 한 후 빌드를 수행한다.anyframe run현재 샘플 어플리케이션을 빌드하고 디플로이 하여, Jetty 기반에서 웹 어플리케이션을 실행시켜 볼 수 있다. 앞에서 설명된 어플리케이션 빌드 과정을 동일하게수행한 후 웹 어플리케이션을 구동시켜주는 역할을 담당한다. 사용가능한 option은 다음과 같다.10.2.프로젝트 구조 생성• deploy : 프로젝트 배포 형태를 정의할 수 있다. "class" 혹은 "jar"를 입력한다.WEB-INF/classes 폴더 하위에 클래스 형태로 배포할 때 class로 설정하고, WEB-INF/lib 폴더 하위에 jar 파일 형태로 배포할 때 jar로 설정한다. [선택, 기본값은 'class']• war : -war를 옵션을 사용하면 프로젝트가 생성된 폴더 하위의 dist 폴더에 프로젝트명.war 파일을 생성 한다.• clean : -clean을 옵션을 추가하면 프로젝트가 생성된 폴더 하위의 dist 폴더 전체를 삭제 한 후 빌드를 수행한다.생성할 샘플 프로젝트의 기본 구조 생성을 위해 적절한 <strong>Anyframe</strong> Archetype을 설치해야 한다. 이후이를 기반으로 <strong>Anyframe</strong>을 활용한 개발 환경 구성이 가능해진다. <strong>Anyframe</strong> 4.6.0 이후부터 anyframebasic-archetype,anyframe-service-archetype을 제공하고 있으며, 'web' 타입의 프로젝트는 anyframebasic-archetype이,'service' 타입의 프로젝트는 anyframe-service-archetype이 설치된다. 본 장에서는 anyframe-basic-archetype을 기준으로 설명을 진행할 것이다. (<strong>Anyframe</strong> Archetype에 대해서는Archetype을 참고하도록 한다.)먼저 anyframe-basic-archetype을 설치해 보도록 하자.1. env를 통해 환경 변수 정보가 설정된 command 창에서 프로젝트 생성을 위해 다음 command를 입력한다.anyframe create-project이 명령어를 통해 anyframe-basic-archetype이 설치되어 프로젝트가 생성된다. 프로젝트가 생성되는 위치는 -appHome옵션에 의해 변경될 수 있다. 여기서는 디폴트값인 [<strong>Anyframe</strong> Home] 하위의applications 폴더에 프로젝트를 생성한다.• ex) anyframe create-project -pjtname myproject -pjttype web -package com.sds.emp57


Ant Commands위 예제는 com.sds.emp 대표패키지로 하는 myproject 프로젝트명의 Web 프로젝트를 생성하는command이다. 옵션을 통해 설정한 정보는 해당 프로젝트 디렉토리 하위의 META-INF/project.mf파일에 반영되고, anyframe-basic-archetype이 설치된다.offline 옵션프로젝트 현장의 네트워크 사용이 용이하지 않은 경우에 offline 옵션을 true로 입력하면 해당 프로젝트 디렉토리 하위의 META-INF/project.mf 파일에 offline 값이 true로 설정되고, 이후 모든 Command 실행시 offline으로 동작한다.이 경우 Local Repository([<strong>Anyframe</strong> Home]/repo)에 해당 프로젝트에서 필요한 라이브러리가 없을 경우에 정상적으로 동작하지 않을 수 있다.2. 다음은 anyframe-basic-archetype 설치를 통해 구성된 샘플 프로젝트의 기본 모습이다. 설치된 샘플프로젝트명은 myproject이며, 하위에 다양한 용도의 디렉토리를 포함하고 있다.생성된 프로젝트는 구조만 있는 상태로, web 타입 프로젝트의 경우 dynamic 웹 프로젝트 구조로,service 타입 프로젝트의 경우 자바 프로젝트 구조로 생성된다.Eclipse 프로젝트 관련 파일들(.project, .classpath)과 빌드 파일(build.xml), 프로젝트 설정 파일(META-INF/project.mf) 등은 프로젝트 타입과 상관없이 공통으로 생성된다. 생성된 프로젝트 설정 파일(META-INF/project.mf)을 수정하면, 이후 Domain 클래스 생성 및 CRUD 소스코드 생성 등의 기능에서 수정된 설정 값을 통해 생성되도록 할 수 있다.3. 프로젝트 생성 후에는 어플리케이션 실행을 참조하여 정상 동작 여부를 확인하도록 한다.10.3.Plugin 설치<strong>Anyframe</strong> 4.6.0 이후부터는 다양한 오픈 소스들이 통합된 템플릿 기반의 샘플 코드, 참조 라이브러리집합을 Plugin이라 칭하며, 다양한 유형의 Plugin을 제공한다.<strong>Anyframe</strong>의 Plugin들은 필수(Essential) Plugin과 선택(Optional) Plugin으로 나눌 수 있다. 필수 Plugin에는 core, spring, datasource, logging 과 같이 다른 Plugin이 동작하는데 기본적으로 필요한 기능들을가진 Plugin들이 속해 있고, 선택 Plugin에는 hibernate, cxf-jaxrs, fileupload 등과 같이 어플리케이션 개발시 사용할 수 있는 여러 기능들을 제공하는 Plugin들로 구성되어 있다. (Plugin에 대한 자세한 내용은Plugin 목록과 Plugin 구조를 참조하도록 한다.)다음에서는 기본적인 Command 사용법을 언급하고 있으므로 <strong>Anyframe</strong> Commmand Option에 대해서는 Command 목록내에 제시된 해당 Command의 설명을 참고하도록 한다.<strong>Anyframe</strong>의 Plugin은 특정 Plugin이 동작하는 데 필요한 Plugin을 Dependent Plugin으로 설정할 수 있다. 그래서 특정 Plugin 설치 시에 Dependent Plugin이 설치되지 않았을 경우 자동으로 우선 설치될 수있도록 한다.58


Ant Commands여기서는 다른 <strong>Anyframe</strong> Plugin들의 동작을 위한 기반을 제공하는 필수 Plugin인 core plugin을 설치해보도록 하자. Plugin을 설치하면 해당 플러그인과 관련된 라이브러리가 src/main/webapp/WEB-INF/lib에 반영된다.1. Command 창을 띄우고 앞서 설치한 [샘플 프로젝트 설치 폴더]/db/hsqldb 폴더로 이동하여 start.cmd(or start.sh) 파일을 더블클릭함으로써 샘플용으로 제공되는 hsqldb를 시작시킨다. 해당 Plugin 실행을 위해 DB 데이터 추가가 필요한 경우 선택한 Plugin 설치시 DB 데이터 추가 작업도 함께 이루어지므로 DB를 시작시켜 놓아야 한다. 만일 선택한 Plugin 설치시 DB가 시작되지 않았다면 Plugin 설치 이후 제공되는 DB 스크립트 파일([샘플 프로젝트 설치 폴더]/db/scripts/{Plugin명-insert-data-db명}.sql)을 직접 실행시키면 된다. 또한 샘플용으로 제공되는 hsqldb가 아닌 다른 DB 기반에서 Plugin을 설치하고자 하는 경우에는 DB 변경을 참고하도록 한다.주의 사항Windows 환경에서는 start.cmd 파일을 CLI 상에서 실행시키고, Unix 환경(ex. Mac OS등)에서는 우선 hsqldb 폴더 하위의 파일들에 대해서 실행 권한을 부여(chmod 755 *)한 후, start.sh 파일을 실행(./start.sh)시킨다.2. Command 창을 띄우고 샘플 프로젝트 설치 폴더로 이동(예를 들어, myproject 라는 프로젝트를 생성시켰다면 myproject 폴더에서 command를 실행시키도록 한다.)하여 다음과 같이 명령어를 입력한다. 여기서는 core plugin을 설치할 것이므로 PLUGIN_NAME으로 'core'를 입력하여 core plugin 설치 작업을 진행한다.anyframe install core위와 같이, Plugin install 명령어를 입력하면 설치하고자 하는 Plugin의 dependency 관계 및 현재 프로젝트에 설치여부를 파악하여 최종적으로 설치될 Plugin들의 목록을 출력해주고 사용자의 승인을기다린다. core plugin의 동작을 위해서는 datasource, logging, spring Plugin이 필요하므로 위와 같이출력될 것이다. 계속 설치를 진행하고자 하는 경우 'y'를 입력한다.Essential Pluginscore, datasource, logging, spring plugin은 필수 plugin으로, datasource, logging, springplugin은 단독으로 설치할 수 없고, core를 설치하면 4가지 plugin이 모두 설치된다.59


Ant Commands3. Plugin 설치 완료 후에는 어플리케이션 실행을 참조하여 정상 동작 여부를 확인하도록 한다.4. Command 창을 띄우고 샘플 프로젝트 설치 폴더로 이동하여 다음과 같은 명령어를 입력하면 샘플프로젝트를 대상으로 추가된 Plugin 목록을 확인할 수 있다.anyframe installedPlugin이 정상적으로 설치되었다면, 지정한 패키지 경로에 설치한 Plugin 샘플 소스 코드가 생성되어있고, src/main/webapp/WEB-INF/lib에 Plugin 관련 라이브러리가 설치되어 있을 것이다.core plugin과 동일한 방법으로 다른 Plugin들을 추가로 설치할 수 있다.또한 이미 설치된 Plugin이라 하더라도 다음과 같이 install 명령어에 version옵션을 추가하여 다른 버전으로 교체할 수 있다. 이 경우 해당 Plugin이 참조하는 다른 Plugin(Dependent Plugin)도 호환되는 버전으로 교체될 수 있다. Plugin 버전 변경으로 인해 관련된 참조라이브러리 버전도 변경될 수 있음에유의한다.anyframe install core -version ...10.4.Plugin 삭제샘플 프로젝트를 대상으로 설치된 Plugin들은 삭제가 가능하다. 단, 삭제하고자 하는 Plugin을 다른Plugin이 사용하고 있는 경우에는 삭제할 수 없다. 이 경우, Dependency 관계를 가지는 Plugin들을 먼저삭제한 후에 본래 삭제하려고 했던 Plugin을 삭제해야한다.특정 Plugin 삭제를 요청한 경우 삭제 대상 Plugin 이름을 포함한 모든 폴더 및 파일들이 해당 프로젝트로부터 제거될 것이다. 따라서 특정 Plugin을 삭제하기 전에 개발을 진행하면서 추가한 리소스가 삭제대상에 포함되지 않는지 체크해 볼 것을 권장한다.1. Command 창을 열고 샘플 프로젝트 설치 폴더로 이동하여 다음과 같이 Plugin 제거 명령어를 입력한다.anyframe uninstall PLUGIN_NAME• ex) anyframe uninstall hibernate위 예제는 hibernate 플러그인에 대한 샘플과 라이브러리를 제거하는 command이다. 삭제하려고하는 Plugin을 나머지 Plugin에서 사용하고 있지 않다면 문제없이 삭제될 것이다.excludes 옵션을 사용하면 plugin 삭제 시에 삭제 대상에서 제외시킬 파일을 지정할 수 있다.삭제하려고 하는 Plugin을 나머지 Plugin에서 사용하고 있지 않다면 문제없이 삭제될 것이다.2. Command 창을 열고 샘플 프로젝트 설치 폴더로 이동하여 다음과 같은 명령어를 입력하면 해당Plugin이 정상적으로 삭제되었는지 확인할 수 있다.anyframe installed60


Ant Commands삭제된 plugin 관련 파일이나 디렉토리는 '[샘플 프로젝트 root 폴더]/uninstalled' 하위에 plugin을 삭제한 시점별로 디렉토리에 백업되어 있으므로 복구가 가능하다.10.5.Plugin 목록 조회설치할 수 있는 Plugin 목록을 조회하려면 다음과 같은 명령어를 사용한다.anyframe list설치 가능한 Plugin 목록은 Plugin Catalog 파일 기반으로 조회되는데 <strong>Anyframe</strong>에서는 먼저 해당 파일이'{user.home}/.anyframe' 디렉토리에 존재하는지 체크해 보고 있을 경우 해당 파일에 정의된 Plugin 정보를 활용하게 된다. 만일 '{user.home}/.anyframe' 디렉토리에 해당 파일이 존재하지 않으면 <strong>Anyframe</strong>Repository인 http://dev.anyframejava.org/maven/repo/에 있는 plugin-catalog-essential.xml과 plugincatalog-optional.xml파일을 '{user.home}/.anyframe' 디렉토리에 다운로드하고 이 파일을 활용하게 된다. 한번 다운로드한 Local의 Plugin Catalog 파일을 <strong>Anyframe</strong> Repository 내의 최신 Plugin Catalog 파일과 동기화하기 위해서는 Plugin Catalog Update를 참조하도록 한다.10.6.설치된 Plugin 목록 조회다음의 command를 실행하면 샘플 프로젝트를 대상으로 설치된 Plugin들의 이름과 버전 및 각 Plugin의 최신 버전 정보를 확인할 수 있다.anyframe installed61


Ant Commands설치된 Plugin 정보는 샘플 프로젝트 하위의 META-INF/plugin-installed.xml 파일에 기록된다.10.7.Plugin 정보 조회특정 Plugin의 상세한 정보를 조회하고자 하는 경우 다음과 같은 command를 이용하면 된다.anyframe info PLUGIN_NAME예를 들어, core plugin의 상세 정보를 조회하면 아래와 같이 출력된다.[info] Name : core[info] GroupId : org.anyframe.plugin[info] ArtifactId : anyframe-core-pi[info] Latest Version : x.x.x[info] Samples : Included[info] Releases : 1.0.0-SNAPSHOT,1.0.0.RC1,1.0.0,1.0.1-SNAPSHOT, 1.0.1, ...[info] Dependencies : datasource(1.0.0-SNAPSHOT


Ant Commandsanyframe list-update단, Local의 Plugin Catalog 파일을 최신 버전으로 업데이트 한 후에야 정확한 정보를 확인할 수 있다.Local Plugin Catalog를 업데이트 하는 방법은 본 문서의 Plugin Catalog Update를 참조하도록 한다.현재 구성된 샘플 프로젝트에 설치된 Plugin의 버전이 최신 버전이 아닌 경우 이전 버전의 Plugin에 대해 최신 버전을 적용할 수 있도록 지원한다. 이를 원할 경우 Plugin 설치를 참고하도록 한다.10.10.DB 변경앞서 언급한 바와 같이 Plugin 설치를 통해 생성된 샘플 프로젝트는 기본적으로 hsqldb를 기반으로 동작하도록 구성되어 있다. 그런데 만약 샘플 프로젝트의 실행 DB를 변경하고자 원한다면 다음과 같은작업을 수행해야 한다. (현재 샘플을 제공하고 있는 <strong>Anyframe</strong> 플러그인은 hsqldb, oracle, sysbase, db2,mysql DB에 대해서만 동작하도록 지원하고 있다.)1. 설치된 샘플 프로젝트 설치 폴더 하위의 META-INF/project.mf 파일을 열고 기 정의된 DB 정보를 적절하게 수정한다.db.type=hsqldbdb.name=sampledbdb.schema=PUBLICdb.server=localhostdb.port=-1db.driver=org.hsqldb.jdbcDriverdb.url=jdbc:hsqldb:hsql://localhost/sampledbdb.userId=SAdb.password=db.lib=db/hsqldb/hsqldb-2.0.0.jardb.dialect=org.hibernate.dialect.HSQLDialectdb.groupId=hsqldbdb.artifactId=hsqldbdb.version=2.0.0위에 제시된 각 속성은 다음과 같은 의미를 지닌다.Propertydb.typedb.namedb.schemadb.serverdb.portdb.driverdb.urldb.userIddb.passworddb.libDescription해당 DB에 대한 대표명을 정의한다. 특정 Plugin 설치 실행해야 할 DB 스크립트가 있다면 db.type 값을 포함하고 있는 스크립트 ({plugin name}-insert-data-{db.type}.sql, {plugin name}-delete-data-{db.type}.sql) 파일이 실행되도록 하는데 사용된다. (예를 들어, db.type이 oracle일 때 Security Plugin을 설치하면 securityinsert-data-oracle.sql파일이 실행됨.)해당 DB에 대한 이름을 정의한다.해당 DB의 Schema를 정의한다.해당 DB를 가진 서버의 IP를 정의한다.해당 DB를 위한 서버의 port를 정의한다.해당 DB에 대한 Driver Class명을 정의한다.해당 DB에 대한 URL을 정의한다.해당 DB에 접근하기 위한 User Id를 정의한다.해당 DB에 접근하기 위한 Password를 정의한다.해당 DB에 접근하여 Connection을 얻어오기 위해 참조해야 하는 DB Library 위치를 정의한다. (절대 경로 또는 샘플 프로젝트 위치 기준으로 상대 경로로 정의할 수있다. 상대 경로 정의시 ./src/main/..와 같은 형태나 src/main/..와 같은 형태로 정63


Ant CommandsPropertydb.dialectDescription의하도록 한다. /src/main/..와 같은 형태로 정의하는 경우 절대 경로로 인식하여해당 파일을 찾지 못할 수 있다.) 샘플 어플리케이션 실행시 DB Library를 인식할수 있도록 하기 위해서 [샘플 프로젝트 설치 폴더]/src/main/webapp/WEB-INF/lib폴더 내에 저장할 것을 권장한다.해당 DB의 Hibernate Dialect 클래스를 정의한다.db.schema.use 해당 DB가 Sybase DB일 경우, 지정해야 하는 속성으로 User 정보 셋팅시 DBSchema 정보를 사용할지 여부를 정의한다. 단, Sybase 버전에 따라 속성값은 변경될 수 있음에 유의하도록 한다. (default=false)2. Command 창을 띄운 후, 샘플 프로젝트가 있는 위치로 이동하여 다음과 같이 명령어를 입력함으로써 앞서 수정한 DB 정보에 맞게 현재까지 설치된 Plugin의 모든 DB 관련 리소스들을 수정할 수 있다.anyframe change-db3. DB 관련 설정 정보가 정상적으로 변경되었는지 확인한다.프로젝트 코드 내 DataSource Service 설정 정보 및 Hibernate, Query Service 관련 정보들이 변경되었는지 확인한다.10.11.Domain 소스 코드 생성<strong>Anyframe</strong> 4.6.0 이후부터 새롭게 추가된 기능으로 이미 만들어져 제공된 Plugin들을 설치하는 작업 외에 새로 개발할 어플리케이션을 위해 구성된 DB 테이블을 기반으로 Domain 클래스를 생성할 수 있다.(이어질 설명에서는 기본적인 Commmand 사용법만을 언급하고 있으므로 <strong>Anyframe</strong> Commmand Option에 대한 자세한 내용은 Command 목록내에 제시된 해당 Command의 설명을 참고하도록 한다.)<strong>Anyframe</strong>에서 기본적으로 제공하는 SampleDB 내에 포함된 모든 테이블을 대상으로 Domain 클래스를 생성해 보도록 하자.1. Command 창을 띄운 후, 샘플 프로젝트가 있는 위치로 이동하여 다음과 같이 명령어를 입력함으로써 특정 테이블과 매핑되는 Domain 클래스를 생성시킬 수 있다.anyframe create-model• ex) anyframe create-model -table "*" -package com.sds.emp.domain위 예제는 모든 테이블에 대해 Domain Class를 생성하되, 프로젝트 생성 시 지정한 대표 패키지(ex. com.sds.emp) 하위의 domain 패키지 내에 생성하는 command 이다.해당 DB에 속한 전체 테이블이 아닌 특정 테이블에 대해서만 Domain 클래스를 생성하고자 할 경우에는 다음과 같이 -table {table명}을 직접 입력해주면 된다.anyframe create-model -table BOARD_MASTER,BOARD또한 해당 테이블에 대해 이미 생성된 Domain 클래스가 있을 경우에는 다음과 같이 overwrite할지 묻게 될 것이다. overwrite하지 않고 싶으면 "N"를 입력하여 Domain 클래스 생성 작업을 종료할 수 있다.2. Domain 클래스가 정상적으로 생성되었는지 확인한다.64


Ant CommandsDomain 클래스 생성 시 지정한 패키지 내에, camelcase 적용된 테이블 이름의 도메인 클래스가 존재하면 정상적인 것이다. 다음은 BOARD 테이블과 매핑되는 Board.java 코드의 일부분이다.@Entity@Table(name = "BOARD")//@Table의 schema 속성은 default 템플릿을 활용하여//sybase DB와 hibernate dao framework을 사용할때 정의됨//@Table의 catalog 속성은 catalog 정보가 존재할 경우 정의됨public class Board implements Serializable {private BoardId id = new BoardId();private BoardMaster boardMaster;private String boardName;중략...public BoardId getId() {return this.id;}public void setId(BoardId id) {this.id = id;}@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "BOARD_MASTER_ID", nullable = false,insertable = false, updatable = false)public BoardMaster getBoardMaster() {return this.boardMaster;}public void setBoardMaster(BoardMaster boardMaster) {this.boardMaster = boardMaster;}@Column(name = "BOARD_NAME", nullable = false, length = 150)public String getBoardName() {return this.boardName;}public void setBoardName(String boardName) {this.boardName = boardName;}}3. 자동생성되는 Domain 클래스 소스 코드에 대해서 각 개발자 혹은 프로젝트 상황에 맞게 템플릿 파일을 수정하여 사용할 수 있다.템플릿 확장에 관한 상세한 내용은 Template Customizing를 참고하도록 한다. Ant의 경우, 템플릿파일들은 '[<strong>Anyframe</strong> 설치 폴더]/templates' 디렉토리에 존재하고 이중 Domain 클래스에 대한 템플릿 파일은 templates 하위의 [템플릿명]/source/model 폴더 내에 있으므로 수정 시 활용하도록 한다. (Pojo.ftl 등)10.12.CRUD 소스 코드 생성DB 테이블을 기반으로 생성한 Domain 클래스를 통해 기본 CRUD 기능을 수행하는 소스 코드들을 생성할수 있다. (이어질 설명에서는 기본적인 Command 사용법만을 언급하고 있으므로 <strong>Anyframe</strong> CommmandOption에 대한 자세한 내용은 Command 목록내에 제시된 해당 Command의 설명을 참고하도록 한다.)앞서 생성한 Domain 클래스 중 하나를 선택하여 CRUD 소스 코드를 생성해 보도록 하자.CRUD 소스 코드가 정상적으로 자동 생성되지 않는 경우CRUD 소스 코드가 정상적으로 생성되지 않는 경우, {user.home}/.anyframe/templates에존재하는 소스 코드 템플릿 파일에 문제가 있을 수도 있으므로, 이 디렉토리를 삭제한 후에 다시 anyframe:create-crud command를 실행시켜 보기를 권장한다.65


Ant Commands1. Command 창을 띄운 후, 샘플 프로젝트가 있는 위치로 이동하여 다음과 같이 명령어를 입력함으로써 특정 Domain을 중심으로 기본적인 CRUD 기능을 수행하는 소스 코드들을 생성할 수 있다.anyframe create-crud ENTITY예를 들어, 'anyframe create-crud Board'라고 실행하면 Board 객체를 CRUD 할 수 있는 소스코드를생성하게 된다.해당 Domain 클래스에 대해 이미 생성된 CRUD 소스 코드가 있을 경우에는 다음과 같이 overwrite할지 묻게 될 것이다. overwrite하지 않고 싶으면 "N"를 입력하여 CRUD 소스 코드 생성 작업을 종료할 수 있다.또한, 비즈니스 레이어 코드만 생성하고자 하는 경우 아래와 같이 -scope 옵션을 추가하여 명령어를 실행할 수도 있다.anyframe create-crud Board -scope servicescope 옵션에 대한 상세한 내용은 Command 목록을 참조하길 바란다.2. 비즈니스 레이어 코드(서비스인터페이스, 서비스구현클래스, DAO구현클래스와 매핑쿼리문 등)가정상적으로 생성되었는지 확인한다.다음은 도메인 클래스 Board.java를 기반으로 생성된 자바 코드와 속성파일 등의 일부분이다.• 서비스 인터페이스 (src/main/java/{대표패키지}/{package}/service/{Entity 클래스명}Service.java)public interface BoardService{void create(Board board) throws Exception;void remove(BoardId id) throws Exception;...}• 서비스 구현클래스 (src/main/java/{대표패키지}/{package}/service/impl/{Entity 클래스명}ServiceImpl.java)@Service("boardService")@Transactional(rollbackFor = {Exception.class}, propagation = Propagation.REQUIRED)public class BoardServiceImpl implements BoardService {@Inject@Named("boardDao")private BoardDao boardDao;public void create(Board board) throws Exception {this.boardDao.create(board);}public void remove(BoardId id) throws Exception {66


Ant Commands}}...this.boardDao.remove(id);• DAO 클래스 (src/main/java/{대표패키지}/{package}/service/impl/{Entity 클래스명}Dao.java)@Repository("boardDao")public class BoardDaoQueryImpl extends SimpleJdbcDaoSupport {@Value("#{contextProperties['pageSize'] ?: 10}")int pageSize;@Value("#{contextProperties['pageUnit'] ?: 10}")int pageUnit;@Injectpublic void setJdbcDaoDataSource(DataSource dataSource) throws Exception {super.setDataSource(dataSource);}public void create(Board board) throws Exception {String sql = "INSERT INTO BOARD (BOARD_ID, BOARD_DESC, BOARD_MASTER_ID,BOARD_NAME, BOARD_ORDER, BOARD_TOPICS, REG_DATE) "+ "VALUES (?, ?, ?, ?, ?, ?, ?)";this.getSimpleJdbcTemplate().update(sql,new Object[] {board.getId().getBoardId(),board.getBoardDesc(), board.getId().getBoardMasterId(),board.getBoardName(), board.getBoardOrder(),board.getBoardTopics(), board.getRegDate()});}public void remove(BoardId id) throws Exception {String sql = "DELETE FROM BOARD WHERE BOARD_ID = ? AND BOARD_MASTER_ID = ?";this.getSimpleJdbcTemplate().update(sql, new Object[] {id.getBoardId(),id.getBoardMasterId()});}...}• MessageSoruce (src/main/resources/message/message-generation.properties)# -- Board-STARTboard.id.boardId=Board Idboard.id.boardMasterId=Board Master Idboard.boardDesc=Board Descboard.boardName=Board Nameboard.boardOrder=Board Orderboard.boardTopics=Board Topicsboard.regDate=Reg Date# -- success messages --success.board.create=Board has been added successfully.success.board.update=Board has been updated successfully.success.board.delete=Board has been deleted successfully.# -- error messages --error.boardserviceimpl.create=Board data not createderror.boardserviceimpl.create.solution=Enter correct data for mandatory fieldor enter data according to formats means date format as yyyy-mm-dd67


Ant Commandserror.boardserviceimpl.create.reason=Entered incorrect data for Board...• 통합 테스트케이스 (src/test/java/{대표패키지}/{package}/service/{Entity 클래스명}ServiceTest.java)@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = { "file:./src/main/resources/spring/context-*.xml" })public class BoardServiceTest{@Inject@Named("boardService")private BoardService boardService;@Test@Rollback(value=true)public void manageBoard() throws Exception {//1. create a new boardBoard board = getBoard();if(boardService.get(board.getId()) != null)boardService.remove(board.getId());}}...boardService.create(board);...참고 1META-INF/project.mf 에서 project.daoframework 값을 변경하지 않았을 경우 기본DAO Framework은 springjdbc로 설정되어 있다. (위에서 보여준 DAO 구현 클래스는springjdbc로 설정되어 있는 경우의 모습이다.) 설정할 수 있는 DAO Framework로는springjdbc, query, hibernate, ibatis2 가 있다.META-INF/project.mf 에서 project.daoframework 값을 "hibernate"으로 설정하여 DAOFramework으로 Hibernate을 채택한 경우, 생성된 CRUD 소스 코드는 Hibernate을 사용하는 형태를 갖추게 될 것이다. 단, <strong>Anyframe</strong> Hibernate Plugin이 설치되어야만 생성된코드가 정상 동작할 수 있다.마찬가지로 <strong>Anyframe</strong> IDE를 통해서 생성할 소스코드의 Template Type을 디폴트로 지정된 값 이외의 값으로 설정하고 싶은 경우에도 이와 관련된 <strong>Anyframe</strong> Plugin이 설치되어 있어야 생성된 프로젝트가 정상적으로 동작할 수 있다.예를 들어, Template type을 'miplatform'으로 선택하여 소스코드를 생성하고자 하는 경우, 프로젝트 설정 파일(project.mf)의 project.template의 값을 miplatform으로 변경하는 것 뿐만 아니라 <strong>Anyframe</strong>의 miplatform Plugin을 설치하여야 한다.3. 프리젠테이션 레이어 코드 (비즈니스 서비스와 통신을 하기 위한 컨트롤러 클래스, JSP 등)가 정상적으로 생성되었는지 확인한다.다음은 도메인 클래스 Board.java를 기반으로 생성된 컨트롤러, JSP 등의 일부분이다.• 컨트롤러 (src/main/java/{대표패키지}/{package}/web/{Entity 클래스명}Controller.java)@Controller@RequestMapping("/board.do")public class BoardController {68


Ant Commands@Inject@Named("boardService")private BoardService boardService;...@RequestMapping(params = "method=createView")public String createView(Model model) throws Exception {model.addAttribute(new Board());}}return "generation/board/form";• JSP (src/main/webapp/WEB-INF/jsp/generation/{Entity 클래스명}/*.jsp)Home &gt; Boardfunction fncCreateBoardView() {document.location.href="";}...• 단위 테스트케이스 (src/test/java/{대표패키지}/{package}/web/{Entity 클래스명}ControllerTest.java)@RunWith(JMock.class)public class BoardControllerTest {private BoardController controller;private String SUCCESS_CREATEVIEW = "generation/board/form";private String SUCCESS_CREATE = "redirect:/board.do?method=list";private String SUCCESS_GET = "generation/board/form";private String SUCCESS_UPDATE = "redirect:/board.do?method=list";private String SUCCESS_LIST = "generation/board/list";private String SUCCESS_REMOVE = "redirect:/board.do?method=list";private Mockery context = new JUnit4Mockery();private BoardService mockService = null;@Beforepublic void setUp() throws Exception {System.setProperty("log4j.configuration", "log4j-test.xml");}this.mockService = context.mock(BoardService.class);this.controller = new BoardController();this.controller.setBoardService(this.mockService);public void setBoardController(BoardController controller) {this.controller = controller;}@Test69


Ant Commandspublic void testCreateView() throws Exception{String viewName = this.controller.createView(new ExtendedModelMap());}...assertEquals("returned correct view name", SUCCESS_CREATEVIEW, viewName);4. CRUD 소스 코드 생성 후에는 어플리케이션 실행을 참조하여 정상 동작 여부를 확인하도록 한다.참고 2CRUD 소스 코드 생성은 도메인 클래스를 기반으로 이루어지는데, 이를 위해 도메인 클래스를 포함한 전체 프로젝트의 소스 코드를 컴파일을 한 후 컴파일된 도메인 클래스를 이용하여 코드를 생성한다. 그러므로 프로젝트 내 소스 코드의 양이 많아 CRUD 소스 코드생성 시 컴파일에 걸리는 시간이 많이 소요되는 경우, [<strong>Anyframe</strong> Home]/ide/cli/scripts 폴더 내에 있는 code-generation.xml 파일에서 "create-crud" target 내에 정의된 다음 cleantarget을 호출해주는 부분을 제거해주도록 한다. clean target에서는 기존에 컴파일된 모든 소스 코드를 삭제한 후 이후 compile target에서 새로 전체 소스 코드를 컴파일하게 되므로 소스 코드의 양이 많을 경우 시간이 많이 소요될 수 있다. 속도 향상을 위해서 cleantarget을 제거하는 경우 incremental build를 수행하는 compile target에 의해 변경된 소스코드만 컴파일되므로 시간이 적게 소요된다.주의 사항anyframe-service-archetype으로 생성된 서비스 타입의 프로젝트일 경우, hibernate나miplatform plugin 설치 시에 관련 spring 설정 파일(context-*.xml)이 설치되지 않는다. 따라서, dao framework을 hibernate으로 설정하거나, template type을 miplatform으로 선택하여 소스코드를 생성한 경우, 관련 속성 파일이 존재하지 않아서 자동 생성된 테스트케이스는 수행시 오류가 발생하게 된다. "Fail to ApplicationContext..." 에러가 발생하면hibernate 또는 miplatform spring 설정 파일을 추가해 주도록 한다.10.12.1.CRUD 소스코드 생성 후 런타임 시 발생하는에러 해결 TipCRUD 소스코드는 정상적으로 생성되었지만 런타임시에 발생할 수 있는 문제에 대한 해결방법은 Maven기반의 개발 시 문제 해결방법과 동일하다. [CRUD 소스코드 생성 후 런타임 시 발생하는 에러 해결 Tip]을 참조한다.10.12.2.Template CustomizingAnt의 경우, 템플릿 파일들은 '[<strong>Anyframe</strong> 설치 폴더]/templates' 디렉토리에 존재하고 CRUD 소스 코드생성에 관련된 템플릿 파일은 templates 하위의 [템플릿명]/source 폴더 내에 있으므로 수정 시 활용하도록 한다. <strong>Anyframe</strong> IDE를 통해 만들어진 Domain클래스나 CRUD 소스 코드들은 FreeMarker Template을 기반으로 자동 생성되는데, 이 Template은 개발자 혹은 프로젝트 상황에 맞게 수정하여 사용할 수있다. Template 확장 방법은 Maven 기반의 개발 시와 동일하므로 [Template Customizing]을 참조한다.10.13.어플리케이션 및 프로젝트 빌드10.13.1.어플리케이션 빌드CLI환경에서 <strong>Anyframe</strong>이 제공하는 command를 이용해서 어플리케이션을 빌드한다.70


Ant Commands1. Command 창을 띄운 후, 샘플 프로젝트 설치 폴더 위치로 이동하여 다음과 같이 명령어를 입력한다.anyframe build2. 프로젝트가 생성된 폴더 하위의 dist폴더에 프로젝트 명으로 된 배포폴더가 생성되고, 옵션에 따라배포형태 및 war 파일 생성유무 등이 결정된다.• ex) anyframe build -deploy jar -war위 예제는 jar 파일 형태로 프로젝트를 패키징하여 배포 파일을 생성하고, war 파일을 생성하는command이다.• ex) anyframe build -deploy class위 예제는 어플리케이션 전체 빌드 후, WEB-INF/classes 폴더 하위에 프로젝트 소스 코드 컴파일결과를 class 파일 형태로 배포하는 경우에 사용한다. 빌드된 결과를 WEB-INF/classes 에서 확인하며,WEB-INF/classes 아래에 컴파일된 자바코드, 설정파일, 매핑쿼리문 등이 생성된다.• ex) anyframe build -deploy jar위 예제는 어플리케이션 전체 빌드 후, WEB-INF/lib 폴더 하위에 프로젝트 소스 코드 컴파일 결과를 jar 파일 형태로 배포하는 경우에 사용한다. 빌드된 결과를 WEB-INF/lib 에서 확인하며, 하나의프로젝트 이름(예를 들면 myproject)으로 jar 파일이 생성된다.• ex) anyframe build -war위 예제는 어플리케이션 전체 빌드 후, war 파일을 생성하는 경우에 사용한다. 빌드된 결과를 프로젝트가 생성된 폴더/dist/ 폴더 하위에서 확인한다. 프로젝트가 생성된 폴더/dist 폴더에는 프로젝트 명으로 된 war 파일이 생성된다. 예) myproject.war참고현재 <strong>Anyframe</strong> IDE에서는 어플리케이션 빌드 관련된 빌드 스크립트를 [<strong>Anyframe</strong> Home]/ide/cli/scripts/application-build.xml 파일에서 관리하고 있다. 이 빌드 파일 내에서 target명이 "build"인 경우가 어플리케이션 빌드에 해당된다.중략...10.13.2.프로젝트 빌드만약 어플리케이션 빌드 프로세스 내용 중 일부를 변경시키고자 한다면 applicationbuild.xml파일 내용을 변경하도록 한다.CLI환경에서 <strong>Anyframe</strong>에서 제공하는 build 명령어를 이용하여 빌드를 수행할 수도 있지만, build.xml를이용하여 직접 ant 명령어를 실행함으로써 프로젝트에 대한 빌드를 수행할 수도 있다.1. 설치한 프로젝트에 ant 실행을 위한 build.xml 파일이 존재하는지 확인하고, Command 창을 띄운 후,샘플 프로젝트 설치 폴더 위치로 이동하여 다음과 같이 명령어를 입력한다.ant• ex) ant all위 예제는 프로젝트에 대해서 all이라는 target을 실행시키는 ant command로 아래와 같은 target중 하나를 선택하여 프로젝트 빌드 프로세스를 수행시킬 수 있다. target을 입력하지 않고 ant만실행시킨 경우 default target인 "default"가 수행된다.71


Ant Commandstargetdefaultdeployall그외description프로젝트에 대해서 초기화, 컴파일, 패키징 등의 기본 빌드 프로세스를 수행한다.default target을 수행한 후 web type 프로젝트의 경우 war 파일 압축이 풀려진 형태의 폴더를 dist 폴더 하위에 배포한다.위에 설명한 "default" target에서 수행하는 빌드 프로세스 작업 외에 테스트 케이스 수행, 소스 코드 커버리지, CheckStyle/JDepend/FindBugs/CodeDuplication 등의 코드 품질 검사 리포팅까지의 작업을 추가로 더 수행한다."clean", "init", "resources", "compile", "test-resources", "test-compile","package", "emma-jars", "test", "report", "deploy" 등 빌드 프로세스 작업 내역 하나 별로 하나의 ant target이 구성되어 있으므로 위에서 설명한"default"와 "all" target 이외의 작업 별 빌드를 수행해야 할 필요가 있으면 사용하도록 한다.참고현재 <strong>Anyframe</strong> IDE에서는 프로젝트 빌드 스크립트를 [<strong>Anyframe</strong> Home]/ide/cli/scripts/project-build.xml 파일에서 관리하고 있다. (project-build.properties 함께 제공) 이 빌드 파일 내 target명들 앞에 prefix로 "shared:"가 붙어있어서 실제 생성한 프로젝트 내 빌드 파일(build.xml)에서는 이 공통 프로젝트 빌드 파일(project-build.xml)의 target명을 호출하여실제 프로젝트 빌드를 수행하게 되며, 각 프로젝트 별로 특화된 빌드 프로세스를 추가해넣을 수도 있다.만약 공통 프로젝트 빌드 파일을 변경하여 나머지 모든 프로젝트 내 빌드 프로세스 내용을 변경시키고자 한다면 project-build.xml 파일 내용을 변경하도록 한다.10.14.어플리케이션 실행특정 Plugin 설치 후 또는 코드 자동 생성 결과로 구성된 샘플 어플리케이션이 정상적으로 동작하는지확인하기 위해서는 Command 창에 명령어를 직접 입력하거나 Eclipse를 이용할 수 있다.다음에서는 Command를 직접 입력하거나 Eclipse를 이용하여 샘플 어플리케이션을 시작시키는 방법에 대해서 살펴보도록 한다. (본 문서에서는 Jetty, Tomcat을 기준으로 설명이 진행된다.)샘플 어플리케이션의 정상 동작 여부를 체크하기 위해서는 먼저 사용할 DB가 시작되어 있어야 한다.<strong>Anyframe</strong> Plugin 설치로 구성되는 샘플 프로젝트는 기본적으로 hsqldb를 사용하도록 구성되어 있다. 따라서, [샘플 프로젝트 설치 폴더]/db/hsqldb/start.cmd (or start.sh) 파일을 더블 클릭하여 DB를 시작시키도록 한다. (hsqldb가 아닌 다른 DB를 사용하고자 하면 DB 변경 방법을 참조하도록 한다.) [샘플프로젝트 설치 폴더]/db/hsqldb 폴더 내에 제공되는 sqltool.cmd (or sqltool.sh) 파일은 hsqldb용 SQLEditor를 시작시키는 용도로 제공된다. DB 작업 수행 후 결과를 확인하고자 할 때 유용하게 활용할 수있을 것이다.10.14.1.Jetty 기반의 어플리케이션 실행CLI환경에서 <strong>Anyframe</strong>에서 제공하는 Command를 이용하여 어플리케이션을 빌드하고 웹 어플리케이션을 실행시켜본다. 이 command는 프로젝트가 web 타입인 경우에만 이용가능하다.1. Command 창을 띄운 후, 샘플 프로젝트 설치 폴더 위치로 이동하여 다음과 같이 명령어를 입력하면Jetty 기반에서 샘플 어플리케이션을 시작시킬 수 있다.anyframe run72


Ant Commands앞에서 설명된 어플리케이션 빌드 과정을 동일하게 수행한 후 웹 어플리케이션을 구동시켜주는 역할을 담당한다.2. Jetty가 정상적으로 시작되면 Started Jetty Server라는 INFO 레벨의 로그가 콘솔창에 보일 것이다.(TestCase에서 JMock클래스 때문에 컴파일 오류가 발생하는 경우, Ctrl+C키를 이용해서 Jetty서버를 중지하고, Command창에서 'mvn anyframe:install -Dname=test'를 실행하여 test Plugin을 설치한후 다시 Jetty를 실행시킨다.)3. WAS가 정상적으로 시작되었으면 웹브라우저를 열고 주소창에 http://localhost:8080/myproject(http://localhost:8080/${샘플 프로젝트 이름})와 같이 입력하여 샘플 어플리케이션이 정상적으로실행되는지 확인해본다. 요청 URL에서 Port 정보가 8080인 것에 유의하도록 한다. 다음은 core plugin만 설치된 경우 샘플 어플리케이션의 초기 화면이다.Plugin이 추가 설치될 때마다 테이블의 왼쪽 Installed Plugins 칸에 추가된 Plugin에 대한 샘플을 확인할 수 있도록 링크가 추가될 것이다. CRUD 소스 코드를 자동으로 생성시키면 테이블의 오른쪽Generated CRUD Codes 칸에 만들어진 기능을 확인할 수 있는 링크가 추가된다.다음은 Core 링크를 클릭하였을 때 이동한 페이지의 모습이다.4. Jetty 폴더를 확인한다.프로젝트 dist 폴더 하위에 jetty-temp라는 폴더가 생성되어 Jetty가 구동되게 된다. 배포 이후에 클래스나 JAR 파일, JSP 파일 등을 반영하고 Jetty로 재확인하고 싶다면 이 폴더의 해당 위치에 배포하도록 한다.10.14.2.Eclipse WTP를 이용하여 Tomcat 기반의 어플리케이션 실행Eclipse WTP를 이용하여 일반 Dynamic Web Project 형태로 샘플 어플리케이션을 실행시킬 수 있다.1. 설치된 샘플 프로젝트를 Eclipse로 import한 이후 해당 프로젝트에 대해 컴파일 오류가 존재하지 않는지 체크한다. (TestCase에서 JMock클래스 때문에 컴파일 오류가 발생하는 경우, Command창에서 'anyframe install test'를 실행하여 test Plugin을 설치하고, Eclispe에서 해당 프로젝트를 Refresh한다.) 그리고 해당 프로젝트에 대해 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴에서 Run As >Run on Server를 선택함으로써 Tomcat Server에 어플리케이션을 배포하여 샘플 어플리케이션이 정상적으로 실행되는지 확인해본다.2. 다음은 core plugin만 설치된 경우 샘플 어플리케이션의 초기 화면이다.73


Ant CommandsPlugin이 추가 설치될 때마다 테이블의 왼쪽 Installed Plugins 칸에 추가된 Plugin에 대한 샘플을 확인할 수 있도록 링크가 추가될 것이다. CRUD 소스 코드를 자동으로 생성시키면 테이블의 오른쪽Generated CRUD Codes 칸에 만들어진 기능을 확인할 수 있는 링크가 추가된다.다음은 Core 링크를 클릭하였을 때 이동한 페이지의 모습이다.74


11.Eclipse IDEEclipse를 사용해서 <strong>Anyframe</strong> 기반의 프로젝트 생성, Domain 클래스 및 CRUD 소스 코드 생성,Configuration, JDBC Setting, <strong>Anyframe</strong> 플러그인 install/uninstall, Hudson 연계 등의 작업을 할 수 있다.프로젝트는 Wizard를 통해서 생성하며, 그 밖의 작업은 <strong>Anyframe</strong> IDE Editor를 이용한다.11.1.New Project Creation<strong>Anyframe</strong> IDE을 이용해 프로젝트를 생성 할 수 있다.<strong>Anyframe</strong> IDE는 Window >> Preferences >> <strong>Anyframe</strong> Tools >> IDE 에서 설정한 프로젝트 빌드 타입에 따라 다른 프로젝트 생성 화면을 제공한다. 따라서, 프로젝트를 생성 하기 이전에 프로젝트 빌드 타입을 먼저 설정하도록 한다.• [Maven 프로젝트 생성]• [Ant 프로젝트 생성]• [프로젝트 실행 및 설정 파일(project.mf) 확인]• [프로젝트 생성 시 발생할 수 있는 에러 해결 Tip]• [Out of memory] : 프로젝트 생성 시 java.lang.OutOfMemoryError 조치방법• [Project Clean & JSP Validation Error ]: 프로젝트 생성 시 표시가 뜰 경우 조치방법11.1.1.Maven 프로젝트 생성1. File >> New >> Other.. >> <strong>Anyframe</strong> >> Project 을 선택2. 열린 창에서 프로젝트 생성을 위해 다음과 같은 내용을 입력한다. 아래 항목을 문제없이 기입하는경우 Next 버튼과 Finish 버튼이 활성화 되며, Next 버튼을 클릭하면 DB정보를 구성할 수 있는 화면으로 연결된다.• Project Name: 프로젝트 이름.• Base Location: 프로젝트 생성 위치로, 디폴트 경로로 이클립스의 workspace가 지정된다. 디폴트로 지정되는 경로를 꼭 사용할 필요 없이 원하는 경로로 변경 가능하다.• Use default template home location: 체크된 경우 [사용자 계정 홈 디렉토리]/.anyframe/templates경로 (ex. C:/Documents and Settings/[user name]/.anyframe/templates)를 디폴트로 지정하며,체크를 하지 않는 경우 Template Home 을 지정할 수 있는 부분이 활성화됨.• Template Home: template 파일의 위치 지정.• Package Name: 대표 패키지 이름.• Group Id : pom.xml에 정의될 프로젝트의 group id.• Artifact Id : pom.xml에 정의될 프로젝트의 artifact id.• Version : pom.xml에 정의될 프로젝트의 version 정보.• Packaging :war 또는 jar를 선택한다. war의 경우 웹 타입 프로젝트로 dynamic web 프로젝트가 생성되며 <strong>Anyframe</strong> Core Plugin이 샘플 코드와 함께 설치된다. jar의 경우 서비스 타입 프로젝트로일반 Java 프로젝트가 생성되며 <strong>Anyframe</strong> Core Plugin 라이브러리만 설치되고 샘플 코드는 설치되지 않는다.75


Eclipse IDE3. DB정보를 구성하기 위해 위 화면에서 Next 버튼을 클릭하였다면 다음과 같은 JDBC Configuration화면이 제공된다.<strong>Anyframe</strong> IDE 에서는 hsqldb, oracle, mysql, db2, sybase DB 타입에 대한 설정 및 template을 지원하고 있다. 사용하고 싶은 DB를 선택하여 DB정보를 구성한다. 프로젝트 생성할 때, 사용하고 싶은DB가 구동이 되어 있어야 샘플 테이블에 대한 DB 스크립트가 정상적으로 수행되므로, 가능한 한 사용하고 싶은 DB를 구동하는 것을 권장한다. 사용하고 싶은 DB를 결정하지 못한 경우 <strong>Anyframe</strong> 에서제공하고 있는 샘플 DB 인 hsqldb를 사용하도록 한다. 아래 링크되어 있는 hsqldb.zip 파일을 다운받아 압축을 해제하고, start.cmd 파일을 실행시켜 DB를 구동한다.표 11.1. Download ListNamehsqldb2.zipDownloadDownload [http://dev.anyframejava.org/docs/anyframe/ide/2.0.0/reference/download/sampledb/hsqldb2.zip]DB 정보 구성 후, Finish 버튼을 누르면 프로젝트가 생성된다.• Database Type: Database 타입으로, hsqldb, oracle, mysql, db2, sybase를 제공하고 있다.• Database Name: Database 의 이름• User Name: DB user 이름• Password: 패스워드• Server: DB가 설치된 서버 ip 정보, 로컬에서 사용하는 경우 localhost• Port: hsqldb의 경우 -1, oracle의 경우 1521, mysql의 경우 3306, Sybase는 3000, db2의 경우50000• Hibernate Dialect: Hibernate에서 쿼리 수행 시, DBMS에 최적화된 기능을 제공하기 위해 사용되는 것이 SQL Dialect 이며, 이 Dialect 프라퍼티를 사용하여 해당 DB 별 Dialect 정보를설정할 수 있다. 각 DB 별 Dialect 클래스가 따로 존재하여 hsqldb를 선택한 경우, 디폴트로org.hibernate.dialect.HSQLDialect값이 선택된다.(Oracle, MySQL, DB2, Sybase Dialect도 제공함)• Driver Class Name: DB의 드라이버 클래스를 설정해 주기 위한 값으로, hsqldb의 경우org.hsqldb.jdbcDriver 값으로 설정된다. Database Type 선택 시 해당 DB에 맞는 값이 세팅된다.• Driver Jar Path : <strong>Anyframe</strong> IDE 설치 시 샘플 DB를 위한 hsqldb driver jar 파일이 제공되므로 디폴트로 설정된다. 만약 다른 DB를 사용한다면 해당 DB의 Driver jar 파일로 연결시켜준다.• Schema: 스키마의 이름.• Group Id: pom.xml에 정의될 jdbc driver의 group id.• Artifact Id: pom.xml에 정의될 jdbc driver의 artifact id.• Version: pom.xml에 정의될 jdbc driver의 version 정보.4. 프로젝트 생성이 완료되면 Eclipse 내에 프로젝트가 정상적으로 생성되어 Import 되었는지 확인해본다.Maven 프로젝트의 경우 pom.xml 파일이 존재하며, M2Eclipse 가 활성화된 상태로 import 된다.M2Eclipse 가 활성화되면 생성된 프로젝트에 Maven Dependencies Libraries가 Build Path로 추가되어 프로젝트가 정상적으로 참조라이브러리를 인식하게 된다. 만약, M2Eclipse 에 문제가 있어 프로젝트가 정상적으로 라이브러리를 인식하지 못한다면, M2Eclipse를 Disable Dependency Management한 후 다시 Enable Dependency Management 해 주도록 한다. (Maven 프로젝트 선택 >> Maven >>76


Eclipse IDEDisable Dependency Management or Enable Dependency Management) Web 타입 프로젝트일 경우dynamic web 프로젝트로 생성되고, Service 타입 프로젝트일 경우 java 프로젝트로 생성된다.11.1.2.Ant 프로젝트 생성1. File >> New >> Other.. >> <strong>Anyframe</strong> >> Project 을 선택2. 열린 창에서 프로젝트 생성을 위해 다음과 같은 내용을 입력한다. 아래 항목을 문제없이 기입하는경우 Next 버튼과 Finish 버튼이 활성화 되며, Next 버튼을 클릭하면 DB정보를 구성할 수 있는 화면으로 연결된다.• Project Name: 프로젝트 이름.• Base Location: 프로젝트 생성 위치로, 디폴트 경로로 [<strong>Anyframe</strong> 이 설치된 root 경로]/applications가 지정된다. 디폴트로 지정되는 경로를 꼭 사용할 필요 없이 원하는 경로로 변경 가능하다.• Package Name: 대표 패키지 이름.• Web: Web 타입 프로젝트 생성하는 경우 선택한다. Dynamic Web 프로젝트가 생성되며 <strong>Anyframe</strong>Core Plugin이 샘플 코드와 함께 설치된다.• Service: 서비스 타입 프로젝트를 생성하는 경우 선택한다. 일반 Java 프로젝트가 생성되며<strong>Anyframe</strong> Core Plugin 라이브러리만 설치되고 샘플 코드는 설치되지 않는다.3. DB정보를 구성하기 위해 위 화면에서 Next 버튼을 클릭하였다면 다음과 같은 JDBC Configuration화면이 제공된다.<strong>Anyframe</strong> IDE 에서는 hsqldb, oracle, mysql, db2, sybase DB 타입에 대한 설정 및 template을 지원하고 있다. 사용하고 싶은 DB를 선택하여 DB정보를 구성한다. 프로젝트 생성할 때, 사용하고 싶은DB가 구동이 되어 있어야 샘플 테이블에 대한 DB 스크립트가 정상적으로 수행되므로, 가능한 한 사용하고 싶은 DB를 구동하는 것을 권장한다. 사용하고 싶은 DB를 결정하지 못한 경우 <strong>Anyframe</strong> 에서제공하고 있는 샘플 DB 인 hsqldb를 사용하도록 한다. 샘플 DB는 [<strong>Anyframe</strong> 이 설치된 root 경로]/ide/db/scripts/hsqldb 하위의 start.cmd 파일을 실행시켜서 구동한다.<strong>Anyframe</strong> IDE에서는 다양한 DB에 대한 샘플 쿼리문을 제공하고 있다. 현재는 oracle(sampledboracle.sql),mysql(sampledb-mysql.sql), sybase(sampledb-sybase.sql), db2(sampledb-db2.sql)에 대한 샘플쿼리문이 제공되고 있다. 이런 샘플쿼리문을 반영하기 위해서는 [<strong>Anyframe</strong> 이 설치된 root 경로]/ide/db/scripts/[DB명]/sampledb-[DB명].sql 파일의 스크립트를 해당 DB에서 실행해준다.DB 정보 구성 후, Finish 버튼을 누르면 프로젝트가 생성된다.• Database Type: Database 타입으로, hsqldb, oracle, mysql, db2, sybase를 제공하고 있다.• Database Name: Database 의 이름.• User Name: DB user 이름.• Password: 패스워드.• Server: DB가 설치된 서버 ip 정보, 로컬에서 사용하는 경우 localhost.• Port: hsqldb의 경우 -1, oracle의 경우 1521, mysql의 경우 3306, sybase는 3000, DB2의 경우50000• Hibernate Dialect: Hibernate에서 쿼리 수행 시, DBMS에 최적화된 기능을 제공하기 위해 사용되는 것이 SQL Dialect 이며, 이 Dialect 프라퍼티를 사용하여 해당 DB 별 Dialect 정보를설정할 수 있다. 각 DB 별 Dialect 클래스가 따로 존재하여 hsqldb를 선택한 경우, 디폴트로org.hibernate.dialect.HSQLDialect값이 선택된다.(Oracle, MySQL, DB2, Sybase Dialect도 제공함.)77


Eclipse IDE• Driver Class Name: DB의 드라이버 클래스를 설정해 주기 위한 값으로, hsqldb의 경우org.hsqldb.jdbcDriver 값으로 설정된다. Database Type 선택 시 해당 DB에 맞는 값이 세팅된다.• Driver Jar Path : <strong>Anyframe</strong> IDE 설치 시 샘플 DB를 위한 hsqldb driver jar 파일이 제공되므로 디폴트로 설정된다. 만약 다른 DB를 사용한다면 해당 DB의 Driver jar 파일로 연결시켜준다.• Schema: 스키마의 이름.4. 프로젝트 생성이 완료되면 Eclipse 내에 프로젝트가 정상적으로 생성되어 Import 되었는지 확인해본다. Ant 프로젝트의 경우 build.xml 빌드스크립트가 존재하며, Web 타입 프로젝트일 경우 dynamicweb 프로젝트로 생성되고, Service 타입 프로젝트일 경우 java 프로젝트로 생성된다.11.1.3.프로젝트 실행 및 설정 파일(project.mf) 확인생성된 프로젝트를 실행해 보고, 프로젝트 설정 파일(project.mf) 정보도 확인해본다.1. Web 타입 프로젝트일 경우, 서버를 실행하여 프로젝트를 실행해본다.프로젝트를 선택한 후 마우스 우측 버튼 클릭 >> Run As >> Run On Server 메뉴를 선택하고 이때 기존에 설정되어있던 Tomcat Server(6.0 Version 사용)가 없는 경우 등록해주고 실행하도록 한다.Web 타입 프로젝트의 경우 서버를 start 했을 때 열리는 web 페이지는 설치된 Plugin 목록이 보이는화면이다. 프로젝트 생성 이후에 <strong>Anyframe</strong> IDE Editor의 CRUD Generation 기능을 통해 생성되는 화면은 Plugin 목록 화면 우측의 "Generated CRUD Codes" 항목 하단에 생성된 코드 목록으로 나온다.2. 프로젝트 생성을 통해 만들어진 프로젝트 속성 파일(project.mf)의 프라퍼티를 확인해 본다. 변경하고 싶은 정보가 있을 경우 프라퍼티의 값을 수정하여 수정된 설정 값을 통해 소스가 생성되도록 할수 있다.아래 표에 설명된 항목별 내용을 보고 DB 설정을 비롯하여 다양한 공통 속성 값을 변경시킬 수 있다.현재 DB 속성 정보들의 디폴트 값은 hsqldb 샘플 DB에 대한 속성 값으로 설정되어 있다.78


Eclipse IDE표 11.2. project.mf - 프로젝트 정보Property Name Description Required Default Valueanyframe.home<strong>Anyframe</strong>을 설치한 루트 폴더로, Maven프로젝트일 경우는 사용하지 않는다.Y<strong>Anyframe</strong> 을 설치한 root 폴더 경로project.name 프로젝트 명 Y myprojectproject.home 프로젝트 루트 폴더 경로 Y [<strong>Anyframe</strong> 을 설치한 root 폴더 경로]/ applications/[프로젝트명]project.version 프로젝트 버전 Y 1.0-SNAPSHOTproject.type 프로젝트 타입 Y webproject.build 프로젝트 빌드도구 Y mavenproject.template.homeproject.templateproject.daoframework프로젝트 및 CRUD 소스 코드 생성 시 기반이 되는 Template 파일이 있는 루트 폴더 경로프로젝트 및 CRUD 소스 코드 생성 시기반이 되는 Template 형태(ex. default,miplatform 등)DAO Framework 선택(springjdbc, query,hibernate, ibatis2 중 택일)YYYMaven일 경우[Local repository경로]/.anyframe/templatesAnt일 경우[<strong>Anyframe</strong> 을 설치한 root 폴더경로]/templatesdefaultspringjdbcpackage.name 프로젝트 대표 패키지 명 Y 프로젝트명web.context.path프로젝트 빌드도구가 Ant일 경우에만 의미있는 값으로, jetty를 이용하여 web어플리케이션을 실행할 때 사용되는WebContext Path명Y프로젝트 명79


Eclipse IDE표 11.3. project.mf - DB 정보db.typeProperty Name Description Required Default ValueDB 정보(hsqldb, oracle, mysql, db2,sybase)Yhsqldbdb.name Database 명 Y sampledbdb.schema schema 명 Y PUBLICdb.server DB에 접근하기 위한 server정보 Y localhostdb.port DB에 접근하기 위한 port Y -1db.driver DB의 드라이버 클래스 설정 Y org.hsqldb.jdbcDriverdb.url DB에 접근하기 위한 Access URL Y jdbc:hsqldb:hsql://localhost/sampledbdb.userId DB 사용자 명 Y SAdb.password DB 사용자 패스워드 N N/Adb.libDB에 접근하기 위한 driver jar파일의 경로이때, 패스 표현 방법에 주의를 기울여야함 상대경로로 입력시 경로 처음에 '/'로시작하게 될 경우 절대경로로 인식하게됨YMaven일 경우C:/Documentsand Settings/[user name]/.m2/repository/hsqldb/hsqldb/2.0.0/hsqldb-2.0.0.jarAnt일 경우[<strong>Anyframe</strong> 이설치된 root 경로]/ide/db/lib/hsqldb-2.0.0.jardb.dialect DB별 Hibernate Dialect 클래스 설정 Y org.hibernate.dialect.HSQLDialectdb.groupIddb.artifactIddb.versiondb.schema.usejdbc driver group id 정보로, Maven 프로젝트 일 경우에만 사용되는 값jdbc driver artifact id 정보로, Maven 프로젝트 일 경우에만 사용되는 값jdbc driver version 정보로, Maven 프로젝트 일 경우에만 사용되는 값해당 DB가 Sybase DB일 경우, 지정해야 하는 속성으로 User 정보 셋팅시 DBSchema 정보를 사용할지 여부를 정의한다. 단, Sybase 버전에 따라 속성값은 변경될 수 있음에 유의하도록 한다.Y hsqldbY hsqldbY 2.0.0N false80


Eclipse IDE11.1.4.프로젝트 생성 시 발생할 수 있는 에러 해결Tip11.1.4.1.Out of memory프로젝트 생성 시 "java.lang.OutOfMemoryError:Java heap space" 같은 out of memory 에러가 발생할경우 다음과 같이 조치한다.1. 실행하고 있는 eclipse가 설치되어 있는 폴더로 이동한다.2. root 폴더 하위의 eclipse.ini 파일의 내용에서 launcher.XXMaxPermSize값(ex. 256M)을 높여서 재설정해준다. 필요 시 메모리 사용 최소값(-Xms)과 최대값(-Xmx)을 증가시켜서 사용하도록 한다. 다음은Eclipse 3.5.0(Galileo) 버전의 eclipse.ini 파일 예이다.-clean-startupplugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar--launcher.libraryplugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519-productorg.eclipse.epp.package.jee.product--launcher.XXMaxPermSize256M-showsplashorg.eclipse.platform--launcher.XXMaxPermSize128m-vmargs-Dosgi.requiredJavaVersion=1.5-Xms400m-Xmx512m11.1.4.2.Project Clean & JSP Validation Error• 프로젝트 생성 시 다음과 같이 생성된 프로젝트에 표시가 뜨는 경우, 프로젝트를 clean을 하거나해당 프로젝트를 close 한 후 다시 open하면 표시가 사라진다.☞ Project >> Clean... 수행☞ 프로젝트 선택 후 오른쪽 마우스 클릭 >> Close Project 후 프로젝트 선택 후 오른쪽 마우스 클릭 >> Open Project• Problems 에 JSP Validation 에러가 나오는 경우, 실제로 error는 아니지만 eclipse에서 인식을 에러로하는 것으로 다음과 같이 validation 설정을 변경해주면 된다. Eclipse 내 프로젝트에서 Validation 기능을 사용하게 되면 시간이 많이 소요될 수 있다. 반드시 필요한 경우가 아니고, 속도 향상을 위해서라면 Validation 설정을 모두 Disable All 버튼을 선택하여 사용하지 않는 것으로 설정할 수도 있다.☞ Window >> Preferences... >> Validation >> JPA Validator, JSP Syntax Validator 의 Build 항목 체크 해제 후 Apply81


Eclipse IDE11.2.Domain Generation<strong>Anyframe</strong> IDE을 이용해 Domain 클래스를 생성해본다.DB 테이블 기반으로 Domain 클래스를 생성시키기 때문에 JDBC 설정이 제대로 되었는지 [JDBCConfiguration 설정방법]을 참조하여 확인 한 후, Domain 클래스를 생성하도록 한다.1. 프로젝트를 선택한 후 우 클릭 >> <strong>Anyframe</strong> Tools >> <strong>Anyframe</strong> IDE 메뉴를 선택한다.2. <strong>Anyframe</strong> IDE Editor에서 Domain Generation Tab을 선택한다. Refresh 버튼을 수행하면 현재 선택가능한 DB Table들과 소스 코드 패키지가 트리 형태로 조회된다. 이때 Domain 클래스로 생성하고자 하는 Table을 선택하고, Domain 클래스를 어느 소스 코드 패키지 하위로 생성시킬 것인지를 선택한 후 Generate 버튼을 클릭한다.참조관계에 있는 테이블의 경우 해당 테이블을 동시에 선택하여 Domain 클래스를 생성 해야 하며,이를 통해 참조관계에 관한 정보가 제공된다.• Select Tables: JDBC 구성에 따라 연결된 DB의 테이블 목록이 조회된다.• Select a package: 해당 프로젝트에 있는 소스 코드 패키지 경로가 조회된다.(src/main/java 소스폴더에 한함)DB 타입이 mysql인 경우 테이블 선택 시 주의사항<strong>Anyframe</strong> IDE에서는 Hibernate Tools의 API를 이용하여 Domain 자동 생성기능을 지원하고 있다. DB가 mysql일 경우는 Hibernate Tools의 API에서 소문자로된 테이블명만인식하므로, 대문자로 된 테이블명을 선택하여 Domain 클래스 자동 생성 기능을 수행하는 경우 Domain 클래스가 생성되지 않을 수 있다.(Ant를 프로젝트 빌드도구로 사용하는 경우)3. Domain 클래스 생성 작업이 완료되면, Console 창을 통해 Build Successful 이라는 메세지가 출력된다. Domain 클래스가 제대로 생성되었는지 확인하기 위해 Domain 클래스 생성시 지정한 패키지 하위로 Domain 클래스들이 위치하고 있는지 확인한다. 생성된 Domain 클래스는 JPA Annotation 설정을 통해 DB Table, Column 정보들을 가지고 있다. 참고로, Build Successful 메세지가 출력되어도 해당 패키지에 Domain 클래스가 생성되지 않은 경우는 Domain 클래스가 정상적으로 생성되지 않은것이다. 예를 들어, DB 타입이 mysql인 경우처럼 Hibernate Tools의 API가 인식하지 못하는 테이블명이입력되었을 경우, Build Successful 메세지는 출력되지만 실제로 Domain 클래스는 생성되지 않는다.@Entity@Table(name = "BOARD")//@Table의 schema 속성은 default 템플릿을 활용하여//sybase DB와 hibernate dao framework을 사용할때 정의됨//@Table의 catalog 속성은 catalog 정보가 존재할 경우 정의됨public class Board implements Serializable {private BoardId id;private BoardMaster boardMaster;private String boardName;중략...@EmbeddedId@AttributeOverrides({@AttributeOverride(name = "boardId",column =@Column(name = "BOARD_ID",nullable = false)), @AttributeOverride(name = "boardMasterId",column =@Column(name = "BOARD_MASTER_ID",nullable = false))})public BoardId getId() {return this.id;}82


Eclipse IDE}public void setId(BoardId id) {this.id = id;}@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "BOARD_MASTER_ID", nullable = false,insertable = false, updatable = false)public BoardMaster getBoardMaster() {return this.boardMaster;}public void setBoardMaster(BoardMaster boardMaster) {this.boardMaster = boardMaster;}@Column(name = "BOARD_NAME", nullable = false, length = 150)public String getBoardName() {return this.boardName;}public void setBoardName(String boardName) {this.boardName = boardName;}참고위에서 설명한 기능 수행 도중에는 프로젝트 생성, 코드 생성 및 DB 변경 등과 같은<strong>Anyframe</strong> IDE의 기능을 동시에 수행시킬 수 없으므로 유의하도록 한다. (Background 실행을 통한 기능 수행 시)11.3.CRUD Generation<strong>Anyframe</strong> IDE를 이용해 CRUD를 생성해본다.Domain 클래스를 중심으로 CRUD에 대한 기본 코드를 생성하고 자동으로 테스트 코드와 테스트 데이터를 생성해줌으로써 생성된 코드의 기능 확인까지 손쉽게 할 수 있다. 따라서, CRUD Generation 기능을 사용하기 전에 Domain Generation 기능을 이용하여, 연결된 DB 테이블 기반의 Domain 클래스를 먼저 생성하도록 한다. Domain Generation 기능을 수행 할 때, 참조관계에 있는 테이블의 경우 해당 테이블을 동시에 선택하여 Domain 클래스를 생성하지 않으면, CRUD Generation 기능을 수행 할 때 에러가 발생하므로 주의한다.1. 프로젝트를 선택한 후 우 클릭 >> <strong>Anyframe</strong> Tools >> <strong>Anyframe</strong> IDE 을 선택한다.2. <strong>Anyframe</strong> IDE Editor에서 CRUD Generation Tab을 선택한다. Refresh 버튼을 수행하면 현재 선택 가능한 Domain 클래스 목록이 조회된다.3. CRUD 기능을 구현하고 싶은 Domain 클래스를 선택하고, CRUD Project Configuration 내용을 입력한다.• CRUD Service: CRUD 기능이 구현될 서비스 명은 디폴트로 Domain 클래스명에 Service 붙인 이름이 지정되며 조회만 가능하다.• Package: CRUD가 생성될 패키지 이름이며, 특정 서브 시스템 하위로 코드를 생성하고 싶다면 중간 패키지 정보를 함께 입력하면 된다. (ex. sub.categories)• Project Name: 프로젝트명으로 조회만 가능하다.• Web source code generation: 비즈니스 레이어에 해당하는 소스 뿐 아니라 프리젠테이션 레이어소스 코드들도 함께 생성하고자 한다면 체크 박스에 체크하도록 한다. Service 타입 프로젝트의 경우, 이 체크박스는 활성화 되지 않는다.4. Generate 버튼을 클릭한 후, CRUD 소스코드 생성 작업이 완료되면, Console 창을 통해 BuildSuccessful 이라는 메세지가 출력된다. CRUD 소스코드가 제대로 생성되었는지 확인하기 위해83


Eclipse IDEDomain 클래스에 대한 비즈니스 서비스 인터페이스,구현 클래스, DAO 클래스, Spring 설정 파일들,테스트 코드, 테스트 데이터 등을 확인해본다. Web 타입 프로젝트에는 Spring MVC Controller 클래스,Spring MVC 설정 파일, 테스트 코드, JSP 페이지 등이 생성된다. 참고로, CRUD 생성 후 소스파일에표시가 뜨는 경우는, <strong>Anyframe</strong> Test Plugin이 없기 때문이다. <strong>Anyframe</strong> IDE Editor의 Installation 탭에서 <strong>Anyframe</strong> Test Plugin을 다운받아 설치하면 해결된다. 또한, Build Successful 이라는 메세지가 출력되었음에도, CRUD 소스 코드가 정상적으로 생성되지 않았다면, [프로젝트 Home]/target/classes에 CRUD 소스코드 대상인 Domain 클래스에 대한 컴파일이 정상적이지 않거나, CRUD 소스코드 수행 시 필수적으로 필요한 폴더나 파일이 존재하지 않을 수도 있기 때문에 프로젝트에 대한 빌드를수행하거나, Console 창의 로그를 확인하여 필수적으로 필요한 폴더나 파일들을 확인하도록 한다.• 서비스인터페이스 (src/main/java/[대표패키지]/[-package 값]/service/[Entity 클래스명]Service.java)public interface BoardService{void create(Board board) throws Exception;void remove(BoardId id) throws Exception;중략...}• 서비스구현클래스 (src/main/java/[대표패키지]/[-package 값]/service/impl/[Entity 클래스명]ServiceImpl.java)@Service("boardService")@Transactional(rollbackFor = {Exception.class}, propagation = Propagation.REQUIRED)public class BoardServiceImpl implements BoardService {@Inject@Named("boardDao")private BoardDao boardDao;public void create(Board board) throws Exception{this.boardDao.create(board);}}public void remove(BoardId id) throws Exception {this.boardDao.remove(id);}중략...• DAO클래스 (src/main/java/[대표패키지]/[-package 값]/service/impl/[Entity 클래스명]Dao.java)@Repository("boardDao")public class BoardDaoQueryImpl extends AbstractDAO {@Value("#{contextProperties['pageSize'] ?: 10}")int pageSize;@Value("#{contextProperties['pageUnit'] ?: 10}")int pageUnit;@Injectpublic void setQueryService(IQueryService queryService) {super.setQueryService(queryService);}/** {@inheritDoc} */public void create(Board board) throws Exception {super.create("Board", board);84


Eclipse IDE}}/** {@inheritDoc} */public void remove(BoardId id) throws Exception {Board board = new Board();board.setId(id);super.remove("Board", board);}중략...• 매핑쿼리문 (src/main/resources/sql/query/mapping-query-[Entity 클래스명].xml)INSERT INTO BOARD (BOARD_ID, BOARD_DESC, BOARD_MASTER_ID, BOARD_NAME,BOARD_ORDER, BOARD_TOPICS, REG_DATE)VALUES (:vo.id.boardId, :vo.boardDesc, :vo.id.boardMasterId, :vo.boardName,:vo.boardOrder, :vo.boardTopics, :vo.regDate)중략...• MessageSoruce (src/main/resources/message/message-generation.properties)# -- Board-STARTboard.id.boardId=Board Idboard.id.boardMasterId=Board Master Idboard.boardDesc=Board Descboard.boardName=Board Nameboard.boardOrder=Board Orderboard.boardTopics=Board Topicsboard.regDate=Reg Date# -- success messages --success.board.create=Board has been added successfully.success.board.update=Board has been updated successfully.success.board.delete=Board has been deleted successfully.# -- error messages --error.boardserviceimpl.create=Board data not createderror.boardserviceimpl.create.solution=Enter correct data for mandatory fieldor enter data according to formats means date format as yyyy-mm-dderror.boardserviceimpl.create.reason=Entered incorrect data for Board중략...• 통합 test case (src/test/java/[대표패키지]/[-package 값]/service/[Entity 클래스명]ServiceTest.java)@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = { "file:./src/main/resources/spring/context-*.xml" })public class BoardServiceTest{@Inject@Named("boardDao")private BoardDao boardDao;@Test85


Eclipse IDE@Rollback(value=true)public void manageBoard() throws Exception {// 1. create a new boardBoard board = getBoard();if(boardService.get(board.getId()) != null)boardService.remove(board.getId());}boardService.create(board);중략...}중략...• 컨트롤러 (src/main/java/[대표패키지]/[-package 값]/web/[Entity 클래스명]Controller.java)@Controller@RequestMapping("/board.do")public class BoardController {/*** Resource Injection on BoardService*/@Inject@Named("boardService")private BoardService boardService;중략.../*** Display form for adding Board.* @param model model containing control data* @return the prepared form view* @throws Exception in case of an invalid new form object*/@RequestMapping(params = "method=createView")public String createView(Model model) throws Exception{model.addAttribute(new Board());}}return "genViewBoard";• UI JSP 파일 (src/main/webapp/WEB-INF/jsp/[Entity 클래스 명]/*.jsp)Home &gt; Boardfunction fncCreateBoardView() {document.location.href="";}중략...86


Eclipse IDE• 단위 test case (src/test/java/[대표패키지]/[-package 값]/web/[Entity 클래스명]ControllerTest.java)@RunWith(JMock.class)public class BoardControllerTest {private BoardController controller;private String SUCCESS_CREATEVIEW = "genViewBoard";private String SUCCESS_CREATE = "redirect:/board.do?method=list";private String SUCCESS_GET = "genViewBoard";private String SUCCESS_UPDATE = "redirect:/board.do?method=list";private String SUCCESS_LIST = "genListBoard";private String SUCCESS_REMOVE = "redirect:/board.do?method=list";private Mockery context = new JUnit4Mockery();private BoardService mockService = null;@Beforepublic void setUp() throws Exception {System.setProperty("log4j.configuration", "log4j-test.xml");}this.mockService = context.mock(BoardService.class);this.controller = new BoardController();this.controller.setBoardService(this.mockService);public void setBoardController(BoardController controller) {this.controller = controller;}@Testpublic void testCreateView() throws Exception{String viewName = this.controller.createView(new ExtendedModelMap());}assertEquals("returned correct view name", SUCCESS_CREATEVIEW, viewName);중략...참고 1위에서 설명한 기능 수행 도중에는 프로젝트 생성, 코드 생성 및 DB 변경 등과 같은<strong>Anyframe</strong> IDE의 기능을 동시에 수행시킬 수 없으므로 유의하도록 한다. (Background 실행을 통한 기능 수행 시)참고 2CRUD 소스 코드 생성은 Domain 클래스를 기반으로 이루어지는데, 이를 위해 Domain 클래스를 포함한 전체 프로젝트의 소스 코드를 컴파일을 한 후 컴파일된 Domain 클래스를이용하여 코드를 생성한다. 그러므로 프로젝트 내 소스 코드의 양이 많아 CRUD 소스 코드생성 시 컴파일에 걸리는 시간이 많이 소요되는 경우, [<strong>Anyframe</strong> Home]/ide/cli/scripts 폴더 내에 있는 code-generation.xml 파일에서 "create-crud" target 내에 정의된 다음 cleantarget을 호출해주는 부분을 제거해주도록 한다. clean target에서는 기존에 컴파일된 모든 소스 코드를 삭제한 후 이후 compile target에서 새로 전체 소스 코드를 컴파일하게 되므로 소스 코드의 양이 많을 경우 시간이 많이 소요될 수 있다. 속도 향상을 위해서 cleantarget을 제거하는 경우 incremental build를 수행하는 compile target에 의해 변경된 소스코드만 컴파일되므로 시간이 적게 소요된다.87


Eclipse IDE11.3.1.CRUD 소스코드 생성 후 런타임 시 발생하는에러 해결 TipCRUD 소스코드는 정상적으로 생성되었지만 런타임시에 발생할 수 있는 문제에 대한 해결방법은 [CRUD소스코드 생성 후 런타임 시 발생하는 에러 해결 Tip]을 참조한다.11.4.Configuration<strong>Anyframe</strong> IDE를 사용하기 위해 Project Location 확인 및 DAO Frameworks, Template 정보를 설정한다.프로젝트는 기본적으로 SpringJDBC DAO Framework을 사용하도록 설정되어 있으며, Hibernate/JPA으로 DAO Framework 설정을 변경하고 싶을 경우 Installation Tab에서 Hibernate Plugin을 설치해야 한다.Hibernate/JPA Plugin이 설치되어 있지만 예외적으로 template이 miplatform으로 설정되어 있는 경우는Hibernate/JPA Framework을 사용할 수 없다.Template은 기본적으로 default, map, miplatform이 제공되는데, Installation Tab에서 Mip-Query Plugin을 설치한 경우에 miplatform Template을 사용할 수 있다.1. 프로젝트를 선택한 후 우 클릭 >> <strong>Anyframe</strong> Tools >> <strong>Anyframe</strong> IDE 을 선택한다.2. <strong>Anyframe</strong> IDE Editor에서 Configuration Tab을 선택하고 프로젝트 경로 확인 및 DAO Framework,Template 정보를 구성한다.• Project Location: 현재 프로젝트가 생성된 위치정보가 보인다.• DAO Frameworks: SpringJDBC, Query Service, Hibernate/JPA, iBatis2 중에 하나를 선택할 수 있고,Hibernate/JPA는 Hibernate Plugin을 설치한 이후에 선택이 가능하다. map, miplatform Template의 경우 Query Service만 지원된다. default Template의 경우에 4가지 DAO Framework을 모두 사용할 수 있다.• Template Selection: 소스코드 template을 설정하기 위한 섹션으로 Maven 프로젝트 일 경우에만Template Home 경로를 변경할 수 있는 기능이 추가로 제공된다.• Template Home: Maven 프로젝트 일 경우에만 활성화 되는 부분으로, Template 홈 경로를 변경할 수 있다. Ant 프로젝트 일 경우는 [<strong>Anyframe</strong> 을 설치한 root 폴더 경로]/templates 가 templatehome 경로로 되며, 화면에서 변경할 수 없다.• Template Type: Template Home 경로 하위에 있는 template을 리스트로 보여주며, 기본적으로default, map template이 지원된다. default template은 Spring/SpringMVC 등으로 구성된 소스코드 template이 제공된다. Mip-Query Plugin을 설치한 경우 miplatform template도 선택할 수 있다. miplatform template을 사용한 경우, PID(Presentation Interface Developer)가 설치되어 있어야 생성된 소스가 정상적으로 동작한다.3. 입력정보 작성이 끝나면 반드시 Apply 버튼을 클릭하여 Configuration 정보가 저장되도록 한다. 구성한 정보가 정상적으로 반영되었는지 확인하기 위해서는 탐색기에서 선택한 프로젝트 경로로 이동하여, project.mf 파일내의 project.daoframework(DAO Frameworks), project.template.home(TemplateHome 경로), project.template(Template Type) 항목의 값을 확인해본다. 정상적으로 반영이 되었다면, 해당 항목의 값이 입력한 값들로 변경되어 보일 것이다. 참고로, project.home은 프로젝트 경로정보이다.11.5.JDBC Setting<strong>Anyframe</strong> IDE의 Domain 클래스를 생성 기능을 사용하기 위해서 DB 연결정보를 설정한다.88


Eclipse IDE1. 프로젝트를 선택한 후 우 클릭 >> <strong>Anyframe</strong> Tools >> <strong>Anyframe</strong> IDE 을 선택한다.2. <strong>Anyframe</strong> IDE Editor에서 JDBC Setting Tab을 선택하고 JDBC 연결정보를 입력한다.• JDBC Configuration• Database Type: Database 타입으로 hsqldb, oracle, mysql, db2, sybase 를 제공하고 있다.• Database Name: Database의 이름• User Name: DB user 이름• Password: 패스워드• Server: DB가 설치된 서버 ip 정보, 로컬에서 사용하는 경우 localhost• Port: hsqldb의 경우 -1, oracle의 경우 1521, mysql의 경우 3306, sybase는 3000, db2의 경우50000• Hibernate Dialect: Hibernate에서 쿼리 수행 시, DBMS에 최적화된 기능을 제공하기 위해 사용되는 것이 SQL Dialect 이며, 이 Dialect 프라퍼티를 사용하여 해당 DB 별 Dialect 정보를설정할 수 있다. 각 DB 별 Dialect 클래스가 따로 존재하여 hsqldb를 선택한 경우, 디폴트로org.hibernate.dialect.HSQLDialect값이 선택된다.(oracle, mysql, db2, sybase Dialect 도 제공함)• Driver Class Name: DB의 드라이버 클래스를 설정해 주기 위한 값으로, hsqldb의 경우org.hsqldb.jdbcDriver 값으로 설정된다. Database Type 선택 시 해당 DB에 맞는 값이 세팅된다.• Driver Jar Path: <strong>Anyframe</strong> IDE 설치 시 샘플 DB를 위한 hsqldb driver jar 파일이 제공되므로 디폴트로 설정된다. 만약 다른 DB를 사용한다면 해당 DB의 Driver jar 파일로 연결시켜준다.• Schema: DB 스키마의 이름• JDBC Driver Artifact Setting : Maven 프로젝트 일 경우에만 활성화 됨.• Group Id: jdbc driver 의 group id• Artifact Id: jdbc driver 의 artifact id• Version: jdbc driver의 version3. 입력정보 작성이 끝나면 반드시 Apply 버튼을 클릭하여 JDBC Configuration 정보가 저장되도록 한다.Schema 정보를 리스트에서 선택하지 않고 Apply 버튼을 클릭할 경우, Schema 를 선택하라는 메시지가 출력된다. Schema 를 제외한 나머지 JDBC Configuration 정보가 정상적인 경우 Schema 정보를 얻어올 수 있으며, 얻어온 리스트에서 Schema 를 선택하여 Apply 하면 Configuration 정보가 반영된다.Schema 정보를 얻어오기 위해 시도 했으나, DB 연결이 정상적으로 되지 않는 경우에는 실패원인을 알려주는 메세지가 출력된다.JDBC 환경 설정 정보가 정상적으로 구성되어 DB와 잘 연결되는지 확인하기 위해서는 DomainGeneration Tab으로 이동하여 Refresh 버튼을 클릭해본다. 이때 정상적으로 연결이 잘 되는 경우라면 해당 DB의 Table들이 조회될 것이다.참고위에서 설명한 기능 수행 도중에는 프로젝트 생성, 코드 생성 및 DB 변경 등과 같은<strong>Anyframe</strong> IDE의 기능을 동시에 수행시킬 수 없으므로 유의하도록 한다. (Background 실행을 통한 기능 수행 시)89


Eclipse IDE11.6.<strong>Anyframe</strong> Plugin Installation<strong>Anyframe</strong> IDE에서 <strong>Anyframe</strong>에서 제공하는 Plugin을 Install/Uninstall 하기 위해서 사용한다. Plugin을 설치하면 해당 Plugin과 연관된 라이브러리가 설치되며, 일부 Plugin의 경우 샘플코드를 제공하고 있다. 제공되는 샘플코드를 라이브러리와 함께 설치하고 싶은 경우, "Install plugins with sample"에 체크한다.1. 프로젝트를 선택한 후 우 클릭 >> <strong>Anyframe</strong> Tools >> <strong>Anyframe</strong> IDE 을 선택한다.2. <strong>Anyframe</strong> IDE Editor에서 Installation Tab을 선택하면 다음과 같은 항목이 보인다.• Update list: Remote <strong>Anyframe</strong> Repository로 부터 <strong>Anyframe</strong> Plugin 목록 파일을 update 받는기능이 수행된다. 디폴트로 update된 파일(plugin-catalog-X.X.X.xml)은 [사용자 계정 홈 디렉토리]/.anyframe 폴더 하위에 존재하게 된다.• !: Install/Uninstall 할 대상을 체크하는 부분으로 다수의 Plugin을 선택할 수 있다.• Plugin Name: Plugin 명• Group Id: Plugin Library의 Group 명• Artifact Id: Plugin Library 명• Latest: Plugin의 최신 버전• Installed: 설치된 Plugin 버전• Install plugins with sample: 샘플코드를 라이브러리와 함께 설치하고 싶은 경우 체크박스에 체크하며,Service 타입 프로젝트에서는 비활성화 된다.3. 설치 또는 제거할 Plugin 항목을 체크한 후, Install 혹은 Uninstall 버튼을 클릭한다. 이 때, tomcat은stop 시킨 상태에서 수행하도록 한다. 그렇지 않은경우, 동작은 정상적으로 수행되나, 아래 4번 내용과 같은 에러가 발생하게 된다.• Install : Web 타입 프로젝트에서 해당 Plugin과 샘플이 함께 설치된 경우, 적용된 Plugin 샘플은 프로젝트를 실행시켜봄으로써 확인할 수 있다. 샘플 실행방법은[ New Project Creation]의 프로젝트실행방법 내용을 참조한다.• metadata 정보확인: 프로젝트 폴더 >> META-INF 폴더>> plugin-installed.xml 파일에 설치한Plugin에 대한 정보가 추가된다.org.anyframe.pluginanyframe-core-pix.x.xtruefalse• Ant 프로젝트• Web 타입: 프로젝트 Web App Libraries에 라이브러리 추가.• Service 타입: [프로젝트 Home]/lib에 라이브러리 추가되고, .classpath에 클래스패스가 추가됨.중략...90


Eclipse IDE• Maven 프로젝트 : 설치한 Plugin과 관련된 라이브러리 정보가 pom.xml 의 에 추가됨.• Uninstall : Installed 항목에서 X표시가 되며, 다음과 같은 방법으로 확인 할 수 있다.• metadata 정보확인: 프로젝트 폴더 >> META-INF 폴더>> plugin-installed.xml 파일에서 해당Plugin에 대한 정보가 제거된다.• Ant 프로젝트• Web 타입: 프로젝트 Web App Libraries에 라이브러리 삭제.• Service 타입: [프로젝트 Home]/lib에 라이브러리 삭제되고, .classpath에 클래스패스가 삭제됨.• Maven 프로젝트 : 설치한 Plugin과 관련된 라이브러리 정보가 pom.xml 의 에 삭제됨.• 프로젝트 하위로 uninstalled 폴더가 생겨나고, 그 하위로 "yyyyMMddHHmmss" 패턴에 해당하는 시간 별 폴더가 생겨나고 이 폴더 내에 uninstall 대상이 되는 파일들이 백업용으로 남게 된다.4. Plugin Install/Uninstall 시에 다음 그림과 같은 메시지가 뜨는 경우는 tomcat이 실행된 상태에서tomcat이 인식하고 있는 파일에 변경이 있는 경우에 발생하는 것이다.아래와 같은 메시지는 Plugin Install/Uninstall/update 전에 tomcat 동작을 stop 시킬 경우에는 뜨지않는다.11.7.CTIP참고위에서 설명한 기능 수행 도중에는 프로젝트 생성, 코드 생성 및 DB 변경 등과 같은<strong>Anyframe</strong> IDE의 기능을 동시에 수행시킬 수 없으므로 유의하도록 한다. (Background 실행을 통한 기능 수행 시)IDE에서 Hudson을 연결하여 Hudson에 job을 등록하고 job을 실행하기 위해서 사용한다. Hudson 서버와 통신을 하기 위해서는 anyframe-ide-eclipse-hudson-X.X.X.jar 파일을 이용해 설정을 해야 한다. 설치91


Eclipse IDE및 설정과 관련된 자세한 사항은 Continuous Build Server의 [Installation]과 [Build Server(Hudson) 연계]을 참조한다.1. 프로젝트를 선택한 후 우 클릭 >> <strong>Anyframe</strong> Tools >> <strong>Anyframe</strong> IDE 을 선택한다.2. <strong>Anyframe</strong> IDE Editor에서 CTIP Tab을 선택하면 다음과 같은 항목이 보인다.• Hudson URL• URL: Hudson 서버에 접근하기 위한 url• Configure...: Hudson 서버에 접근하기 위한 url을 등록,수정,삭제 등 관리하기 위한 팝업 화면호출• Hudson Configuration• MAVEN_HOME: 프로젝트에서 Maven 빌드도구를 사용하는 경우 보여지며, Maven이 설치된 경로로 설정• ANT_HOME: 프로젝트에서 Ant 빌드도구를 사용하는 경우 보여지며, Ant가 설치된 경로로 설정• Hudson URL in Email: Hudson Email Notification 시 사용할 url• All projects• Project name: ctip job name• Status: job 수행 상태로, job을 빌드 하는 중일 경우 building라는 메세지가 출력됨• New : 새로운 job 추가• Remove : job 삭제• Run : job 실행• Project Details92


Eclipse IDE• Build Type* : build는 빌드를 수행하고 배포파일 생성, report는 build 기능에 JUnit test, Emma,Jdepend, PMD등의 reporting 기능도 수행표 11.4. Build TypeType build reportAnt(target) deploy allMaven(goal) package clean sitepackage• Project Name* : Hudson job name• Custom Workspace : workspace 경로지정• SCM Server Type : subversion, cvs, none 세가지 type 중 선택• SCM Server URL : SCM 서버 url• Poll SCM schedule : job 실행 스케쥴 정의• Build other project : 해당 job 수행 후 실행한 job의 이름 지정3. 빌드를 수행할 job을 목록에서 선택하고 Run 버튼을 클릭하여 빌드를 수행한다.빌드가 수행되면 Status는 "building"로 보여진다. 빌드 Status에 대해 scheduling이 걸려있지 않기때문에, 빌드 결과는 refresh 버튼을 클릭하여 확인한다.빌드가 다 수행이 되면 refresh 버튼을 눌렀을때 빌드 결과에 대한 이미지가 보여진다. 성공은 파란색, 실패는 빨간색.Web 타입 프로젝트의 경우 해당 Plugin과 샘플이 함께 설치되며, 해당 Plugin 적용된 샘플은 프로젝트를 실행시켜봄으로써 확인할 수 있다. Service 타입 프로젝트의 경우 해당 Plugin의 라이브러리만 설치된다.참고위 화면을 통해서 test case 가 없는 프로젝트에 대해서 job을 생성한 후 빌드했을 때,FAILURE가 발생한다. 이는 에러는 아니지만 test case에 대해 recording을 하기 위해, Junit,93


Eclipse IDEEmma Plugin이 출력하는 메세지이므로 test case를 사용하지 않을 경우 해당 Plugin을사용하지 않도록 설정해주어야 한다. "[프로젝트명]_report" job의 configure에서 "PublishJUnit test result report", "Record Emma coverage report" action을 uncheck 한다.Job 빌드 시 메모리 부족으로 Fail 한 경우등록한 job에 대해 빌드 수행시 다음과 같은 에러가 발생 할 경우 환경변수에 MAVEN_OPTS를 -Xmx1024m으로 추가 설정해준다.• 환경변수 설정변수이름 : MAVEN_OPTS변수 값 : -Xmx1024m• 콘솔에 출력된 에러로그11.8.Project BuildError occurred during initialization of VMCould not reserve enough space for object heapCould not create the Java virtual machine...<strong>Anyframe</strong> IDE 을 이용해 프로젝트 빌드를 수행할 수 있다.프로젝트 생성 시에 빌드 스크립트 파일이 함께 생성되어, 빌드를 수행할 수 있다. 빌드 도구로 Ant를사용할 경우 default target 빌드 수행 시 컴파일, 테스트, 패키징, 배포 등의 공통적인 빌드 프로세스단계를 수행해주고 있다. Maven 프로젝트의 경우 pom.xml 파일을 이용하여 빌드 및 패키징, 리포팅을 수행할 수 있다.아래의 두 가지 경우로 나누어서 살펴보자.• [Maven 프로젝트 빌드]• [Ant 프로젝트 빌드]11.8.1.Maven 프로젝트 빌드프로젝트 내 pom.xml 확인Maven은 pom.xml 파일을 기반으로 빌드되기 때문에 파일에 정의되어 있는 내용 확인한다. Reporting을위해서는 에 report를 남기고 싶은 Plugin들이 정의되어 있어야 하며, <strong>Anyframe</strong> IDE을 통해서생성된 Maven 프로젝트에는 Junit Test, Emma, Jdepend, PMD 등의 reporting Plugin이 추가되어 있다.다음은 Web 타입 프로젝트에 생성된 pom.xml 의 일부분이다.trueorg.apache.maven.pluginsmaven-surefire-plugin2.5always94


Eclipse IDE중략...프로젝트 내 pom.xml 선택 후 >> Run As >> Maven Build...을 선택Goals 에 clean package 를 수행하게 되면 빌드 수행결과 파일 및 Web 타입 프로젝트일 경우 war 파일이, Service 타입 프로젝트일 경우 jar 파일이 생성되고, clean site package 를 수행하게 되면 리포트 결과물도 함께 생성되게 된다. 빌드 결과물은 [프로젝트 Home]/target에 존재하며, 리포트 결과물은 [프로젝트 Home]/target/site/내에 존재한다.만약 M2Eclipse 를 이용하여 이를 수행하였을 때 "site" goal이 정상적으로 수행이 안 된다면, pom.xml파일이 있는 경로에서 위와 같은 goal을 cmd창을 통해 수행한다.11.8.2.Ant 프로젝트 빌드1. 프로젝트 내 build.xml 확인프로젝트 내부로 자동 생성되어진 build.xml 파일이 존재한다. 빌드 스크립트 내에는 빌드 수행을 위한 compile, test, package등 공통적으로 사용되는 빌드 target들이 존재한다. 실제 구동 내역을 가지고 있는 공통 스크립트는 [<strong>Anyframe</strong> 을 설치한 root 폴더 경로]/ide/cli/scripts/project-build.xml 파일내에 작성되어 있다. 프로젝트 별로 변경해야 하는 일이 생기면 공통 스크립트를 수정하면 된다. 또한 각 프로젝트 단위 별로 공통 빌드 내역 외에 특화된 빌드 내용을 추가해야 하는 경우에는 해당 빌드 target을 확장하여 추가해 넣을 수 있다.web 타입 프로젝트의 경우, [프로젝트가 생성된 위치]src/main/webapp/WEB-INF/lib 폴더를 클래스패스로 설정하여 빌드하고, service 타입 프로젝트의 경우, [프로젝트가 생성된 위치]/lib 폴더를 클래스패스로 설정하여 빌드한다.다음은 Web 타입 프로젝트에 생성된 build.xml 의 일부분이다.2. 프로젝트 내 build.xml 선택 후 >> Run As >> Ant Build 을 선택default target이 수행되어 다음과 같은 빌드 프로세스를 거치게 된다. 최종 결과물인 프로젝트 바이너리 파일은 [프로젝트 Home]/dist 폴더 내에 존재하게 된다.init -> resources -> compile -> package3. 프로젝트 내 build.xml 선택 후 >> Run As >> Ant Build... 을 선택하여 뜬 팝업에서 all target만 지정.95


Eclipse IDEdefault target이 아닌 리포팅 결과물을 생성해내는 target을 실행시켜 본다. 빌드 시 코드 분석 리포트, 테스트 수행 결과 리포트, 코드 커버리지 리포트 등을 생성시킨다. 리포트 결과물은 [프로젝트Home]/target/output 폴더에 생성되므로 빌드가 모두 완료된 뒤 확인해보도록 한다.clean -> init -> resources -> compile -> test-resources -> test-compile -> package -> emma-jars -> test -> report96


IV.Plugins<strong>Anyframe</strong>에서는 Spring, Hibernate, CXF, Struts 등과 같은 다양한 오픈 소스들을 중심으로 참조 라이브러리와 샘플코드를 엮어서 구성된 다양한 Plugin들을 제공함으로써 사용자가 원하는 Plugin들을 적절히 선택하고 설치함으로써해당 프로젝트에 필요한 기능들을 갖춘 샘플 프로젝트를 손쉽게 구성할 수 있도록 지원한다.


12.Plugin 목록다음은 <strong>Anyframe</strong>에서 제공하는 Plugin 목록이다. 목록 표 내용 중 Plugin Type 항목은 해당 Plugin이essential한 Plugin인지 Optional한 Plugin인지에 대한 구분을 위한 항목으로 essential의 경우 <strong>Anyframe</strong>Plugin 사용 시 기본적으로 설치되어야 하는 Plugin임을 나타내는 타입이다. optional의 경우 필요한 경우에 선택적으로 설치해서 사용할 수 있는 Plugin임을 나타내는 타입이다. 현재 datasource, logging, springplugin은 core plugin이 동작하는데 필요한 필수 plugin으로 core plugin 설치 시 함께 설치되고 있다.No Plugin Name Description PluginType1 core [http:// 다른 Plugin 설치를 위한 기반을 제공하는 Plugin이며, essentialdev.anyframejava.org/ SpringMVC + Spring을 이용한 영화 정보 관리 기능을 제공한다.docs/anyframe/plugin/essential/core/1.0.0/reference/htmlsingle/core.html]docs/anyframe/plugin/essential/core/1.0.0/reference/htmlsingle/core.html#core_spring_datasource][참조] IoC [http://dev.anyframejava.org/docs/anyframe/plugin/essential/core/1.0.0/reference/htmlsingle/core.html#core_spring_ioc], AOP [http://dev.anyframejava.org/docs/anyframe/plugin/essential/core/1.0.0/reference/htmlsingle/core.html#core_spring_aop], Annotation [http://dev.anyframejava.org/docs/anyframe/plugin/essential/core/1.0.0/reference/htmlsingle/core.html#core_spring_annotation], SpringMVC [http://dev.anyframejava.org/docs/anyframe/plugin/essential/core/1.0.0/reference/htmlsingle/core.html#core_springmvc_part], SpEL [http://dev.anyframejava.org/docs/anyframe/plugin/essential/core/1.0.0/reference/htmlsingle/core.html#core_spring_spel], Validation [http://dev.anyframejava.org/docs/anyframe/plugin/essential/core/1.0.0/reference/htmlsingle/core.html#core_springmvc_validation], Transaction [http://dev.anyframejava.org/docs/anyframe/plugin/essential/core/1.0.0/reference/htmlsingle/core.html#core_spring_transaction] 등2 datasource [http:// Database에 연결하기 위한 Connection(javax.sql.Connection) essentialdev.anyframejava.org/ 객체를 생성하는 Datasource 관련 설정 파일과 라이브러리를제공한다. core plugin이 동작하는데 필요한 필수 plugin이다.[참조] DataSource [http://dev.anyframejava.org/docs/anyframe/plugin/essential/core/1.0.0/reference/htmlsingle/core.html#core_spring_datasource]3 logging [http:// Log4j를 이용하여 Log를 체계적으로 관리할 수 있는 기능을 essentialdev.anyframejava.org/ 제공한다. core plugin이 동작하는데 필요한 필수 plugin이다.docs/anyframe/plugin/essential/[참조] Logging [http://dev.anyframejava.org/docs/core/1.0.0/reference/anyframe/plugin/essential/core/1.0.0/reference/htmlsingle/core.html#core_logging_part]htmlsingle/core.html#core_logging_part]4 essential98


Plugin 목록No Plugin Name Description PluginTypespring [http:// Spring 관련 라이브러리를 제공한다. core plugin이 동작하는dev.anyframejava.org/ 데 필요한 필수 plugin이다.docs/anyframe/plugin/essential/ [참조] Spring [http://dev.anyframejava.org/docs/anyframe/core/1.0.0/ plugin/essential/core/1.0.0/reference/htmlsingle/reference/ core.html#core_spring_part]htmlsingle/core.html#core_spring_part]5 cxf [http:// Apache CXF관련 라이브러리를 제공한다.dev.anyframejava.org/docs/anyframe/plugin/optional/cxf/1.0.0/[참조] Web Services [http://dev.anyframejava.org/docs/anyframe/plugin/optional/cxf/1.0.0/reference/htmlsingle/cxf.html#cxf_overview]reference/htmlsingle/cxf.html]optional6 cxf-jaxrs [http:// Apache CXF를 활용하여 HTTP 기반의 REST 아키텍처 스타일 optionaldev.anyframejava.org/ 의 웹 서비스로 구현한 영화 정보 관리 기능을 제공한다.docs/anyframe/plugin/optional/cxf-jaxrs/1.0.0/reference/htmlsingle/cxfjaxrs.html][참조] RESTful Web Services : JAX-RS Frontend [http://dev.anyframejava.org/docs/anyframe/plugin/optional/cxf-jaxrs/1.0.0/reference/htmlsingle/cxfjaxrs.html#cxf_jaxrs]7 cxf-jaxws [http:// Apache CXF를 활용하여 SOAP 기반의 웹 서비스로 구현한 영 optionaldev.anyframejava.org/ 화 정보 목록 및 상세 조회 기능을 제공하고 있으며 자동 생docs/anyframe/ 성된 WSDL을 확인할 수 있다.plugin/optional/cxf-jaxws/1.0.0/[참조] Web Services : JAX-WS Frontend [http://reference/htmlsingle/cxfjaxws.html]dev.anyframejava.org/docs/anyframe/plugin/optional/cxfjaxws/1.0.0/reference/htmlsingle/cxfjaxws.html#cxf_jaxws]8 cache [http:// OSCache와 <strong>Anyframe</strong>에서 구현한 Cache Service를 이용한 영 optionaldev.anyframejava.org/ 화 정보 관리 기능을 제공한다.docs/anyframe/plugin/optional/cache/1.0.0/reference/htmlsingle/cache.html]docs/anyframe/plugin/optional/chart/1.0.0/reference/htmlsingle/chart.html][참조] Cache [http://dev.anyframejava.org/docs/anyframe/plugin/optional/cache/1.0.0/reference/htmlsingle/cache.html#cache_cache]9 chart [http:// 오픈 소스 Chart 기능을 제공하는 FusionChart Free를 활용하 optionaldev.anyframejava.org/ 여 Ajax 기법으로 웹 페이지 내에서 사용할 수 있는 Chart 기능을 제공한다.[참조] FusionChart Free [http://dev.anyframejava.org/docs/anyframe/plugin/optional/chart/1.0.0/reference/htmlsingle/chart.html#chart_chart_part]10 excel [http:// Apache POI의 서브 프로젝트인 HSSF와 Query Service를 이 optionaldev.anyframejava.org/ 용하여 Movie목록을 Excel파일로 처리하는 기능을 제공한다.99


Plugin 목록No Plugin Name Description PluginTypedocs/anyframe/plugin/optional/excel/1.0.0/reference/htmlsingle/excel.html][참조] Apache POI를 이용한 Excel 처리 [http://dev.anyframejava.org/docs/anyframe/plugin/optional/excel/1.0.0/reference/htmlsingle/excel.html#excel_integration_part]11 fileupload [http:// Apache commons-fileupload와 Spring MVC를 기반으로 개발 optionaldev.anyframejava.org/ 된 파일업로드의 기본 활용 방법을 가이드한다.docs/anyframe/plugin/optional/fileupload/1.0.0/reference/htmlsingle/fileupload.html]docs/anyframe/plugin/optional/flex-query/1.0.0/reference/htmlsingle/flexquery.html][참조] Apache commons-fileupload와 SpringMVC [http://dev.anyframejava.org/docs/anyframe/plugin/optional/fileupload/1.0.0/reference/htmlsingle/fileupload.html#fileupload_usage_part]12 flex-query [http:// Adobe Flex와 BlezeDS, Spring Framework의 연계를 위한 설dev.anyframejava.org/ 정 파일과 프로젝트에서 사용빈도가 높은 샘플 화면 8가지를 제공한다.docs/anyframe/plugin/optional/generic/1.0.0/reference/htmlsingle/generic.html][참조] Spring BlezeDS Integration [http://dev.anyframejava.org/docs/anyframe/plugin/optional/flexquery/1.0.0/reference/htmlsingle/flexquery.html#flex_query]optional13 generic [http:// Java5부터 지원하는 Generics 개념을 기반으로 기본 CRUD optionaldev.anyframejava.org/ 메소드 기능이 모두 구현된 클래스를 직접 이용하거나 상속받아서 사용할 수 있는 기능을 제공한다.docs/anyframe/plugin/optional/hibernate/1.0.0/reference/htmlsingle/hibernate.html][참조] Generic [http://dev.anyframejava.org/docs/anyframe/plugin/optional/generic/1.0.0/reference/htmlsingle/generic.html#generic_generic_part]14 hibernate [http:// Hibernate와 <strong>Anyframe</strong>에서 구현한 Dynamic Hibernate optionaldev.anyframejava.org/ Service를 이용한 영화 정보 관리 기능을 제공한다.docs/anyframe/plugin/optional/iam/1.0.0/reference/htmlsingle/iam.html][참조] Hibernate [http://dev.anyframejava.org/docs/anyframe/plugin/optional/hibernate/1.0.0/reference/htmlsingle/hibernate.html#hibernate_hibernate_part],Dynamic Hibernate [http://dev.anyframejava.org/docs/anyframe/plugin/optional/hibernate/1.0.0/reference/htmlsingle/hibernate.html#hibernate_dynamic_part]15 iam [http:// <strong>Anyframe</strong> IAM(Identity & Access Management)을 이용하여 optionaldev.anyframejava.org/ DB 기반의 사용자 인증 및 권한 제어 기능을 제공한다.[참조] <strong>Anyframe</strong> IAM (Spring Securitybased) [http://dev.anyframejava.org/docs/anyframe/plugin/optional/iam/1.0.0/reference/htmlsingle/iam.html#iam_secured_resource_part]16 ibatis2 [http:// iBATIS2를 활용한 영화 정보 관리 기능을 제공한다.dev.anyframejava.org/docs/anyframe/ [참조] iBATIS2optional100


Plugin 목록No Plugin Name Description PluginTypeplugin/optional/ibatis2/0.0.1/reference/htmlsingle/ibatis2.html]17 idgen [http:// <strong>Anyframe</strong> ID Gen 서비스를 사용하여 유일한 ID를 생성하는dev.anyframejava.org/ 기능을 제공한다.docs/anyframe/plugin/optional/idgen/1.0.0/reference/[참조] Id Gen 서비스 [http://dev.anyframejava.org/docs/anyframe/plugin/optional/idgen/1.0.0/reference/htmlsingle/idgen.html#idgen_idgen]htmlsingle/idgen.html]18 jasperreports[http://jasperreports/1.0.0/jasperreports/1.0.0/reference/htmlsingle/reference/jasperreports.html#jasperreports_integration_part]htmlsingle/jasperreports.html]optionalJasperReports와 Spring을 연계하여 영화 정보 등록 현황을 optionalHTML, PDF 형태의 Report로 보여준다.dev.anyframejava.org/docs/anyframe/[참조] JasperReports Integration [http://plugin/optional/dev.anyframejava.org/docs/anyframe/plugin/optional/19 jdbc-support[http://dev.anyframejava.org/ 능을 제공한다.docs/anyframe/plugin/optional/jdbcsupport/1.0.0/reference/htmlsingle/jdbcsupport.html]오픈소스 p6spy 를 확장하여 SQL Injection 보안 위험을 방어할 수 있는 기능 및 최종 실행 쿼리에 대한 로깅(재처리) 기[참조] 기본 구현 및 사용자 확장 구현방안 [http://dev.anyframejava.org/docs/anyframe/plugin/optional/jdbc-support/1.0.0/reference/htmlsingle/jdbcsupport.html#dbcsupport_injectionandlogging_implementation]20 logging-sql [http:// log4jdbc를 이용한 SQL Logging 기능을 제공한다.dev.anyframejava.org/docs/anyframe/[참조] Log4jdbc [http://dev.anyframejava.org/docs/plugin/optional/logging-sql/1.0.0/anyframe/plugin/optional/logging-sql/1.0.0/reference/htmlsingle/logging-sql.html#loggingsql_loggingsql_part]reference/htmlsingle/loggingsql.html]docs/anyframe/plugin/optional/mip-query/1.0.0/reference/htmlsingle/mipquery.html]optionaloptional21 mip-query [http:// TOBESOFT에서 제공하는 X-Internet 솔루션인 MiPlatform을 optionaldev.anyframejava.org/ <strong>Anyframe</strong>과 연계하여 영화 정보 관리 기능 및 실제 시스템 개발 시 활용할 수 있는 다양한 UI Sample을 제공한다.mipsample plugin 기능 확인을 위해 DB에 추가되어야 할 샘플 데이터가 함께 제공된다.[참조] Miplatform Integration [http://dev.anyframejava.org/docs/anyframe/plugin/optional/mip-query/1.0.0/reference/htmlsingle/mipquery.html#mip_query_integration_part]101


Plugin 목록No Plugin Name Description PluginType22 monitoring [http:// 오픈소스 Monitoring Tool인 Infrared를 이용하여 샘플 어플리 optionaldev.anyframejava.org/ 케이션의 성능을 다양한 형태로 측정, 수집함으로써 정성적인 성능 분석을 가능하게 해준다.docs/anyframe/plugin/optional/monitoring/1.0.0/reference/htmlsingle/monitoring.html][참조] Monitoring [http://dev.anyframejava.org/docs/monitoring/1.0.0/reference/html/index.html]23 query [http:// 쿼리문이나 객체의 입력만으로 DB 데이터 조작을 가능하게 optionaldev.anyframejava.org/ 하는 <strong>Anyframe</strong>의 Query 서비스를 활용하여 영화 정보를 관리docs/anyframe/ 하는 기능을 제공한다.plugin/optional/query/1.0.0/reference/htmlsingle/[참조] Query 서비스 [http://dev.anyframejava.org/docs/anyframe/plugin/optional/query/1.0.0/reference/htmlsingle/query.html#query_part]query.html]24 query-ria [http:// 다양한 RIA 플랫폼과 <strong>Anyframe</strong>의 Query 서비스를 연계하는데 optionaldev.anyframejava.org/ 필요한 Query서비스의 확장 라이브러리들을 제공한다.docs/anyframe/plugin/optional/query-ria/1.0.0/reference/htmlsingle/queryria.html]25 remoting [http:// Spring Remoting 기법 중 HttpInvoker를 활용하여 영화 정보 optionaldev.anyframejava.org/ 조회 기능을 제공한다.docs/anyframe/plugin/optional/[참조] Remoting : HTTP Invoker [http://remoting/1.0.0/reference/htmlsingle/dev.anyframejava.org/docs/anyframe/plugin/optional/remoting/1.0.0/reference/htmlsingle/remoting.html#remoting_httpinvoker]remoting.html]26 scheduling [http:// Quartz를 이용하여 주기적으로 월별 영화 등록 현황을 생성 optionaldev.anyframejava.org/ 하는 기능을 제공한다.docs/anyframe/plugin/optional/scheduling/1.0.0/reference/htmlsingle/scheduling.html]docs/anyframe/plugin/optional/simpleweb/1.0.0/reference/htmlsingle/simpleweb.html][참조] Quartz Integration [http://dev.anyframejava.org/docs/anyframe/plugin/optional/scheduling/1.0.0/reference/htmlsingle/scheduling.html#scheduling_quartz_part]27 simpleweb [http:// <strong>Anyframe</strong>에서 제공하는 웹 개발 단순화 방법을 활용하는 데 optionaldev.anyframejava.org/ 필요한 공통 설정파일과 라이브러리들을 제공한다.28 simpleweb-vo[http://[참조] Simplification of web [http://dev.anyframejava.org/docs/anyframe/plugin/optional/simpleweb/1.0.0/reference/htmlsingle/simpleweb.html#simpleweb_part]Web Application을 개발 할때 개발자가 웹 개발을 보다 쉽게 할 수 있도록 웹 개발 단순화 방법을 가이드 하며 공통optional102


Plugin 목록No Plugin Name Description PluginTypedev.anyframejava.org/ Controller 클래스와 Tag Library를 제공한다. Transfer Objectdocs/anyframe/plugin/optional/로 VO(Value Object)를 사용하는 경우에 대해 영화 정보 관리기능을 샘플 코드로 제공한다.simplewebvo/1.0.0/[참조] Simplification of web (vo) [http://reference/htmlsingle/simpleweb-vo.html]dev.anyframejava.org/docs/anyframe/plugin/optional/simpleweb-vo/1.0.0/reference/htmlsingle/simplewebvo.html#simpleweb_vo_introduction_part]29 simpleweb-map[http://Web Application을 개발 할때 개발자가 웹 개발을 보다 쉽게 할 수 있도록 웹 개발 단순화 방법을 가이드 하며 공통dev.anyframejava.org/ Controller 클래스와 Tag Library를 제공한다. Transfer Object로 Map(java.util.Map) 객체를 사용하는 경우에 대해 영화 정보 관리 기능을 샘플 코드로 제공한다.docs/anyframe/plugin/optional/simplewebmap/1.0.0/reference/htmlsingle/simplewebmap.html]30 simpleweb-jquery[http://docs/anyframe/plugin/optional/simplewebjquery/1.0.0/reference/htmlsingle/simplewebjquery.html][참조] Simplification of web (map) [http://dev.anyframejava.org/docs/anyframe/plugin/optional/simpleweb-map/1.0.0/reference/htmlsingle/simplewebmap.html#simpleweb_map_introduction_part]Web Application을 개발 할때 개발자가 웹 개발을 보다 쉽게 할 수 있도록 웹 개발 단순화 방법을 가이드 하며 공dev.anyframejava.org/ 통 Controller 클래스와 Tag Library를 제공한다. JSON 형태의 데이터를 사용하여 영화 정보 관리 기능을 샘플 코드로제공한다. 이와 함께 jQuery 컴포넌트들(jqgrid, quickpager,autocomplete, jstree, ui-tab, dropdown, uploadify)과의 연계방안도 제공한다.[참조] Simplification of web (jquery) [http://dev.anyframejava.org/docs/anyframe/plugin/optional/simpleweb-jquery/1.0.0/reference/htmlsingle/simplewebjquery.html#simpleweb_jquery_introduction_part]optionaloptional31 spring-optional <strong>Anyframe</strong> Plugin을 통해 설치되지 않는 Spring 라이브러리들 optional(spring-aspects, spring-instrument, spring-instrument-tomcat,spring-jms, spring-webmvc-portlet 등)을 제공하고 샘플 코드및 매뉴얼은 따로 제공하지 않는다.32 springrest [http:// Spring 3.0에서 새롭게 선보인 특징 중 하나로써 SpringMVC optionaldev.anyframejava.org/ 기반의 웹어플리케이션에 대해 REST 스타일을 적용하여 영docs/anyframe/ 화 정보 관리 기능을 제공한다.plugin/optional/springrest/1.0.0/ [참조] Spring REST Supports [http://dev.anyframejava.org/reference/ docs/anyframe/plugin/optional/springrest/1.0.0/htmlsingle/reference/htmlsingle/springrest.html] springrest.html#springrest_restsupport_part]33 struts [http:// Struts를 이용하여 영화 정보 관리 기능을 제공한다. optionaldev.anyframejava.org/docs/anyframe/plugin/optional/[참조] Struts [http://dev.anyframejava.org/docs/anyframe/plugin/optional/struts/1.0.0/reference/htmlsingle/struts/1.0.0/ struts.html#struts_overview_part] , Struts Extensionsreference/[http://dev.anyframejava.org/docs/anyframe/plugin/optional/struts/1.0.0/reference/htmlsingle/struts.html#struts_extensions_overview_part]103


Plugin 목록No Plugin Name Description PluginTypehtmlsingle/struts.html]34 test 테스트 코드 실행에 필요한 참조 라이브러리만을 제공한다. optional35 tiles [http:// Tiles(Apache Tiles 2.2.1) 기반의 화면 레이아웃 정의 방법을 optionaldev.anyframejava.org/ 가이드한다.docs/anyframe/plugin/optional/tiles/1.0.0/reference/[참조] Tiles [http://dev.anyframejava.org/docs/anyframe/plugin/optional/tiles/1.0.0/reference/htmlsingle/tiles.html]htmlsingle/tiles.html#tiles_apachetiles]36 util-demo [http:// <strong>Anyframe</strong> Core 서비스에 포함되어 있는 Date, Digest, optionaldev.anyframejava.org/ Number, String, Validation 유틸리티 활용을 위한 데모 화면을 제공한다.docs/anyframe/plugin/optional/util-demo/1.0.0/reference/htmlsingle/utildemo.html][참조] <strong>Anyframe</strong> Core 서비스 내의Date [http://dev.anyframejava.org/docs/anyframe/plugin/optional/util-demo/1.0.0/reference/htmlsingle/utildemo.html#utildemo_dateutil], Digest [http://dev.anyframejava.org/docs/anyframe/plugin/optional/utildemo/1.0.0/reference/htmlsingle/utildemo.html#utildemo_digestutil], Number [http://dev.anyframejava.org/docs/anyframe/plugin/optional/utildemo/1.0.0/reference/htmlsingle/utildemo.html#utildemo_numberutil], String [http://dev.anyframejava.org/docs/anyframe/plugin/optional/utildemo/1.0.0/reference/htmlsingle/utildemo.html#utildemo_stringutil], Validation [http://dev.anyframejava.org/docs/anyframe/plugin/optional/utildemo/1.0.0/reference/htmlsingle/utildemo.html#utildemo_validationutil]유틸리티37 util-system [http:// 공통적으로 활용 가능한 유틸리티성 시스템 편의 기능인 optionaldev.anyframejava.org/ <strong>Anyframe</strong> Util-System 서비스를 제공한다.docs/anyframe/plugin/optional/util-system/1.0.0/reference/htmlsingle/utilsystem.html][참조] Sigar를 활용한 SystemInfo [http://dev.anyframejava.org/docs/anyframe/plugin/optional/utilsystem/1.0.0/reference/htmlsingle/utilsystem.html#utilsystem_util_system],Network [http://dev.anyframejava.org/docs/anyframe/plugin/optional/utilsystem/1.0.0/reference/htmlsingle/utilsystem.html#utilsystem_util_network],FileSystem [http://dev.anyframejava.org/docs/anyframe/plugin/optional/utilsystem/1.0.0/reference/htmlsingle/utilsystem.html#utilsystem_util_filesystem],FileMonitor[http://dev.anyframejava.org/docs/anyframe/plugin/optional/util-system/1.0.0/reference/htmlsingle/utilsystem.html#utilsystem_util_filemonitor]유틸리티 및 압축/해제 [http://dev.anyframejava.org/docs/anyframe/plugin/optional/util-system/1.0.0/reference/htmlsingle/utilsystem.html#utilsystem_util_zip]유틸리티104


Plugin 목록No Plugin Name Description PluginType38 util-system-demo[http://시스템 리소스를 확인할 수 있는 <strong>Anyframe</strong> Util-System 서비스의 활용 데모를 DashBoard UI(jQuery UI, FusionChart Freedev.anyframejava.org/ 활용) 형태로 제공한다.docs/anyframe/plugin/optional/util-systemdemo/1.0.0/reference/htmlsingle/utilsystem-demo.html][참조] Sigar를 활용한 시스템 [http://dev.anyframejava.org/docs/anyframe/plugin/optional/util-system/1.0.0/reference/htmlsingle/utilsystem.html#utilsystem_utilsystem_part]유틸리티,jQuery[http://dev.anyframejava.org/docs/anyframe/plugin/optional/simpleweb-jquery/1.0.0/reference/htmlsingle/simpleweb-jquery.html#simpleweb_jquery_jquery_part] ,FusionChart Free [http://dev.anyframejava.org/docs/anyframe/plugin/optional/chart/1.0.0/reference/htmlsingle/chart.html#chart_chart_part]optional39 webflow [http:// Spring Webflow를 이용하여 영화 정보 관리 기능을 제공한다. optionaldev.anyframejava.org/docs/anyframe/plugin/optional/webflow/1.0.0/[참조] Spring Webflow [http://dev.anyframejava.org/docs/anyframe/plugin/optional/webflow/1.0.0/reference/htmlsingle/webflow.html#webflow_overview_part]reference/htmlsingle/webflow.html]105


13.Plugin 구조<strong>Anyframe</strong> archetype 설치 후 anyframe-maven-plugin을 이용하여 Core, Hibernate, CXF, Monitoring 등과같은 Plugin들을 설치/삭제할 수 있도록 하기 위하여 Plugin들은 Maven Archetype과 유사한 모습을 가지면서 실제 폴더 구조 및 파일은 다른 형태로 구성되어 있다.다음은 배포되는 Core Plugin의 주요 구성 요소를 표현한 그림이다.META-INF 폴더에는 plugin에 대한 정보를 담고 있는 plugin.xml 파일이 있고, plugin-resources 폴더에는pom.xml 파일과 리소스 템플릿 파일들이 위치하고 있다.pom.xml 파일 내에는 해당 Plugin 설치로 인해 추가될 기능 실행에 필요한 참조 라이브러리가 정의되어 있다.또한 plugin.xml 파일은 정의된 리소스 템플릿을 이용하여 샘플 프로젝트를 생성할 때 추가되어야 하는 리소스에 대한 Meta 정보를 관리한다. plugin-resources 하위 폴더 내에 정의된 리소스를 샘플 프로젝트에 추가할 때 대표 패키지를 부여할 것인지, Velocity를 이용하여 리소스 템플릿과 사용자의 입력값이 Merge된 리소스를 추가할 것인지 여부를 정의하는데 사용된다. 다음은 Core Plugin의 plugin.xml파일에 대한 예이다.org.anyframe.pluginanyframe-core-pix.x.x중략...truetrue위 파일을 살펴보면 내에서는 특정 디렉토리에 속한 파일 그룹에 대해 filtered, packaged속성값을 정의하고 있음을 알 수 있다. 만일 리소스 파일 중의 하나인 MovieService.java가 다음과 같이 구성되어 있다라고 가정해 보자.106


Plugin 구조package ${package}.core.moviefinder.service;import ${package}.core.domain.Movie;public interface MovieService {Movie get(String movieId) throws Exception;void create(Movie movie) throws Exception;void update(Movie movie) throws Exception;void remove(String movieId) throws Exception;}filtered 속성값이 true인 경우, ${package}로 정의된 부분이 Velocity Engine에 의해 해석되어 package의값이 'anyframe' 이라면 'package anyframe.core.moviefinder.service;'로 재조합되어 샘플 프로젝트 내에 MovieService.java 파일이 추가될 것이다. filtered 속성값이 false인 경우, 정의된 모든 부분에 대한변경없이 샘플 프로젝트 내에 MovieService.java 파일이 추가될 것이다.다음으로 packaged 속성에 대해 알아보도록 하자. plugin-resources/src/main/java 하위에 core/moviefinder/service/MovieService.java라는 리소스가 정의되어 있다라고 가정해 보자. packaged 속성값이 true인 경우 package의 값이 'anyframe'이라면 샘플 프로젝트 내 src/main/java/anyframe/core/moviefinder/service 하위에 해당 리소스가 추가될 것이다. 즉, packaged 속성값에 따라 패키지 구조를반영하여 리소스를 생성할 위치가 정해지는 것이다.다음은 plugin-resources 하위 폴더에 대한 설명이다.Folderdb/resourcesDescription해당 Plugin이 DB 유형에 따라 변경되어야 하는 리소스를 포함하고 있는 경우에 활용한다. 예를 들어, QueryService의 경우 DB의 종류에 따라 사용할 PagingSQLGenerator구현체가 달라지므로 Query Plugin을 설치할 때 DB 종류에 따라 QueryService 속성 정의가 달라져야 한다. 이를 위해 db/resources 폴더 하위에 DB 명을 폴더명으로 두고그 폴더 하위에 해당 리소스의 위치를 그대로 정의하고 변경되어야 하는 파일을 정의해둘 수 있다. Core Plugin의 경우 DB 유형에 따라 변경되어야 하는 파일이 없으므로 resources 폴더를 관리하고 있지 않다.DB 리소스 정의시 참고<strong>Anyframe</strong>에서는 개발 환경 구성 작업 중에 처음 설정한 DB와 다른 DB를 사용해야 하는 경우를 위해 DB 관련 정보를 변경할 수 있는 기능을제공하고 있다. DB 관련 정보 변경 작업시, 개발자가 그동안 수행한 작업 정보를 최대한 유지하면서 관련된 리소스들 내의 DB 관련 정보만을 변경할 수 있도록 하기 위해서 DB 리소스 정의시 다음과 같이 규약을 따르고 있다....107


Plugin 구조FolderDescription


Plugin 구조FolderDescriptionstruts*.action위의 내용은 Struts Plugin 설치로 추가되는 WebApplication 속성 정보로써 Struts의 경우 SpringMVC와 달리 DefaultActionServlet을 통해 사용자의 요청 처리가 이루어져야 하므로 이를 위한 servlet 정의 및 servlet-mapping 정보가 정의되어 있음을 알 수 있다. Struts Plugin 설치 이후 샘플 프로젝트의 src/main/webapp/WEB-INF/web.xml 파일 내에 위에 정의된 내용이 통합되어 Struts 기반에서도 샘플 어플리케이션이 동작 가능하게 된다.• Plugin 설치 이후, 샘플 어플리케이션에 해당 Plugin과 관련된 메뉴가 추가되어야하는 경우 src/main/webapp/anyframe.jsp 파일 내에 다음과 같이 메뉴명과 접근URL을 정의한다.-Query 1.0.0위의 내용은 Query Plugin 설치로 추가되는 메뉴 정보로써 Query Plugin이 설치되면Query 1.0.0이라는 이름의 메뉴가 추가될 것이고, 이 메뉴를 클릭하였을 때 http://${ctx}/queryMovieFinder.do?method=list라는 요청이 처리될 것이다.src/test/javasrc/test/resources테스트 코드를 관리한다. 테스트 코드의 패키지는 Plugin 이름으로 시작하도록 정의해야 한다.테스트 코드 실행에 필요한 리소스들을 관리한다. src/main/resources와 동일한 규칙을 따라 리소스를 정의한다.109


14.신규 Plugin 개발앞서 설명했던 <strong>Anyframe</strong> Plugin 구조에 맞춰서 Plugin 개발자가 수동으로 개발하는 것은 쉬운 일이 아니다. <strong>Anyframe</strong> Plugin 개발 방법을 지원하기 위한 Maven 명령어를 제공하고 있으므로 이를 이용하여개발하는 방법에 대해서 살펴보도록 하자.14.1.신규 Plugin 프로젝트 생성개발하고자 하는 신규 Plugin을 위한 프로젝트를 <strong>Anyframe</strong> IDE에 제공하는 Maven 명령어를 이용하여생성하도록 한다.mvn archetype:generate-DarchetypeCatalog="http://dev.anyframejava.org/maven/repo/archetype-catalog.xml"신규 <strong>Anyframe</strong> Plugin을 만들어내기 위한 샘플 프로젝트를 생성해내는데 이때 샘플 프로젝트가 웹 타입 프로젝트인 경우 archetype으로 anyframe basic archetype를 선택하고 서비스 타입 프로젝트인 경우 anyframe service archetype를 선택하도록 한다. 신규 <strong>Anyframe</strong> Plugin에 해당하는 groupId, artifactId,version, package 정보를 입력한다.예를 들어, anyframe-query-pi라는 이름으로 신규 <strong>Anyframe</strong> Plugin 프로젝트를 생성해낸다면 다음과 같이 값을 입력할 수 있다. version의 경우 디폴트 값이 1.0-SNAPSHOT으로 주어지고, package의 경우 디폴트 값이 groupId와 동일한 값으로 주어진다.Define value for property 'groupId': : org.anyframe.pluginDefine value for property 'artifactId': : anyframe-query-piDefine value for property 'version': 1.0-SNAPSHOT: x.x.xDefine value for property 'package': org.anyframe.plugin:14.2.샘플 DB 구동앞서 생성한 프로젝트에서 db/hsqldb 폴더 하위의 start.cmd (or start.sh) 파일을 실행시켜서 기본 샘플DB인 HSQL DB를 구동시키도록 한다. 기본 샘플 DB 기반으로 신규 <strong>Anyframe</strong> Plugin을 구현한 후 추가적으로 지원되는 DB 별로 Plugin 샘플 코드 구현을 진행해나가도록 한다. DB 별 Plugin 샘플 코드 작성방법은 하단의 신규 Plugin 샘플 코드 추가 내용을 참고하도록 한다. 만약 신규 Plugin이 샘플 코드 없이라이브러리만 제공하도록 구성한다면 샘플 DB 구동 작업은 불필요하다.14.3.참조 Plugin 설치신규 Plugin이 참조해야 하는 기존 Plugin들이 있다면 install 명령어를 이용하여 설치하도록 한다. 만약 참조할 Plugin이 없다면, 디폴트로 <strong>Anyframe</strong> Core Plugin을 설치하도록 한다. 참조 Plugin을 설치하게 되면, 참조 Plugin이 제공하는 라이브러리와 샘플 코드를 기반으로 하여 신규 Plugin의 샘플 코드를추가 구현할 수 있다.mvn anyframe:install -Dname=core14.4.신규 Plugin 라이브러리 추가신규 Plugin에서 필요로 하는 라이브러리를 앞서 생성한 Plugin 프로젝트 루트 폴더 하위의 pom.xml파일에 추가하도록 한다. 태그 내에 작성하는데, START/END 주석을 이용하여 신규Plugin 라이브러리임을 표시해주도록 한다.110


신규 Plugin 개발org.anyframeanyframe-query1.0.0org.apache.velocityvelocity-dep1.6.2avalonavalon-framework4.0중략...참고- Eclipse Project로 import하여 신규 Plugin 개발 작업을 계속 진행해나가도록 한다.- Plugin 프로젝트 루트 폴더 하위의 pom.xml 파일에서 properties 태그 내 inspection.dir항목 내용을 아래와 같이 변경하도록 한다. Plugin 개발자 로컬 환경의 사용자 홈 폴더가작성되어 있으므로 이를 ${user.home}으로 변경하도록 한다.${user.home}/.anyframe/inspection중략...14.5.신규 Plugin 샘플 코드 추가신규 Plugin을 통해 설치되는 라이브러리와 함께 샘플 코드로 제공하려고 하는 리소스(Java, XML, ... 등)를 <strong>Anyframe</strong> Plugin의 폴더/파일 명명 규칙에 맞추어 작성하도록 한다. (Plugin 구조 참고)Plugin 프로젝트 하위에 존재하는 폴더 별로 구분하여 샘플 코드 추가 작성하는 방법에 대해서 살펴보도록 하자. 여기에 나열된 폴더 이외에 Plugin 개발자가 다른 폴더를 추가해넣을 수도 있다. (추후 Plugin빌드 파일 생성 후 Plugin Resource로 새로 생성된 폴더를 인식할 수 있도록 설정해주면 된다.)i. src/main/java대표 패키지 하위에 반드시 Plugin 명이 존재하고 그 하위로 자유롭게 패키지를 구성하여 샘플 자바코드를 작성할 수 있다. 예를 들어 Plugin 내 도메인 클래스들의 경우 domain 패키지명 하위로, 서비스 인터페이스 클래스는 service 패키지명 하위로, 서비스 구현 클래스 및 DAO 클래스는 service.impl패키지명 하위로, 프리젠테이션 레이어 개발 관련 클래스는 web 패키지명 하위로, 위치시킬 수 있다.ii. src/main/resourcesSpring, SpringMVC 기반의 어플리케이션 실행을 위한 속성 정의 파일과 메시지 파일, 쿼리문을 정의하고 있는 매핑 XML 파일들을 추가할 수 있다. Spring 속성 정의 파일은 spring 폴더 하위에 위치시키고 context-{plugin name}-xxx.xml으로 작성한다. SpringMVC 속성 정의 파일명은 {plugin name}-servlet.xml으로 정의해야 한다. 이 외, 리소스 파일이 필요한 경우에는 Plugin명과 동일한 이름의 폴더를 생성하여 관리하도록 한다.해당 Plugin이 DB 유형에 따라 변경되어야 하는 리소스를 포함하고 있는 경우에 파일 내에 , 주석 태그를 이용하여 표시하도록 한다. 아래 예시와 같이 Query Plugin의 src/main/resoures/spring/context-query.xml 파일 내에 DB 유형 별 변경되는 설정 정보 별로 START/END 태그를 이용하여 표시해둘 수 있다.111


신규 Plugin 개발중략...XML 파일 중 dynamic sql 작성 시 Velocity-Support 구문을 이용할 수 있는데 이는 아래 예시와 같이XML 파일 내 Velocity 구문을 그대로 유지해야 하는 경우 해당 부분 앞뒤로 주석 태그를 설정하여 표시해두도록 한다. , SELECT movie.movie_id, movie.title, ...FROM JQUERY_MOVIE movie, JQUERY_GENRE genre#if($vo.sidx &amp;&amp; !$vo.sidx.equals(""))ORDER BY#if($vo.sidx == "genre.name")genre.name#elseif($vo.sidx == "title")movie.title#end#end중략...iii. src/test/java대표 패키지 하위에 반드시 Plugin 명이 존재하고 그 하위로 자유롭게 패키지를 구성하여 Plugin 샘플 코드에 대한 테스트 케이스 자바 코드를 작성할 수 있다.iv. src/test/resources테스트 케이스 수행 시 필요한 리소스 파일이 존재하는 경우 이 폴더에 추가하는데 이때에는 src/main/resources 폴더에 파일 추가하는 규칙과 동일함으로 유의하도록 한다.v. src/main/webappPlugin 샘플 코드를 위한 JSP 파일은 WEB-INF/jsp 하위에 Plugin 명과 동일한 이름의 폴더를 생성하여 관리하도록 한다. css, image 등 기타 파일들을 Plugin 샘플 코드를 위해서 배포해야 하는 경우에도 Plugin 명과 동일한 이름의 폴더를 webapp 폴더 하위에 추가로 생성하여 관리한다.Plugin 설치 시 Plugin 목록 화면에 메뉴 항목을 추가하기 위해서 anyframe.jsp 파일 내 메뉴 상단하단에 아래와 같이 , 태그를 설정하도112


신규 Plugin 개발록 한다. web.xml 파일에도 마찬가지로 Plugin 설치 시 추가되어야 하는 내용이 있으면 START/END태그를 이용하여 설정한다.- Query 1.0.0vi. db/scripts해당 Plugin 실행을 위해 별도로 DB 데이터가 추가되어야 하는 경우에는 db/scripts 폴더 하위에{plugin name}-insert-data-{db.name}.sql, {plugin name}-delete-data-{db.name}.sql 파일을 정의하고 필요한 DDL, DML을 정의해 두면 해당 Plugin 설치/삭제시에 anyframe-maven-plugin에 의해 실행될 것이다.vii.db/resources해당 Plugin이 DB 유형에 따라 변경되어야 하는 리소스를 포함하고 있는 경우에 활용한다. 예를 들어, QueryService의 경우 DB의 종류에 따라 사용할 PagingSQLGenerator 구현체가 달라지므로 QueryPlugin을 설치할 때 DB 종류에 따라 QueryService 속성 정의가 달라져야 한다. 이를 위해 db/resources폴더 하위에 DB 명을 폴더명으로 두고 그 폴더 하위에 해당 리소스의 위치를 그대로 정의하고 변경되어야 하는 파일을 정의해둘 수 있다. 상세한 내용은 Plugin 구조 내용 중 db/resources를 참고하도록 한다. (ex. db/resources/oracle/src/main/resources/spring/context-query.xml)Plugin 샘플 코드를 추가 구현한 뒤 CLI 혹은 Eclipse 상에서 정상 동작하는지 테스트해보도록 한다. 웹타입 프로젝트의 경우 jetty:run 명령어를 이용하여 테스트할 수 있고, 서비스 타입 프로젝트의 경우 test명령어를 이용하여 테스트해볼 수 있다.mvn clean jetty:runmvn clean test14.6.신규 Plugin Interceptor 추가해당 Plugin 설치/삭제시 anyframe-maven-plugin을 통해 수행되는 기본 작업 외에 별도로 처리해야 하는 작업이 필요한 경우에는 Interceptor 클래스 구현을 통해 처리할 수 있다. Interceptor 클래스는 Plugin프로젝트 하위의 src/main/java 하위에 위치시키고 다음과 같이 구현할 수 있다.public class CustomPluginInterceptor {// 설치 전 별도 작업이 필요한 경우public void preInstall(String baseDir, File pluginJarFile) throws Exception {System.out.println("#### call preInstall ####");}// 설치 후 별도 작업이 필요한 경우public void postInstall(String baseDir, File pluginJarFile)throws Exception {System.out.println("#### call postInstall ####");}// 삭제 전 별도 작업이 필요한 경우public void preUninstall(String baseDir, File pluginJarFile)throws Exception {System.out.println("#### call preUninstall ####");}// 삭제 후 별도 작업이 필요한 경우public void postUninstall(String baseDir, File pluginJarFile)throws Exception {System.out.println("#### call postUninstall ####");113


신규 Plugin 개발}}다음은 Query Plugin의 Interceptor 클래스의 일부로써 Query Plugin이 삭제된 이후 해당 프로젝트의META-INF/project.mf 파일 내의 "project.daoframework" 속성의 값을 "springjdbc"로 변경시키는 로직을포함하고 있음을 알 수 있다. (Interceptor 클래스 구현/실행을 위해 필요한 라이브러리는 Plugin 프로젝트 내의 pom.xml 파일과 Plugin 빌드 파일(plugin-build.xml)의 interceptor dependencies 태그 내에 함께 정의해주도록 함에 유의하도록 한다.)public class QueryPluginInterceptor {public void postUninstall(String baseDir, File pluginJarFile)throws Exception {File metadataFile = new File(new File(baseDir)+ CommonConstants.METAINF, CommonConstants.METADATA_FILE);PropertiesIO pio = new PropertiesIO(metadataFile.getAbsolutePath());if(pio.readValue(CommonConstants.APP_DAOFRAMEWORK_TYPE).equals(CommonConstants.DAO_QUERY)) {pio.setProperty(CommonConstants.APP_DAOFRAMEWORK_TYPE,CommonConstants.DAO_SPRINGJDBC);pio.write();}중략...14.7.Plugin 빌드 파일 자동 생성 및 수정신규 Plugin 프로젝트 루트 폴더 하위에 Plugin 빌드 파일을 생성하는데 이때 activate-plugin 명령어를이용하여 디폴트 설정 값을 가진 빌드 파일을 생성해내도록 한다.mvn anyframe:activate-plugin프로젝트 루트 폴더 하위에 생성된 plugin-build.xml 파일을 열어서 신규 Plugin 내용에 맞게 변경해야 하는 항목들을 수정하도록 한다. Plugin 빌드 파일을 이용하여 Plugin 패키징을 수행하게 되므로, Plugin에대한 상세 정보를 작성하도록 한다. 다음은 각 태그 별 작성해야 하는 설정 정보들이다.Tag NameAttrubuteNameDescription Required ChildTagplugin name Plugin 명을 작성한다. 최초 빌드 파일 생성 시에 pom.xml 파일 내 name 태그 값으로 작성된 명이 설정된다.groupIdartifactIdversiondescriptionPlugin 설명 정보이다. 최초 빌드 파일 생성 시에 pom.xml 파일 내 description 태그 값으로 작성된 설명이 설정된다. (만약 값이 존재하지 않으면 Plugin 명 + "plugin"으로 설정됨)Plugin의 groupId (of Maven) 정보이다.최초 빌드 파일 생성 시에 pom.xml 파일내 groupId 태그 값으로 작성된 값이 설정된다.Plugin의 artifactId (of Maven) 정보이다.최초 빌드 파일 생성 시에 pom.xml 파일내 artifactId 태그 값으로 작성된 값이 설정된다.Plugin의 version (of Maven) 정보이다. 최초 빌드 파일 생성 시에 pom.xml 파일 내YYYYYgroupId,artifactId,version,deplugins,build,resources,inter114


신규 Plugin 개발Tag Namedependent-pluginsAttrubuteNameDescription Required ChildTagversion 태그 값으로 작성된 값이 설정된다.Plugin이 참조하는 타 Plugin들에 대한 정보를 설정한다.dependent-plugin name 참조 Plugin 명을 설정한다. 최초 빌드 파일 생성 시에 META-INF/plugininstalled.xml파일에 추가된 Plugin 명이설정된다.buildfilesetsversion참조 Plugin의 호환되는 버전 범위(= 등 사용 가능)를 표시한다. 최초 빌드 파일 생성 시에 META-INF/plugininstalled.xml파일에 추가된 Plugin 버전정보가 설정된다.Plugin 패키징 수행 시 필요한 정보를 작성한다.Plugin 패키징 대상이 되는 Plugin 프로젝트 하위 폴더 목록 정보이다.fileset dir Plugin 프로젝트 하위 폴더 명으로Plugin 패키징 시 포함시킬 폴더 경로를 작성한다. 최초 빌드 파일 생성 시에 다음과 같은 5가지 폴더에 대해서dir 정보가 설정된다. 그리고 filtered,packaged, include 항목에 대한 기본값이 제공된다. (src/main/java, src/main/resources, src/test/java, src/test/resources, src/main/webapp)filteredPlugin 샘플 소스 코드 내용 중 추후Plugin 설치 시 Velocity Engine에 의해 해석되어 변경되어야 하는 부분 존재 여부를 표시한다. filtered 속성값이 true인경우 Plugin 패키징 시 Plugin 샘플 코드내용 중 대표 패키지 명에 해당되는 부분이 ${package}로, 프로젝트 명에 해당되는 부분이 ${artifactId} 등으로 변경되어 Plugin 패키징에 포함될 것이다. 반면filtered 속성값이 false인 경우, 정의된모든 부분에 대한 변경없이 Plugin 패키징에 포함될 것이다.packaged Plugin 샘플 소스 코드 내용 중 추후Plugin 설치 시 자바 코드의 패키지 정보가 존재하는 경우 패키지 폴더를 만들어지도록 해야 하는 부분 존재 여부를 표시한다. packaged 속성값이 true인 경우Plugin 패키징 시 Plugin 샘플 자바 코드에서 대표 패키지 명에 해당하는 폴더가Plugin 패키징에 포함되지 않을 것이다.반면 packaged 속성값이 false인 경우,폴더 구성 변경없이 Plugin 패키징에 포함될 것이다.YYYNNYYYdependentpluginfilesetsfilesetinclude,exclude115


신규 Plugin 개발Tag NameAttrubuteNameDescription Required ChildTaginclude name dir 폴더 내 파일들 중에서 포함시키고자 하는 파일 명을 작성한다. Ant-styleregular expressions인 *, **/와 같은 기호를 이용하여 작성할 수 있다. (ex. **/*.java, **/*.*)exclude name dir 폴더 내 파일들 중에서 포함시키지 않을 파일 명을 작성한다. Ant-style regularexpressions인 *, **/와 같은 기호를 이용하여 작성할 수 있다. (ex. **/*.xml,**/*.jsp, **/query/**/*.*)resourcesPlugin 설치 수행 시 필요한 정보를 작성한다. Plugin 설치 대상이 되는 Plugin 프로젝트 하위 폴더 목록 정보이다.resource dir Plugin 프로젝트 하위 폴더 명으로 Plugin설치 시 포함시킬 폴더 경로를 작성한다.최초 빌드 파일 생성 시에 다음과 같은 5가지 폴더에 대해서 dir 정보가 설정된다.그리고 filtered, packaged, include 항목에 대한 기본 값이 제공된다. (src/main/java, src/main/resources, src/test/java, src/test/resources, src/main/webapp/WEB-INF/jsp)interceptorclassfilteredPlugin 샘플 소스 코드 내용 중 추후Plugin 설치 시 Velocity Engine에 의해 해석되어 변경되어야 하는 부분 존재 여부를 표시한다. filtered 속성값이 true인 경우 Plugin 설치 시 Plugin 샘플 코드 내용 중 ${package}가 대표 패키지 명으로,${artifactId}가 프로젝트 명 등으로 변경되어 Plugin 설치가 진행될 것이다. 반면filtered 속성값이 false인 경우, 정의된모든 부분에 대한 변경없이 Plugin 설치가 진행될 것이다.packaged Plugin 샘플 소스 코드 내용 중 추후Plugin 설치 시 자바 코드의 패키지 정보가 존재하는 경우 패키지 폴더를 만들어지도록 해야 하는 부분 존재 여부를 표시한다. packaged 속성값이 true인 경우Plugin 설치 시 대표 패키지 명에 해당하는 폴더 생성될 것이다. 반면 packaged속성값이 false인 경우, 폴더 구성 변경없이 Plugin 설치가 진행될 것이다.해당 Plugin 설치/삭제시 별도로 처리해야 하는 작업이 필요한 경우에는Interceptor 클래스를 구현한 후 설정해주도록 한다.Plugin Interceptor 클래스 명을 전체 패키지 명과 함께 설정한다. Plugin 패키징시 Interceptor 클래스와 동일한 패키지YYNYYYNYresourceinclude,excludeclass,dependencies116


신규 Plugin 개발Tag NamedependenciesdependencyessentialsamplescheckedAttrubuteNameDescription Required ChildTag명 하위에 존재하는 클래스와 리소스 파일들이 함께 패키징에 포함된다.Plugin Interceptor 클래스 컴파일 및 런타임 시 필요로 하는 참조 라이브러리들을 정의한다.Plugin Interceptor에서 필요로 하는 참조 라이브러리들을 Maven pom.xml 파일에 정의하는 dependency 태그 형태와 동일하게 정의한다. 즉 groupId,artifactId, version을 작성한다. 여기서Plugin 샘플 코드들은 필요로 하지 않고, Interceptor 클래스에서만 사용되는참조 라이브러리의 경우 scope을 반드시 interceptor로 지정하여 설정하도록한다.(ex. interceptor)Plugin이 필수 설치 Plugin에 해당하는지여부를 표시한다. essential Plugin으로생성하기 위해서는 값을 true로 설정한다. 최초 빌드 파일 생성 시 false로 설정된다.Plugin이 샘플 소스 코드를 가지고 있는지 여부를 표시한다. 최초 빌드 파일 생성 시 true로 설정된다.<strong>Anyframe</strong> IDE를 통해 제공되는 툴 중Eclipse Plugin에서 사용하는 설정으로최초 빌드 파일 생성 시에 자동 생성되는값을 그대로 사용해도 무방하다. Plugin개발자가 수정할 필요가 없는 항목이다.NNYYNdependency다음은 Query Plugin을 위한 plugin-build.xml 파일 내용 중 일부이다.org.anyframe.pluginanyframe-query-pix.x.x117


신규 Plugin 개발trueorg.anyframe.plugin.interceptor.QueryPluginInterceptororg.anyframeanyframe-ide-command-common2.0.0interceptorcommons-loggingcommons-logging1.1.1falsefalse14.8.Plugin 패키징 수행수정된 Plugin 빌드 파일을 기반으로 Plugin 패키징 작업을 수행할 수 있다. package-plugin 명령어를 사용하여 패키징 작업을 진행하도록 한다.mvn anyframe:package-pluginPlugin 패키징이 완료되면 target 폴더 하위에 JAR 파일 형태로 Plugin 파일(파일 명은 {artifactId}-{version}.jar)이 생성되게 된다. 이 JAR 파일 내 구성은 /target/temp 폴더 하위의 파일들을 통해 확인해보도록 한다. 생성된 폴더 구조 및 파일 내용은 Plugin 구조를 참고하여 확인하도록 한다. 폴더나 파118


신규 Plugin 개발일이 정상적으로 패키징 되지 않았다면 Plugin 빌드 파일(plugin-build.xml) 설정 내용을 확인하여 수정한 후, 패키징을 재수행시켜보도록 한다.14.9.Plugin 로컬 환경 배포 및 확인패키징이 완료된 Plugin 파일을 개발자 로컬 환경에 배포한 후 테스트해보도록 하자. Plugin 빌드 파일(plugin-build.xml) 내 essential 설정 정보를 true로 한 경우에는 Plugin 개발자의 [사용자 계정 홈 디렉토리]/.anyframe 폴더 하위에 있는 plugin-catalog-essential.xml 파일에 Plugin 정보가 추가 등록되고, false로 한 경우에는 plugin-catalog-optional.xml 파일에 Plugin 정보가 등록될 것이다.mvn anyframe:install-pluginfile예를 들어 Query Plugin의 경우, 다음과 같이 Plugin 개발자의 [사용자 계정 홈 디렉토리]/.anyframe 폴더 하위에 있는 plugin-catalog-optional.xml 파일에 Plugin 정보가 작성되어 있는 것을 확인해볼 수 있다.org.anyframe.pluginanyframe-query-pix.x.x:중략...Command 창에서 list 명령어를 실행시켜 신규 Plugin이 설치 가능한 Plugin 목록에 추가되었는지 확인해 보도록 하자. 정상적으로 추가된 경우에는 <strong>Anyframe</strong>에서 제공하는 다른 Plugin과 동일하게 설치/삭제가 가능해진다.mvn anyframe:list14.10.Plugin 배포 및 확인신규 Plugin을 다른 사람들과 공유하기 위해서 deploy-pluginfile 명령어를 실행시켜서 원격 Repository에배포하도록 한다. <strong>Anyframe</strong>에서 사용하는 원격 Repository(http://dev.anyframejava.org/maven/repo)에배포하는 경우가 아니라면 원하는 원격 Repository에 대한 repositoryId와 url 정보를 명령어 실행 시 파라미터로 입력해주어야 한다.mvn anyframe:deploy-pluginfile -DrepositoryId=anyframe-repository -Durl=http://dev.anyframejava.org/maven/repo로컬 Repository에 배포되어 있는 Plugin 파일을 지우고 update-catalog 명령어를 실행시켜서 원격Repository로부터 배포된 Plugin catalog 파일을 내려받도록 한다. list 명령어를 실행시켜서 신규 Plugin이 설치 가능한 Plugin 목록에 추가되었는지 확인해 보도록 하자. 정상적으로 추가된 경우에는 <strong>Anyframe</strong>에서 제공하는 다른 Plugin과 동일하게 설치/삭제가 가능하므로 테스트해보도록 한다.mvn anyframe:update-catalogmvn anyframe:list119


신규 Plugin 개발참고신규 Plugin을 Maven Remote Repository에 배포 시 사용자 인증이 필요한 경우,settings.xml 파일 내의 Server 정보에 해당 Repository 접근 사용자 정보가 추가되어 있어야 한다.remote-repositorysamplenamesamplepassword중략...14.11.간단한 신규 Board Plugin 개발 샘플Board에 대한 CRUD 샘플 코드를 제공하는 Board Plugin을 간단하게 개발해보도록 한다. Plugin 개발에대한 상세한 내용은 위 내용들을 참고하도록 한다.1. Board Plugin 프로젝트 생성mvn archetype:generate-DarchetypeCatalog="http://dev.anyframejava.org/maven/repo/archetype-catalog.xml"Board Plugin을 만들어내기 위한 프로젝트를 생성해내는데 이때 웹 타입 프로젝트로 만들 것이기 때문에 archetype으로 anyframe basic archetype를 선택한다. Board Plugin에 해당하는 groupId, artifactId,version, package 정보를 입력한다.board라는 이름으로 신규 <strong>Anyframe</strong> Plugin 프로젝트를 생성해낸다면 다음과 같이 값을 입력할 수 있다. version의 경우 디폴트 값이 1.0-SNAPSHOT으로 주어지고, package의 경우 디폴트 값이 groupId와 동일한 값으로 주어진다.Define value for property 'groupId': : sample.pluginDefine value for property 'artifactId': : boardDefine value for property 'version': 1.0-SNAPSHOT:Define value for property 'package': sample.plugin:2. HSQL DB 구동board 프로젝트에서 db/hsqldb 폴더 하위의 start.cmd (or start.sh) 파일을 실행시켜서 기본 샘플 DB인 HSQL DB를 구동시키도록 한다.3. Simpleweb-jQuery, Test Plugin 설치board 프로젝트로 폴더 이동 후, Board Plugin이 참조해야 하는 Plugin들을 install 명령어를 이용하여 설치하도록 한다. 설치할 Plugin 목록이 나오고 Is this OK? (y,n) 질문이 나오는 경우 y를 입력하도록 한다.mvn anyframe:install -Dname=simpleweb-jquery,test4. Board Plugin 샘플 코드 추가Board Plugin을 통해 설치되는 라이브러리와 함께 샘플 코드로 제공하려고 하는 리소스(Java, XML, ...등)를 <strong>Anyframe</strong> Plugin의 폴더/파일 명명 규칙에 맞추어 작성하도록 한다.이때 <strong>Anyframe</strong> IDE의 소스 코드 생성 기능을 이용하여 Board에 대한 CRUD 소스 코드를 생성해보자.샘플 DB 테이블로 제공되는 BOARD와 BOARD_MASTER에 대한 도메인 클래스를 먼저 생성한 후, 이중 Board 도메인 클래스 기반의 CRUD 소스 코드를 생성한다.120


신규 Plugin 개발mvn anyframe:create-model -Dtable=BOARD,BOARD_MASTER -Dpackage=sample.plugin.board.domainmvn anyframe:create-crud -Dentity=sample.plugin.board.domain.Board -Dpackage=sample.plugin.board5. Board Plugin 빌드 파일 자동 생성 및 수정activate-plugin 명령어를 이용하여 Board Plugin을 위한 빌드 파일을 생성해내도록 한다.mvn anyframe:activate-plugin프로젝트 루트 폴더 하위에 생성된 plugin-build.xml 파일을 열어서 Board Plugin 내용에 맞게 변경해야 하는 항목들을 수정하도록 한다. 다음은 Board Plugin을 위한 plugin-build.xml 파일 내용으로 아래굵게 표시된 부분이 디폴트로 파일이 생성된 이후에 변경한 항목들이다.sample.pluginboard1.0-SNAPSHOT중략...중략...중략...6. Board Plugin 메뉴 추가프로젝트 하위의 /src/main/webapp 폴더 내에 있는 anyframe.jsp 페이지를 열어서 Board Plugin에대한 메뉴를 추가하도록 한다. 다음은 anyframe.jsp 페이지 내용 중 일부로 아래 굵게 표시된 부분이변경한 항목들이다. >!--Add new crud generation menu here--< 주석 부분에 생성된 Board 메뉴를 상단 >!--Add new menu here--< 주석 부분으로 이동 시키도록 한다. 이때 Plugin 메뉴임을 나타내도록Board-menu-START/END 태그로 작성함에 유의하도록 한다.- Board 1.0-SNAPSHOT중략...121


신규 Plugin 개발7. Board Plugin 패키징 수행수정된 Plugin 빌드 파일을 기반으로 package-plugin 명령어를 사용하여 패키징 작업을 진행하도록한다.mvn anyframe:package-plugin프로젝트의 /target/temp 폴더 하위 파일들을 보고 정상적으로 Plugin 구조에 맞게 패키징 되었는지 확인해보도록 한다.8. Board Plugin 로컬 환경 배포 및 확인패키징이 완료된 Board Plugin 파일을 개발자 로컬 환경에 배포한 후 테스트해보도록 하자. BoardPlugin은 optional한 Plugin으로 등록할 것이다.mvn anyframe:install-pluginfile다음과 같이 Plugin 개발자의 [사용자 계정 홈 디렉토리]/.anyframe 폴더 하위에 있는 plugin-catalogoptional.xml파일에 Board Plugin 정보가 작성되어 있는 것을 확인해볼 수 있다.sample.pluginboard1.0-SNAPSHOT중략...Command 창에서 list 명령어를 실행시켜 Board Plugin이 설치 가능한 Plugin 목록에 추가되었는지확인해 보도록 하자. 정상적으로 추가된 경우에는 <strong>Anyframe</strong>에서 제공하는 다른 Plugin과 동일하게설치/삭제가 가능해진다. 다른 샘플 프로젝트를 생성한 후 해당 프로젝트에 Board Plugin을 설치해보도록 한다.mvn anyframe:listmvn anyframe:install -Dname=board9. Board Plugin 배포 및 확인Board Plugin을 다른 사람들과 공유하기 위해서 deploy-pluginfile 명령어를 실행시켜서 원격 Repository에 배포하도록 한다. <strong>Anyframe</strong>에서 사용하는 원격 Repository(http://dev.anyframejava.org/maven/repo)에 배포하는 경우가 아니라면 원하는 원격 Repository에 대한repositoryId와 url 정보를 명령어 실행 시 파라미터로 입력해주어야 한다.mvn anyframe:deploy-pluginfile -DrepositoryId=anyframe-repository -Durl=http://dev.anyframejava.org/maven/repoupdate-catalog 명령어를 실행시켜서 원격 Repository로부터 배포된 Plugin catalog 파일을 내려받도록 한다. list 명령어를 실행시켜서 Board Plugin이 설치 가능한 Plugin 목록에 추가되었는지 확인해보도록 하자. 정상적으로 추가된 경우에는 <strong>Anyframe</strong>에서 제공하는 다른 Plugin과 동일하게 설치/삭제가 가능하므로 다른 샘플 프로젝트를 생성한 후 테스트해보도록 한다.mvn anyframe:update-catalogmvn anyframe:list122


신규 Plugin 개발mvn anyframe:install -Dname=board123


V.Continuous Build<strong>Anyframe</strong> 기반으로 지속적인 빌드 환경을 구성할 수 있는데, 빌드 서버와 연계하여 어떻게 이 기능을 사용하는 지살펴보자. CTIP(Continuous Test and Integration Platform, 이하 CTIP)은 어플리케이션 개발 라이프 사이클 전체에걸쳐 사용되는 개발 도구와 빌드, 테스트 도구 등을 통합한 자동화된 도구이다. <strong>Anyframe</strong>에서는 이러한 CTIP 환경구성 및 통합 방법을 제공한다.


15.InstallationCTIP 환경 구성을 위해 Build Server와 SCM Server(소스 코드 형상 관리 서버)를 설치하도록 한다. 현재 Build Server로 Hudson 설치를 가이드하고 있으며 SCM Server로 SubVersion [http://subversion.tigris.org/], CVS [http://www.nongnu.org/cvs/] 등을 가이드하고 있다. Hudson의 경우,<strong>Anyframe</strong> IDE 툴 연계를 위한 추가 설정이 필요하기 때문에 본 매뉴얼에서는 Hudson 설치 및 연계 작업에 대한 내용을 설명하고 있다. SCM Server 설치는 선택한 제품을 추가 변경 없이 설치하면 되므로본 매뉴얼에서 설명하고 있지 않다.15.1.Hudson 설치Hudson 사이트 [http://hudson-ci.org/]로부터 Hudson WAR 파일을 다운로드 받은 후, 단독 실행시키거나 Servlet Container에 배포하여 구동시키도록 한다. Hudson 설치에 대한 자세한 내용은 Hudson 사이트[http://hudson-ci.org/]를 참고하도록 한다. 현재 <strong>Anyframe</strong>은 Hudson 1.358 버전에 대해서 테스트되었으며 아래 표에 나타난 Hudson Plugin들을 설치하여 구성되었다. 기본적으로 설치되는 Hudson Plugin들외 추가시킨 Hudson Plugin들도 있으므로 Plugin 전체 목록을 확인해보도록 한다. 각 Hudson Plugin의 버전에 따라 설치된 Hudson 서버에서 정상적으로 동작하지 않을 수도 있으므로 Hudson Plugin 버전에 유의하도록 한다. 만약 최신 버전의 Hudson Plugin 설치 시 정상적으로 동작하지 않는다면 Hudson Plugin다운로드 사이트 [http://hudson-ci.org/]에서 해당 Plugin의 버전을 찾아서 따로 설치해주도록 한다.Plugin Name Plugin ID Description VersionStatic Analysis Collector Pluginanalysis-collectorThis plug-in is an add-on for the pluginsCheckstyle, Dry, FindBugs, PMD,Task Scanner, and Warnings: the plugincollects the different analysis resultsand shows the results in a combinedtrend graph. Additionally, the plug-inprovides health reporting and buildstability based on these combinedresults.Static Analysis Utilities analysis-core This plug-in provides utilities for thestatic code analysis plug-ins. Hudsonunderstands the result files of severalstatic code analysis tools. For eachresult file a different plug-in is used forconfiguration and parsing. Since theseresults are visualized by the same backend,the description of this back-end iscombined in this section.Checkstyle Plug-in checkstyle This plugin generates the trend report forCheckstyle, an open source static codeanalysis program.CVS Plugin cvs This bundled plugin integrates Hudsonwith CVS version control system.Dashboard View dashboard-view This plugin contributes a newview implementation that provides adashboard / portal-like view for yourHudson instance.Duplicate Code Scanner PlugindryThis plugin generates the trend report forduplicate code checkers like CPD.1.51.83.61.11.52.6125


InstallationPlugin Name Plugin ID Description VersionEmma Plugin emma This plugin allows you to capture codecoverage report from Emma. Hudson willgenerate the trend report of coverage.FindBugs Plug-in findbugs This plugin generates the trend reportfor FindBugs, an open source programwhich uses static analysis to look forbugs in Java code.JDepend Plugin jdepend The JDepend Plugin is a plugin togenerate JDepend reports for builds.Maven 2 Project Plugin maven-plugin Hudson's Maven 2 project type support.This plugin is part of the core Hudsondistribution.PMD Plug-in pmd This plugin generates the trend reportfor PMD, an open source static codeanalysis program.Hudson Support SubscriptionNotification Pluginscis-ad This plugin notifies the supportsubscription offering.SSH Slaves plugin ssh-slaves This plugin allows you to manage slavesrunning on *nix machines over SSH. Itadds a new type of slave launch method.Subversion Plugin subversion This plugin adds the Subversion support(via SVNKit) to Hudson.This plugin isbundled inside hudson.war.Visual SourceSafe Plugin vss This plugin integrates Hudson withMicrosoft Visual SourceSafe .1.204.81.2.21.3583.61.20.101.171.715.2.<strong>Anyframe</strong> IDE 파일 설치<strong>Anyframe</strong> IDE Editor에서 Hudson과 연계하여 Hudson Job에 대해 추가,수정,삭제,실행 등의 작업을 하기 위해서는 다음과 같은 추가 작업이 필요하다.1. <strong>Anyframe</strong> 포탈 사이트에서 anyframe-X.X.X.zip 을 다운받는다.2. 압축을 풀고 anyframe-X.X.X/ide/eclipse-plugins/hudson 폴더에 있는 플러그인 패키지 파일(anyframe-ide-eclipse-hudson-X.X.X.jar )를 " [Hudson 설치 폴더]/hudson/war/WEB-INF/lib " 로복사한다.anyframe-ide-eclipse-hudson-X.X.X.jar 은 IDE에서 설정한 정보를 Hudson에 반영하는 역할을 수행한다.3. [Hudson 설치 폴더]/hudson/war/WEB-INF/web.xml 파일을 열어서 아래와 같은 내용을 추가하거나, anyframe-X.X.X/ide/eclipse-plugins/hudson 폴더 내에 있는 web.xml 을 [Hudson 설치 폴더]/hudson/war/WEB-INF 폴더에 붙여넣는다.hudsonHome, hudsonJobDir 는 [Hudson 설치 폴더]/bin 기준으로 표현된 것으로, 경로가 다를 경우 수정이 필요하다. hudsonHome의 경우 hudson.tasks.Ant.xml, hudson.tasks.Mailer.xml,hudson.tasks.Maven.xml 세개 파일에서 현재 개발 환경에 맞도록 폴더 경로를 지정한다.hudsonJobDir의 경우 hudson job 이 있는 폴더경로를 지정한다.Hudson Gen Servletorg.anyframe.ide.eclipse.hudson.HudsonGenServlet126


InstallationhudsonHome../hudsonhudsonJobDir../hudson/jobsHudson Gen Servlet/anyframe/api/*127


16.Build Server(Hudson) 연계<strong>Anyframe</strong> IDE Editor에서 Hudson을 연결하여 Hudson에 job을 등록하고 job을 실행할 수 있는 연계 기능을 제공하는데, 이 기능은 <strong>Anyframe</strong> IDE CLI를 통해서는 제공되지 않으며 Eclipse Plugin을 통해서 제공되는 기능이다. <strong>Anyframe</strong> IDE Eclipse Plugin을 통해 연계 작업을 수행하는 방법을 살펴보자.1. 프로젝트를 선택한 후 우 클릭 >> <strong>Anyframe</strong> Tools >> <strong>Anyframe</strong> IDE 을 선택한다.2. <strong>Anyframe</strong> IDE Editor에서 CTIP Tab을 선택하면 다음과 같은 항목이 보인다.• Hudson URL• URL: Hudson 서버에 접근하기 위한 url• Configure...: Hudson 서버에 접근하기 위한 url을 등록,수정,삭제 등 관리하기 위한 팝업 화면호출• Hudson Configuration• MAVEN_HOME: 프로젝트에서 Maven 빌드도구를 사용하는 경우 보여지며, Maven이 설치된 경로로 설정이 되어야 한다. 만약 정상적으로 설정되어 있지 않다면 Hudson 서버의 Managed Hudson메뉴 >> Configure System >> Maven 항목 내용을 수정한다.• ANT_HOME: 프로젝트에서 Ant 빌드도구를 사용하는 경우 보여지며, Ant가 설치된 경로로 설정이 되어야 한다. 만약 정상적으로 설정되어 있지 않다면 Hudson 서버의 Managed Hudson 메뉴>> Configure System >> Ant 항목 내용을 수정한다.• Hudson URL in Email: Hudson Email Notification 시 사용할 url• All projects• Project name: ctip job name• Status: job 수행 상태로, job을 빌드 하는 중일 경우 building라는 메세지가 출력됨• New : 새로운 job 추가128


Build Server(Hudson) 연계• Remove : job 삭제• Run : job 실행• Project Details• Build Type* : build는 빌드를 수행하고 배포파일 생성, report는 build 기능에 JUnit test, Emma,Jdepend, PMD등의 reporting 기능도 수행표 16.1. Build TypeType build reportAnt(target) deploy allMaven(goal) package clean sitepackage• Project Name* : Hudson job name• Custom Workspace : workspace 경로지정• SCM Server Type : subversion, cvs, none 세가지 type 중 선택• SCM Server URL : SCM 서버 url• Poll SCM schedule : job 실행 스케쥴 정의• Build other project : 해당 job 수행 후 실행한 job의 이름 지정3. 빌드를 수행할 job을 목록에서 선택하고 Run 버튼을 클릭하여 빌드를 수행한다.빌드가 수행되면 Status는 "building"로 보여진다. 빌드 Status에 대해 scheduling이 걸려있지 않기때문에, 빌드 결과는 refresh 버튼을 클릭하여 확인한다.빌드가 다 수행이 되면 refresh 버튼을 눌렀을때 빌드 결과에 대한 이미지가 보여진다. 성공은 파란색, 실패는 빨간색으로 나타난다.129


Build Server(Hudson) 연계Web 타입 프로젝트의 경우 해당 Plugin과 샘플이 함께 설치되며, 해당 Plugin 적용된 샘플은 프로젝트를 실행시켜봄으로써 확인할 수 있다. Service 타입 프로젝트의 경우 해당 Plugin의 라이브러리만 설치된다.참고위 화면을 통해서 test case 가 없는 프로젝트에 대해서 job을 생성한 후 빌드했을 때,FAILURE가 발생한다. 이는 에러는 아니지만 test case에 대해 recording을 하기 위해, Junit,Emma Plugin이 출력하는 메세지이므로 test case를 사용하지 않을 경우 해당 Plugin을사용하지 않도록 설정해주어야 한다. "[프로젝트명]_report" job의 configure에서 "PublishJUnit test result report", "Record Emma coverage report" action을 uncheck 한다.Job 빌드 시 메모리 부족으로 Fail 한 경우등록한 job에 대해 빌드 수행시 다음과 같은 에러가 발생 할 경우 환경변수에 MAVEN_OPTS를 -Xmx1024m으로 추가 설정해준다.• 환경변수 설정변수이름 : MAVEN_OPTS변수 값 : -Xmx1024m• 콘솔에 출력된 에러로그Error occurred during initialization of VMCould not reserve enough space for object heapCould not create the Java virtual machine...130


17.Build 수행 결과Hudson 서버에 등록된 프로젝트들은 빌드 수행이 완료된 이후 Hudson 서버 홈페이지에서 성공(파랑색)/실패(빨강색) 여부를 아이콘 색깔로 표현한다. 빌드 수행 결과에 대한 자세한 내용을 확인해보자.• [프로젝트명]_report 타입 프로젝트Hudson 서버 홈페이지에서 해당 프로젝트 명을 클릭하면 좌측 하단에 Build History가 나온다. 이 항목하위로 빌드 목록이 조회되는데 가장 최근에 빌드 시킨 프로젝트의 Reporting 결과를 확인하기 위해서 시간 링크를 클릭한다. 그러면 좌측 메뉴 항목을 통해 5가지의 Reporting 결과를 확인해볼 수 있다.1. Duplicate Code소스 코드 중 어느 소스 코드들이 중복되어 있는지 목록 정보를 알려주고, 해당 소스 코드 내용 중중복 코드 부분에 대해서 주황색으로 디스플레이해줌으로써 시각적으로 확인해볼 수 있다.2. PMD WarningsPMD 툴을 이용하여 자바 소스 코드들을 분석하여 잠재적인 문제들을 분석해준다. 사용하지 않는변수, 아무 처리도 안하는 catch 블록, 불필요한 객체 생성 등등을 찾아낸다. 해당 소스 코드 내용중 잠재적인 버그가 존재하는 부분에 대해서 주황색으로 디스플레이해줌으로써 시각적으로 확인해볼 수 있으며 잠재적인 문제의 심각도(Priority) 등의 정보도 함께 보여준다.3. Test ResultJUnit 테스트 케이스 수행 결과를 조회한다. 테스트 케이스 수행 시간, 성공 여부, 에러 발생 시 에러 메시지 정보를 Hudson 서버를 통해 확인할 수 있다.4. Coverage ReportEmma 툴을 활용하여 테스트 케이스가 원 소스 코드를 얼마나 커버하고 있는지를 수치로 보여준다. 각 클래스, 메소드, 블럭, 라인 별 커버리지 결과를 확인할 수 있다.5. Checkstyle WarningsCheckstyle 툴을 이용하여 소스 코드의 Naming 및 개발 표준 준수 여부를 확인할 수 있다. 해당소스 코드 내용 중 Checkstyle에 위배되는 코드 부분에 대해서 주황색으로 디스플레이해줌으로써시각적으로 확인해볼 수 있다.각 소스 코드 품질 검사 Reporting 툴에 대한 관련 파일 및 설정, 룰셋 등은 Ant 기반의 <strong>Anyframe</strong> 개발 환경에서는 [<strong>Anyframe</strong> 설치 폴더]/ide/inspection 폴더에서 확인할 수 있으므로 변경 사항 발생시 이곳에 반영하도록 한다. Maven 기반의 <strong>Anyframe</strong> 개발 환경에서는 [사용자 홈 폴더]/.anyframe/inspection 폴더에서 확인할 수 있다.• [프로젝트명]_build 타입 프로젝트Hudson 서버 홈페이지에서 해당 프로젝트 명을 클릭하면 우측 화면 중앙에 Workspace 메뉴 항목이나오고, 이를 클릭하면 빌드 수행 결과 산출물을 화면을 통해 확인해볼 수 있다.• Maven 빌드 수행 결과Workspace 하위에 있는 target 폴더를 클릭하면 프로젝트에 대해 패키징된 결과 파일이 보이고, 해당 패키징 파일의 압축이 풀려진 형태의 폴더도 함께 존재하므로 개발 서버에서 웹 어플리케이션서버(WAS)를 이용하여 배포하는 경우 여기에 있는 웹 어플리케이션 폴더를 인식시키도록 한다.• Ant 빌드 수행 결과131


Build 수행 결과Workspace 하위에 있는 dist 폴더를 클릭하면 프로젝트에 대해 패키징된 결과 파일이 보이고, 해당 패키징 파일의 압축이 풀려진 형태의 폴더도 함께 존재하므로 개발 서버에서 웹 어플리케이션서버(WAS)를 이용하여 배포하는 경우 여기에 있는 웹 어플리케이션 폴더를 인식시키도록 한다.132


VI.App. Server Configurations본 문서에서는 Plugin 설치로 생성된 샘플 어플리케이션을 실행시키기 위한 WAS로써 Jetty, Tomcat를 채택하여 설명을 기술하고 있다. 그러나 Plugin 설치로 생성된 샘플 어플리케이션은 특정 WAS에 종속되지 않으므로 mvn cleancompile war:war와 같은 명령어 실행을 통해 패키징한 후 WebLogic, JEUS와 같은 상용 WAS에 deploy하여 실행시키는 것도 가능하다. 단, 샘플 어플리케이션이 참조하는 일부 라이브러리의 버전을 해당 WAS에서 지원하지 않는경우가 있어 이에 대한 조치사항을 언급하고자 한다.


18.WebLogic<strong>Anyframe</strong>의 plugin이 설치된 샘플 어플리케이션을 WebLogic에 deploy할 경우 주의해야 할 설정에 대해서 알아보자.WebLogic + IE8아래에 나열된 WebLogic 서버에 샘플 어플리케이션을 deploy하여 테스트할 때, 웹 브라우저로 Internet Explorer 8을 이용할 경우 'http://localhost:8080/myproject'처럼 URL에'localhost'를 사용하면 Session 유지가 안되는 문제가 존재한다. 이 경우 테스트 URL을http://127.0.0.1:8080/myproject와 같이 IP를 사용할 것을 권장한다.18.1.core plugin 사용 시• 10.1 : JavaEE 5를 지원하는 WebLogic 10.1에서는 JPA 1.0 라이브러리가 표준으로 포함되어 있기 때문에, 다음과 같은 문제가 발생할 수 있다.Core Plugin 설치로 생성된 샘플 프로젝트는 JSR-303 Annotation 기반의 Model Validation 기능을 수행하기 위해 Hibernate Validator 4.1.0 라이브러리를 활용하고 있으며 이 라이브러리는 JPA 2.0 라이브러리를 참조한다. 그런데 WebLogic 10.1은 JPA 1.0 라이브러리를 기준으로PersistenceProvider를 제공하고 있어서 Model Validation 기능 사용 시 java.lang.AbstractMethodErrorat javax.persistence.Persistence$1.isLoaded 에러가 발생한다.이는 weblogic.xml 에서 prefer-web-inf-classes을 true로 조정하여도 별다른 효과가 없으므로, 아래와같은 방법으로 해당 문제점을 회피할 수 있다.• 샘플 프로젝트 폴더 내 WEB-INF/lib에서 hibernate-jpa-2.0-api-1.0.0.Final.jar 파일을 제거하고 대신 javax.persistence_2.0.1.vxxx.jar 파일을 배포하도록 한다. 이 jar 파일은EclipseLink(Eclipse Persistence Services Project, http://www.eclipse.org/eclipselink/) 사이트[http://www.eclipse.org/eclipselink/]에서 다운로드 받아서 사용하도록 한다. EclipseLink 2.x 버전Installer Zip 파일을 다운로드 받은 후 압축을 풀면 JAR 파일을 확인할 수 있다.• [WebLogic 설치 Home]/common/lib 디렉토리에 javax.persistence_2.0.1.vxxx.jar와 antlr-2.7.7.jar파일을 복사한다.• [사용자 Domain Home]/bin 폴더 내의 setDomainEnv.cmd(or setDomainEnv.sh) 파일 내의PRE_CLASSPATH 속성을 다음과 같이 정의한다.set PRE_CLASSPATH=%WL_HOME%/common/lib/antlr-2.7.7.jar;%WL_HOME%/common/lib/javax.persistence_2.0.1.vxxx.jar(UNIX sh : set PRE_CLASSPATH="${WL_HOME}/common/lib/antlr-2.7.6.jar:${WL_HOME}/common/lib/javax.persistence_2.0.1.vxxx.jar")• 10.3.3 : JavaEE 6를 지원하는 WebLogic 10.3.3에서는 JPA 1.0 라이브러리가 표준으로 포함되어 있기 때문에, 다음과 같은 문제가 발생할 수 있다.Core Plugin 설치로 생성된 샘플 프로젝트는 JSR-303 Annotation 기반의 Model Validation 기능을 수행하기 위해 Hibernate Validator 4.1.0 라이브러리를 활용하고 있으며 이 라이브러리는 JPA 2.0 라이브러리를 참조한다. 그런데 WebLogic 10.3.3은 JPA 1.0 라이브러리를 기준으로PersistenceProvider를 제공하고 있어서 Model Validation 기능 사용 시 java.lang.AbstractMethodErrorat javax.persistence.Persistence$1.isLoaded 에러가 발생한다.아래와 같은 방법으로 해당 문제점을 회피할 수 있다.134


WebLogic• EAR Folder를 구성한다. 예를 들어 myproject라는 이름의 프로젝트를 ear로 작업한다면 다음과 같이 2개의 폴더 형태로 구성할 수 있다.myproject.ear/ META-INF/ myproject• META-INF 폴더에 application.xml을 배포한다. 아래 내용을 예시로 참고한다.Myprojectmyprojectmyproject• META-INF 폴더에 weblogic-application.xml 파일을 배포한다. javax.persistence package에 대해서WEB-INF/lib 폴더 내에 있는 라이브러리를 우선 참조하도록 설정한다. 아래 내용을 예시로 참고한다.javax.persistence.*• myproject 폴더 내 WEB-INF에 weblogic.xml 파일을 배포한다. 웹 어플리케이션 내 라이브러리 및 클래스 파일들을 우선 참조하도록 설정한다. 아래 내용을 예시로 참고한다.true• myproject 폴더 내 WEB-INF/lib에서 hibernate-jpa-2.0-api-1.0.0.Final.jar 파일을 제거하고 대신 javax.persistence_2.0.1.vxxx.jar 파일을 배포하도록 한다. 이 jar 파일은EclipseLink(Eclipse Persistence Services Project, http://www.eclipse.org/eclipselink/) 사이트[http://www.eclipse.org/eclipselink/]에서 다운로드 받아서 사용하도록 한다. EclipseLink 2.x 버전Installer Zip 파일을 다운로드 받은 후 압축을 풀면 JAR 파일을 확인할 수 있다.WebLogic 기반에서 샘플 어플리케이션을 실행할 때 해당 어플리케이션의 WEB-INF/lib 폴더 내에 slf4jlog4j-x.x.x.jar파일이 한 개 임에도 불구하고, "SLF4J: Class path contains multiple SLF4J bindings."로 시작하는 경고 메시지가 나타날 수 있다. 이는 SLF4J 내에 존재하는 알려진 버그 [http://bugzilla.slf4j.org/show_bug.cgi?id=138]이나, 어플리케이션 실행에는 영향을 미치지 않으므로 무시하도록 한다.135


WebLogic18.2.cxf plugin 사용 시Apache CXF는 JDK 1.5 이상을 지원하므로 WebLogic 서버의 경우, WebLogic 9.2(JDK 1.5), 10.1(JDK1.5), 10.3(JDK 1.6) 버전의 서버가 대상이 된다. WebLogic 서버에 대한 설명 및 다운로드는 이곳 [http://www.oracle.com/appserver/index.html]을 참고하도록 한다.단, Plugin 설치로 생성된 샘플 어플리케이션일 경우, 오픈소스 활용을 위한 WAS별 조치 사항을 확인하기 위해 먼저 설치된 각 Plugin 별 유의사항 을 참고하도록 한다.• 9.2 : cxf-jaxws plugin 설치 시 라이브러리 문제로 인해 아래와 같이 추가 작업이 필요하며, EAR 파일로 웹어플리케이션을 구성하는 방법[방법 1] 혹은 geronimo-ws-metadata_2.0_spec-1.1.2.jar 파일을 복사하는 방법[방법 2] 중에서 선택할 수 있다.• [방법 1] EAR 파일로 웹어플리케이션을 구성하는 방법• <strong>Anyframe</strong>에서 제공하는 Plugin들은 Jetty 기반으로 구성되어 있으므로 기본적으로 8080 포트를이용한다. 따라서, WebLogic을 활용할 경우에는 샘플 어플리케이션의 cxf-jaxws-servlet.xml 파일을 열고, 'http://localhost:8080/...' 부분을 'http://localhost:{Weblogic 사용 포트}/...'로 변경해주어야 한다.• EAR Folder를 구성한다. 예를 들어 myproject라는 이름의 프로젝트를 ear로 작업한다면 다음과같이 2개의 폴더 형태로 구성할 수 있다.myproject.ear/ META-INF/ myproject• META-INF 폴더에 application.xml을 배포한다. 아래 내용을 예시로 참고한다.Samplemyproject/myproject• META-INF 폴더에 weblogic-application.xml 파일을 배포한다. javax.jws package에 대해서 WEB-INF/lib 폴더 내에 있는 라이브러리를 우선 참조하도록 설정한다. 아래 내용을 예시로 참고한다. weblogic-application.xml 작성방법은 이곳 [http://cwiki.apache.org/CXF20DOC/application-server-specific-configurationguide.html#ApplicationServerSpecificConfigurationGuide-WebLogic]을 참고하도록 한다.javax.jws.*• myproject 폴더 내 WEB-INF에 weblogic.xml 파일을 배포한다. 웹 어플리케이션 내 라이브러리 및클래스 파일들을 우선 참조하도록 설정한다. 아래 내용을 예시로 참고한다.136


WebLogictrue• myproject 폴더 내 WEB-INF/lib 폴더 내에 있는 xmlbeans-x.x.x.jar 파일을 제거한다.• [방법 2] geronimo-ws-metadata_2.0_spec-1.1.2.jar 파일을 복사하는 방법• JDK_HOME/jre/lib/endorsed 폴더에 geronimo-ws-metadata_2.0_spec-1.1.2.jar 파일을 복사한다.• WebLogic 서버 설치 시 설정했던 JDK 1.5의 위치를 확인하여 JDK_HOME/jre/lib 폴더 하위에endorsed 폴더를 생성하고, 현재 배포하려고 하는 웹 어플리케이션의 WEB-INF/lib 폴더 하위의geronimo-ws-metadata_2.0_spec-1.1.2.jar 파일을 endorsed 폴더 하위로 복사해 넣도록 한다.[참고사항] 이 경우, 위 작업 내용이 WebLogic 서버 전체에 영향을 미치므로 주의하도록 한다.• 10.1 : cxf-jaxws plugin 설치 시 라이브러리 문제로 인해 아래와 같이 추가 작업이 필요하다.• <strong>Anyframe</strong>에서 제공하는 Plugin들은 Jetty 기반으로 구성되어 있으므로 기본적으로 8080 포트를 이용한다. 따라서, WebLogic을 활용할 경우에는 샘플 어플리케이션의 cxf-jaxws-servlet.xml 파일을 열고, 'http://localhost:8080/...' 부분을 'http://localhost:{Weblogic 사용 포트}/...'로 변경해주어야한다.• EAR Folder를 구성한다. 예를 들어 myproject라는 이름의 프로젝트를 ear로 작업한다면 다음과 같이 2개의 폴더 형태로 구성할 수 있다.myproject.ear/ META-INF/ myproject• META-INF 폴더에 application.xml을 배포한다. 아래 내용을 예시로 참고한다.Samplemyproject/myproject• META-INF 폴더에 weblogic-application.xml 파일을 배포한다. javax.jws package에 대해서 WEB-INF/lib 폴더 내에 있는 라이브러리를 우선 참조하도록 설정한다. 아래 내용을 예시로 참고한다.javax.persistence.*javax.jws.*• myproject 폴더 내 WEB-INF에 weblogic.xml 파일을 배포한다. 웹 어플리케이션 내 라이브러리 및 클래스 파일들을 우선 참조하도록 설정한다. 아래 내용을 예시로 참고한다.137


WebLogictrue• myproject 폴더 내 WEB-INF/lib 폴더 내에 있는 xmlbeans-x.x.x.jar 파일을 제거한다.• 10.3.3 : cxf-jaxws plugin 설치 시 라이브러리 문제로 인해 아래와 같이 추가 작업이 필요하다.• <strong>Anyframe</strong>에서 제공하는 Plugin들은 Jetty 기반으로 구성되어 있으므로 기본적으로 8080 포트를 이용한다. 따라서, WebLogic을 활용할 경우에는 샘플 어플리케이션의 cxf-jaxws-servlet.xml 파일을 열고, 'http://localhost:8080/...' 부분을 'http://localhost:{Weblogic 사용 포트}/...'로 변경해주어야한다.• EAR Folder를 구성한다. 예를 들어 myproject라는 이름의 프로젝트를 ear로 작업한다면 다음과 같이 2개의 폴더 형태로 구성할 수 있다.myproject.ear/ META-INF/ myproject• META-INF 폴더에 application.xml을 배포한다. 아래 내용을 예시로 참고한다.Samplemyproject/myproject• META-INF 폴더에 weblogic-application.xml 파일을 배포한다. 아래 내용을 예시로 참고한다.javax.persistence.*• myproject 폴더 내 WEB-INF에 weblogic.xml 파일을 배포한다. 웹 어플리케이션 내 라이브러리 및 클래스 파일들을 우선 참조하도록 설정한다. 아래 내용을 예시로 참고한다.true138


WebLogic• Apache CXF 2.3 사용 시: 현재 배포되는 <strong>Anyframe</strong> cxf-jaxws plugin은 Apache CXF 2.3 버전을 사용하고 있다. 이 경우 WEB-INF/lib 폴더 내에 있는 xercesImpl-x.x.x.jar 파일을 제거하고, 사용하려는Weblogic 도메인 하위의 lib 폴더에 배포시키도록 한다.[참고] Apache CXF 2.2.7 사용 시: 이전 버전의 <strong>Anyframe</strong> cxf plugin은 Apache CXF 2.2.7 버전을 사용하고 있다. 이 경우 WEB-INF/lib 폴더 내에 있는 xercesImpl-x.x.x.jar, stax-api-x.x.jar 파일을 제거하고 이중 xercesImpl-x.x.x.jar 파일만을 사용하려는 Weblogic 도메인 하위의 lib 폴더에 배포시키도록 한다.• myproject 폴더 내 WEB-INF/lib 폴더 내에 있는 xmlbeans-x.x.x.jar 파일과 geronimo-staxapi_1.0_spec-x.x.x.jar파일을 제거한다.18.3.hibernate plugin 사용 시• 10.1 : JavaEE 5를 지원하는 WebLogic 10.1에서는 JPA 1.0 라이브러리가 표준으로 포함되어 있기 때문에, 다음과 같은 문제가 발생할 수 있다.Hibernate Plugin 설치로 생성된 샘플 어플리케이션 프로젝트는 Hibernate 기반 Movie 관리 정보를 수행하기 위해 Hibernate 3.6.0 라이브러리를 활용하고 있으며 이 라이브러리는 JPA 2.0라이브러리를 참조한다. 그런데 WebLogic 10.1은 JPA 1.0 라이브러리를 기준으로 동작하므로javax.persistence.OneToMany.orphanRemoval() 실행 시, NoSuchMethodException이 발생한다.이는 weblogic.xml 에서 prefer-web-inf-classes을 true로 조정하여도 별다른 효과가 없으므로, 위의core plugin 사용 시 의 내용을 참고하여 해당 문제점을 회피할 수 있다.• 10.3.3 : JavaEE 6를 지원하는 WebLogic 10.3.3에서는 JPA 1.0 라이브러리가 표준으로 포함되어 있기 때문에, 다음과 같은 문제가 발생할 수 있다.Hibernate Plugin 설치로 생성된 샘플 어플리케이션 프로젝트는 Hibernate 기반 Movie 관리 정보를 수행하기 위해 Hibernate 3.6.0 라이브러리를 활용하고 있으며 이 라이브러리는 JPA 2.0라이브러리를 참조한다. 그런데 WebLogic 10.1은 JPA 1.0 라이브러리를 기준으로 동작하므로javax.persistence.OneToMany.orphanRemoval() 실행 시, NoSuchMethodException이 발생한다.위의 core plugin 사용 시 의 내용을 참고하여 해당 문제점을 회피할 수 있다.18.4.tiles plugin 사용 시• 9.2 : tiles plugin의 샘플 어플리케이션은 화면이 Tiles 기반으로 구성되어 있으며 Tiles 정의시EL(Expression Language)를 사용할 수 있도록 하기 위해 tiles-config_2_1.dtd를 채택하고 있다. 그런데 이는 Servlet Spec. 2.5 이후부터 지원되는 기능이며 WebLogic 9.2는 Servlet Spec. 2.4를 구현한WAS이므로 이 기능 처리에 문제가 있다. 따라서 샘플 프로젝트 하위의 src/main/resources/spring/tiles-servlet.xml 파일을 열고, 'tilesConfigurer' Bean 정의에서 tilesInitializer 속성 정의를 Servlet Spec.2.4 용으로 변경하고 el-api.jar [http://seam-forum.googlecode.com/files/el-api.jar]를 샘플 어플리케이션 하위의 WEB-INF/lib에 추가한다. 수정된 'tilesConfigurer' Bean의 속성은 다음과 같다./WEB-INF/tiles-views.xml139


WebLogic140


19.JEUS<strong>Anyframe</strong>의 plugin이 설치된 샘플 어플리케이션을 JEUS에 deploy할 경우 주의해야 할 설정에 대해서알아보자.19.1.IAM plugin 사용 시• 6.0 : IAM Plugin 설치로 생성된 샘플 어플리케이션에서 활용하는 Spring Security 라이브러리와의 호환을 위해 JEUS 6.0 최신 패치가 설치되어 있어야 한다.19.2.cxf plugin 사용 시Apache CXF는 JDK 1.5 이상을 지원하므로 JEUS 서버의 경우, JEUS 5와 JEUS 6 버전의 서버가 대상이되나, JEUS 5의 경우 JAXB 라이브러리의 충돌로 Apache CXF 사용이 불가능하다. JEUS 서버에 대한 설명 및 다운로드는 TmaxSoft 홈페이지를 참고하도록 한다.단, Plugin 설치로 생성된 샘플 어플리케이션일 경우, 오픈소스 활용을 위한 WAS별 조치 사항을 확인하기 위해 먼저 설치된 각 Plugin 별 유의사항 을 참고하도록 한다.• 5.0 : Apache CXF 사용이 불가능 하다. JEUS 서버 라이브러리에 배포된 JAXB API, IMPL 및 참조 라이브러리(JAXB 1.x)와 Apache CXF를 사용하여 구현한 웹 어플리케이션에 배포된 라이브러리들(JAXB2.x)과 버전 차이로 동작하지 않는다.• 6.0 : 추가 설정 없이 Apache CXF 사용이 가능하다. JEUS 서버 라이브러리에 배포된 JAXB API, IMPL및 참조 라이브러리(JAXB 2.x)와 Apache CXF를 사용하여 구현한 웹 어플리케이션에 배포된 라이브러리들(JAXB 2.x)의 버전 일치로 문제없이 동작한다.단, <strong>Anyframe</strong>에서 제공하는 Plugin들은 Jetty 기반으로 구성되어 있으므로 기본적으로 8080 포트를이용한다. 따라서, JEUS를 활용할 경우에는 샘플 어플리케이션의 cxf-jaxws-servlet.xml 파일을 열고,'http://localhost:8080/...' 부분을 'http://localhost:{JEUS 사용 포트}/...'로 변경해주어야 한다.141


20.JBoss<strong>Anyframe</strong>의 plugin이 설치된 샘플 어플리케이션을 JBoss에 deploy할 경우 주의해야 할 설정에 대해서알아보자.20.1.core plugin 사용 시JBoss AS6에서 웹 어플리케이션과 JBoss의 상위 클래스 로더에 존재하는 라이브러리 중복으로 인한오류 해결을 위해 다음과 같이 추가 설정 및 일부 라이브러리를 제거한다.1. WEB-INF 폴더에 jboss-classloading.xml 파일 추가2. hibernate plugin 추가 설치다음의 plugin 설치 명령어를 실행하여 hibernate plugin을 설치한다.mvn anyframe:install -Dname=hibernate(Hibernate 사용 예에 대한 소스가 필요없는 경우는 -DexcludeSrc=true 옵션을 추가 한다.)3. SLF4J 라이브러리 제거WEB-INF/lib 폴더내에 slf4j-api-1.6.1.jar, slf4j-log4j12-1.6.1.jar 파일을 제거한다. (실행에 영향을 미치지는 않으나 multiple SLF4J bindings 로그 메시지 제거하는 역할을 한다. 자세한 설명은 http://www.slf4j.org/codes.html#multiple_bindings를 참조한다.)142

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!