Raible's Wiki
Raible Designs AppFuseHomepage- Korean - Chinese - Italian - Japanese QuickStart Guide User Guide Tutorials Other ApplicationsStruts ResumeSecurity Example Struts Menu
Set your name in
UserPreferences
Referenced by
JSPWiki v2.2.33
Hide Menu |
This is version 2.
It is not the current version, and thus it cannot be edited. Part I: AppFuse에서 새로운 DAO들과 Object들을 작성하기 - table을 나타내는 Java Object와 이 Object들을 데이타 베이스에 저장 시키는 Java 클래스들을 만드는 방법. About this Tutorial이 튜토리얼에서는 데이타베이스에 새로운 테이블을 만드는 방법과 그 테이블에 접근하는 자바 코드를 작성하는 방법을 알려줍니다.우리는 어떤 객체와 그 객체를 데이타베이스에 persist (save/retrieve/delete) 하기 위한 몇가지 클래스들을 만들것입니다. 자바에서는 이 객체를 Plain Old Java Object (a.k.a. a POJO) 라고 부릅니다. 이 객체는 기본적으로 데이타베이스 테이블을 표현합니다. 우리가 만들 몇가지 클래스들은 다음과 같습니다:
NOTE: 만약 당신이 MySQL을 사용하면서 트랜젝션 처리를 원한다면 반드시 InnoDB 테이블을 사용하여야 합니다. InnoDB를 사용 하려면 mysql 설정 파일(/etc/my.cnf or c:\Windows\my.ini)에 다음과 같은 라인을 추가합니다. 두번째 설정(UTF-8 character set) 은 mysql 4.1.7+ 버젼에서 필요한 것입니다.
[mysqld] default-table-type=innodb default-character-set=utf8만약 PostgreSQL 디비를 사용하면서 batch processing 에 관련된 에러가 나게 되면 src/dao/**/hibernate/applicationContext-hibernate.xml 파일에 <prop key="hibernate.jdbc.batch_size">0</prop> 라인을 추가해서 batch processing기능을 끄도록 합니다. AppFuse 는 persistence layer 로 Hibernate 를 사용 합니다. Hibernate 는 자바 객체와 데이타베이스 테이블을 관련짓게 하는 Object/Relational (O/R) Framework 로써 자바 객체에 CRUD (Create, Retrieve, Update, Delete) 기능을 매우 쉽게 다루게 합니다. 자 그럼 Object, DAO 그리고 Test 를 작성해 봅시다. 목차
Object 를 만들고 XDoclet 태그를 추가합니다 [#1]먼저 persist 할 object 를 작성합니다.id 와 firstName 그리고 lastName 속성을 가지고 있는 간단한 "Person" 객체를 작성합니다.(in the src/dao/**/model directory)
이 클래스는 3개의 abstract method (equals(), hashCode() and toString())를 가지고 있는 BaseObject 를 상속 받았고 이것은 Person class에서 반드시 구현 되어져야 합니다.
이제 우리가 만든 POJO 클래스에 대한 Hibernate 맵핑 파일을 만들기 위해 XDoclet 태그를 추가합니다. 첫째로, Hibernate 에게 이 object 와 관련된 데이타베이스 테이블이 무엇인지 알려주기 위하여 @hibernate.class 태그를 추가합니다:
다음으로 primary key 맵핑 태그를 추가해합니다. 모든 @hibernate.* 태그는 반드시 POJO 클래스의 getters' Javadoc 에 적어야 한다는걸 기억하세요
Ant 를 이용하여 Object 로 부터 데이타베이스 테이블을 만듭니다 [#2]이제 콘솔에서 "ant setup-db" 를 실행해서 person 데이타베이스 테이블을 만들 수 있습니다. "ant setup-db" 태스크는 Person.hbm.xml 파일과 "person." 테이블을 만듭니다. 태스크를 실행 시킴으로써 Hibernate 가 만드는 테이블 스키마를 볼 수 있습니다:[schemaexport] create table person ( [schemaexport] id bigint not null, [schemaexport] primary key (id) [schemaexport] ); 만약 Hibernate 가 만들어준 Person.hbm.xml 파일을 보고 싶다면 build/dao/gen/**/model 디렉토리를 보십시오 여기 Person.hbm.xml의 내용이 있습니다.
이제 다른 columns (first_name, last_name) 을 위한 추가적인 @hibernate.property 태그를 작성합니다:
위 예제에서 column 속성을 기술한 이유는 데이타베이스 컬럼 이름과 POJO 클래스의 속성 이름이 다르기 때문입니다.
만약 같다면 column 속성을 기술할 필요가 없습니다. 새로 만든 속성들을 데이타베이스 테이블의 column 으로 추가하기 위하여 "ant setup-db" 을 다시 실행 합니다. [schemaexport] create table person ( [schemaexport] id bigint not null, [schemaexport] first_name varchar(50), [schemaexport] last_name varchar(50), [schemaexport] primary key (id) [schemaexport] );만약 column 의 사이즈를 바꾸고 싶다면 @hibernate.property 태그에 length="size" 속성을 기술해 주면 됩니다. 또 필수항목(NOT NULL)으로 설정하고 싶다면 not-null="true" 속성을 기술해 주면 됩니다. JUnit 으로 DAO 를 테스트 하기위해 DaoTest 클래스를 만듭니다 [#3]
The AppGen Tool
이 튜토리얼의 나머지 부분의 모든 클래스들을 자동으로 생성해 주는 AppGen 툴을 AppFuse 버젼 1.61 의 일부로 포함 시켰습니다.
이 툴은 Lance Lavandowska 와 Ben Gill으로 부터 기증받은 것을 토대로 만들어 졌습니다.
처음에 나는 tables/pojos, DAOs와 Managers 들의 관계를 1-to-1 으로 만들게 하는 이와 같은 코드 생성 툴을 추가하고 싶지 않았었습니다. 대부분 나의 프로젝트에서는 POJOs 보다 DAOs 와 Managers 들의 수가 훨씬 적었습니다. 기본적으로 AppGen 은 오직 Actions/Controllers와 그 테스트, 그리고 테스트 데이타, i18n 키값들 그리고 JSP 들을 만듭니다.
또한 이 툴은 Actions/Controllers을 구성(설정)해줍니다.
이 툴을 사용하기 위해서는 다음의 순서를 따라해 주세요:
The reason for the "lowercase" parameter is to rename the JSPs to begin with a lowercase letter. If I tried to rename them and change the filename programmatically, it took 1MB worth of BSF and Rhino JARs (+5 lines of code) and this just seemed easier. Speaking of JSPs - it's up to you to modify the *Form.jsp and make it look pretty. This is covered in Step 5 of each respective web framework's "Create Action/Controller" tutorial: Struts, Spring and WebWork. NOTE: If you'd like to generate all the DAOs/Managers/Tests, run "ant install-detailed" instead of "ant install". Before you install anything, the files will be created in the extras/appgen/build/gen directory (in case you want to look at them before installing). If you just want to test the tool, you can cd to this directory and run "ant test" to see the contents of these tutorials created. I encourage you to read these tutorials even if you decide to generate all your code. That way you'll understand what's being generated for you and you'll only need to mailing list for asking smart questions. ;-) Hopefully this tool will remove the pain of writing simple CRUD code and let you concentrate on developing your business logic and fancy UIs! 이제 DAO 클래스를 테스트 하기 위한 DaoTest 클래스를 작성합니다. 시작하기 위해서, test/dao/**/dao 디렉토리에 PersonDaoTest.java 를 만듭니다. 이 클래스는 같은 패키지에 들어있는 BaseDaoTestCase 클래스를 확장해야 합니다. 이 부모 클래스는 Spring's ApplicationContext을 읽어 들이는 것과 *Test.class 와 같은 이름을 가지는 .properties 파일 (ResourceBundle)을 자동으로 읽어들이는데 사용 됩니다. 이 예제에서는 PersonDaoTest.properties 파일을 PersonDaoTest.java 와 같은 디렉토리에 놓으면 이 파일에 기술된 속성들은 rb 변수에 의해 사용될 수 있게 됩니다.
JUnit 테스트를 위해서 PersonDao 를 initializes(초기화) 하고 destroys (소멸) 하는 기본적인 코드입니다. "ctx" object 는 Spring's ApplicationContext 입니다. 이것은BaseDaoTestCase 클래스의 static block 에서 초기화 됩니다. 자 이제는 DAO의 CRUD(create, retrieve, update, delete) 메소드를 테스트를 해야 합니다. 이 테스트를 위해서 우리는 test(모두 소문자)로 시작하는 메소드를 만들어야 합니다. 이 메소드가 Ant build.xml 파일의 <junit> 태스크에 의해 불려 질려면 몇가지 규칙이 필요합니다.
여기 CRUD 테스트를 위한 간단한 테스트 코드가 있습니다. 중요한 것은 각각의 메소드들은 자발적으로 일어난다는 점 입니다. 다음의 메소드들을 PersonDaoTest.java 파일에 추가 합니다:
<table name='person'> <column>id</column> <column>first_name</column> <column>last_name</column> <row> <value>1</value> <value>Matt</value> <value>Raible</value> </row> </table>
위 예제에서 우리는 객체를 저장하기 전에 그 값들을 설정하기 위하여 person.set*(value) 를 호출하였습니다. 위 예제에서는 무척 간단했지만(속성이 몇개 없기 때문에) 만약 10개의 필수 필드(not-null="true")를 가지는 개체를 저장한다면 이는 보통 성가신 일이 아닐겁니다. 이것이 내가 BaseDaoTestCase 에서 ResourceBundle 을 생성했던 이유입니다. 간단히 PersonDaoTest.java 와 같은 디렉토리에 PersonDaoTest.properties 파일을 넣고 이 파일에 속성 값들을 설정합니다. firstName=Matt lastName=Raible그러고 나서 person.set* 메소드 대신 BaseDaoTestCase.populate(java.lang.Object) 을 호출 함으로서 object의 값들을 설정할 수 있습니다.
아직 PersonDao.class 를 만들지 않았기 때문에 PersonDaoTest 클래스는 컴파일 되지 않을겁니다. 우리는 지금 그것을 작성해야만 합니다. PersonDao.java 는 interface 입니다. 그리고 PersonDaoHibernate.java 는 그 인터페이스의 Hibernate 를 이용한 구현입니다. 자 이것들을 만들어 봅시다. Object 의 CRUD 처리를 위한 DAO 클래스를 만듭니다 [#4]첫째로 구현 클래스들을 위한 기본적인 CRUD 메소드들을 정의한 PersonDao.java interface 를 src/dao/**/dao 에 만들고 CRUD 메소드를 정의합니다. 나는 요점만 보여주기 위하여 아래 클래스에 JavaDoc 들을 삭제했습니다.
위 클래스의 모든 메소드에 예외를 기술하지 않은것은 Spring 프레임워크가 RuntimeException 들을 감싸고(wrap) 있기 때문입니다. 여기서 "ant compile-dao" 태스크를 이용하여 src/dao 와 test/dao 에 있는 모든 소스코드들을 컴파일 할 수 있을겁니다. 그러나 만약 "ant test-dao -Dtestcase=PersonDao" 태스크를 실행 하려 한다면 에러가 날 것입니다:No bean named 'personDao' is defined. 이것은 Spring 에 의해서 나타난 에러 메세지입니다. 이 메세지의 의미는 applicationContext-hibernate.xml 에 personDAO 라는 bean 을 정의 해야 한다는 것입니다. 이 bean 을 정의하기 전에 먼저 우리는 PersonDao 를 구현한 클래스를 작성해야 할 것입니다.
PersonDao interface의 메소드를 구현하는 PersonDaoHibernate class 를 작성합시다. 그리고 Hibernate 를 사용하여 Person object 를 get/save/delete 하는 메소드를 작성해봅시다.
여기서 "ant test-dao -Dtestcase=PersonDao" 태스크를 실행하려 하면 똑같은 에러가 나올 겁니다. 우리는 PersonDao 의 구현 클래스는 PersonDaoHibernate 라는 것과 Person object 에 대해 Spring 프레임워크가 알수 있도록 몇가지 파일들을 구성해야 합니다. Person object와 PersonDao를 Spring 프레임워크에 알리기 위해 설정파일을 구성합니다 [#5]첫째로, 어디에 Hibernate 매핑파일이 있는지 Spring 프레임 워크에 알려줘야 합니다.src/dao/**/dao/hibernate/applicationContext-hibernate.xml 파일을 열어서 Person.hbm.xml 을 다음 코드블럭처럼 추가 합니다.
다음으로 PersonDaoHibernate 와 PersonDao 를 연결하기 위해서 다음의 XML 태그를 이 파일에 끝에 추가 합니다.
DaoTest 를 실행 합니다. [#6]수정한 모든 파일을 저장하고 다시한번 "ant test-dao -Dtestcase=PersonDao" 태스크를 실행 합니다.Yeah Baby, Yeah: Next Up: Part II: 새로운 매니저 작성하기 - (Session Facades 와 비슷하지만 EJBs 를 사용하지 않는)Business Facades 를 작성하는 방법. DAO 계층과 front-end 계층을 연결하는 창구 역할을 합니다.
|