2012년 1월 3일 화요일

[DeveloperWorks] Rational Application Developer 8 및 WebSphere Application Server 8에서 JPA 사용

Rational Application Developer 8 및 WebSphere Application Server 8에서 JPA 사용

이 기사는 2010년 IBM® developerWorks®에 발표한 "Create bottom-up JPA entities with Rational Application Developer, DB2, and WebSphere Application Server"(참고자료에 표시되어 있음) 기사를 토대로 하고, 다음 애플리케이션에 대한 논의 내용과 지시사항을 업데이트하여 작성했다.
  • IBM® Rational® Application Developer 버전 8.0.2 개발 환경
  • IBM® WebSphere® Application Server 버전 8.0 베타(새로 릴리스된 Java Enterprise Edition(JEE) 6.0 스펙을 목표로 함)
  • Apache Derby 버전 10 데이터베이스
하지만, 이 기사에서는 다음과 같은 유형의 JPA(Java Persistence Architecture) 엔티티 작성에 초점을 맞춘다.
  • 기존의 관계형 테이블에서 생성되는 엔티티("상향식" 접근 방식이라고 함)
  • ID 속성에 데이터베이스에서 생성된 기본 키 값을 사용하는 엔티티
  • 하나 이상의 다른 JPA 엔티티 Bean(예: 일대일 또는 다대일의 관계)의 컴포지션(또는 집합)에 속하는 엔티티
이 기사에서 이런 내용에 중점을 두는 것은 아니지만, 애플리케이션에서는 Enterprise JavaBean(EJB) 3.1 Stateless Session Bean과 Servlet 2.5 스펙을 사용하는 서블릿을 사용한다.
시작하기 전에
애플리케이션을 생성하려면 다음 애플리케이션을 사용해야 한다.
  • IBM Rational Application Developer 버전 8.0.2.

참고:
버전 8.0을 설치한 후, IBM Installation Manager를 사용하여 수정팩과 설치 버전을 8.0.2 이상으로 업데이트하기 위한 다른 유지보수 프로그램을 검색하여 적용한다.
  • IBM WebSphere Application Server 8.0 베타, March Refresh 이미지(Rational Application Developer에서 사용 가능한 WebSphere Test Environment 사용)
    참고: Rational Application Developer 버전 8.0.2와 함께 제공되는 8.0 베타의 이전 버전은 사용할 수 없을 것이므로, 2011년 3월 베타 리프레시 이미지(링크는 참고자료 참조)를 다운로드하여 설치해야 한다.
  • Rational Application Developer에서 제공하는 Derby 데이터베이스 버전 10
또한, 사용 중인 파일 시스템에서 선택한 위치에 resources.zip 파일의 압축을 푼다(다운로드 섹션 참조). 압축 파일에는 다음 두 파일이 포함되어 있다.
  • members.sql
  • AcmeMembershipApplication.ear
이런 자원에는 최초 Derby 데이터베이스를 작성하기 위한 스크립트와 Java Enterprise Edition(JEE) 애플리케이션 개발을 시작하기 위한 아티팩트가 들어 있는 EAR(Enterprise Archive) 파일이 포함된다.
Acme 멤버십 시스템으로 작업
그림 1은 Acme의 멤버십 서브시스템용 실제 관계형 데이터베이스를 나타낸 것이다.

그림 1. Acme 멤버십 데이터 모델
Acme의 멤버십 데이터베이스에 대한 5개 테이블을 보여주는 다이어그램

Acme Co.의 서비스 및 혜택을 누리려면 클라이언트가 반드시 멤버가 되어야 한다. 클라이언트는 Single, Student 또는 Family 멤버십 중에서 선택할 수 있다(멤버십 테이블의 membership_type 필드를 통해 멤버십의 유형을 식별함). Family 멤버십은 커플과 18세 이하의 자녀가 있는 사람들에게 Acme의 서비스를 제공한다. 멤버를 "우수한 지위"로 유지하기 위해 클라이언트는 멤버십을 매년 갱신해야 한다.
모든 멤버십에는 최소한 하나 이상의 기본 멤버가 있다. 기본 멤버는 좋은 평판을 얻으며 멤버십을 유지하고 연간 등록비를 지불할 책임이 있다.
Family 멤버십은 기본 멤버 외에도 보통 하나 이상의 종속 멤버를 포함한다. Family 멤버십에는 배우자와 18세 미만 자녀의 두 가지 유형의 종속 멤버가 있다.
Acme Co.와 그 멤버 사이에 모든 서신은 기본 멤버를 통해서만 이루어진다. Acme는 이러한 용도로 모든 멤버십의 기본 멤버에 대한 주소 및 다른 연락처 정보를 수집한다.
WebSphere Application Server 설정
이 기사에서 빌드할 애플리케이션은 Rational Application Developer 버전 8.0에 포함된 WebSphere Application Server 버전 8.0 베타를 사용하여 작동하지 않는다. WebSphere Application Server 버전 8.0 베타(2011년 3월) 이후의 리프레시 이미지를 다운로드해야 한다. 또한, Rational Application Developer v8.0에 포함되어 있는 WebSphere 8.0 베타를 업그레이드할 수는 없다. 즉, 2011년 3월 v8.0 베타 리프레시를 별개의 위치에 설치해야 한다. 다행히도, 두 버전 모두 같은 시스템에 공존한다.
WebSphere Application Server 8.0 베타 2011년 3월 리프레시 버전을 다운로드하고 설치한 후, Rational Application Developer에서 서버 인스턴스를 작성해야 한다.
  1. 선택한 작업공간 위치를 사용하여 Rational Application Developer 8.0.2을 시작한다. 시작 > IBM Software Delivery Platform > IBM Rational Application Developer for WebSphere Software 8.0.2.
  2. 작업공간 위치를 입력하는 프롬프트가 표시되면, 제공된 기본 위치를 선택하거나 다른 편리한 위치를 입력한다.
  3. 시작 창이 표시되면 이를 닫고 바로 시작한다.
  4. 아직 Java EE Perspective를 열지 않았다면 연다.
    참고: 이 Perspective로 처음 전환하는 것이라면 특정 활동 또는 기능을 사용할 것을 요청하는 대화 상자 창이 표시될 수 있다. 그러면 OK를 클릭하여 그런 요청을 수락한다.
  5. Java EE Perspective의 Servers 보기에서 마우스 오른쪽 단추를 클릭하고 New > Server를 선택한다.
  6. New Server 마법사에서 그림 2와 같이 IBM 폴더를 펼치고 WebSphere Application Server v8.0 Beta를 선택하고 Next를 클릭한다.

그림 2. 애플리케이션을 배치하고 테스트할 새 서버 정의
마법사의 새 서버 정의 창

  1. Rational Application Developer v8에 포함된 WebSphere Application Server v8 베타의 이전 버전과 혼동되지 않도록, 그림 3과 같이 테스트 환경 서버의 이름을 WebSphere Application Server v8.0 Beta March 2011 Refresh로 지정한다. Installation directory 필드의 경우, WebSphere Application Server v8.0 베타 2011년 3월 리프레시 이미지를 설치한 위치를 찾아본다.
  2. Finish를 클릭한다.

그림 3. 서버 런타임 위치 설정
RAD의 New Server 대화 상자 창

Acme 멤버십 데이터베이스 작성
Acme의 멤버십 애플리케이션은 Acme 데이터베이스의 기존 레이아웃에 따라 다르다. Rational Application Developer에서 제공하는 임베디드 Derby 데이터베이스를 사용하여 Acme의 멤버십 데이터베이스 테이블을 다시 작성할 것이다.
  1. Data Perspective를 연다.
  2. Data Source Explorer 보기에서 Database Connections 폴더를 마우스 오른쪽 단추로 클릭하고 New를 선택한다.
  3. New Connection 마법사가 나타난다. 마법사 첫 페이지에서는 다음 세 가지 사항을 변경한다.
    1. Select a Database Manager: 패널의 선택 목록에서 Derby를 선택한다.
    2. JDBC driver: 드롭 다운 목록에서 Derby 10.2 – Embedded JDBC Driver Default를 선택한다.
    3. Database location: 텍스트 상자에서 기본값(Microsoft Windows에서는 일반적으로 C:\Documents and Settings\Administrator\MyDB)을 C:\Documents and Settings\Administrator\MembersDB로 업데이트한다.

그림 4. 새 Derby 데이터베이스 작성 및 연결
Connection Parameters 보기, New Connection 마법사

  1. Finish를 클릭한다.
관계형 테이블 작성
Members 데이터베이스를 작성했으므로, 관계형 테이블을 작성해 보겠다. 애플리케이션에서 제공하는 members.sql 스크립트를 실행하면 된다(다운로드 참조).
  1. 여전히 Data Perspective 내에서 Data Project Explorer 보기의 아무 곳이나 마우스 오른쪽 단추로 클릭하고 New > Data Design Project를 선택한다.
  2. Project name에는 MembersDBProject를 입력한다.
  3. Finish를 클릭한다.
  4. Data Project Explorer에서 새로 작성된 MembersDBProject 프로젝트를 마우스 오른쪽 단추로 클릭하고 Import를 선택한다.
  5. Import dialog 마법사에서 General 폴더를 펼치고 File System을 선택하고 Next를 클릭한다.
  6. "From directory" 텍스트 상자의 오른쪽에 있는 Browse 단추를 클릭하여 Members.sql 파일을 다운로드하고 추출한 위치를 탐색한다. Members.sql을 선택하고 Finish를 클릭한다.
  7. MembersDBProject 프로젝트 폴더에서 SQL Scripts 폴더를 펼친다.
  8. Members.sql을 마우스 오른쪽 단추로 클릭하고 Run SQL을 선택한다.
  9. Select Connection Profile 대화 상자 창의 Connections 목록에서 MembersDB를 선택하고 Finish를 클릭한다.
MemberDB 연결을 통해 Members 데이터베이스에 대한 연결을 탐색하면 APP 스키마에서 새 테이블이 작성되는 것을 알 수 있다.
Identity Value Generation 전략 사용
어떤 테이블의 기본 키에 대한 데이터베이스 생성 값이 있으면(이를 확장하여 관련 테이블에 대한 외부 키를 가질 수도 있음) 애플리케이션에서 이런 값을 가지고 있지 않아도 되므로 부담을 덜게 된다. 즉, 애플리케이션 내부의 지속적 오브젝트에 대한 고유 키 값을 생성할 필요가 없으므로 핵심적인 비즈니스 로직과 비즈니스 규칙에 집중할 수 있다. 이는 애플리케이션의 유지보수 능력과 가독성을 개선하는 긍정적인 결과를 낳는다.
이 시나리에서는 Acme의 데이터 및 애플리케이션 책임 아키텍트가 Identity Value Generation 접근 방식을 통해 다양한 애플리케이션의 비즈니스 로직에서 그런 부담을 제거하려고 한다. 그런 기능을 활용하기 위해, JPA는 엔티티의 ID 속성 할당을 관계형 데이터베이스에 위임할 수 있다.
MembersDB의 관계형 테이블에 있는 기본 키 필드는 Acme 개발자가 취하려는 ID 값 생성 전략을 고수하기 위한 고유 값을 생성하도록 설정된다.
JPA 엔티티를 생성하기 전, EJB 프로젝트와 웹 프로젝트를 포함할 JEE 6.0 Enterprise Application 프로젝트의 시작 부분을 가져와야 한다.
Rational Application Developer로 멤버십 애플리케이션 가져오기
  1. Java EE Perspective로 다시 전환한다.
  2. 빌드할 초기의 EAR 프로젝트를 가져온다.
    1. 메뉴 표시줄에서 File > Import > Java EE > EAR File을 선택한 후 Next를 클릭한다.
    2. Browse 단추를 클릭하고 AcmeMembershipApplication.ear 파일을 저장한 위치를 탐색하고 해당 파일을 선택하여 가져온다.
      중요: Target 런타임의 경우 이전에 작성한 "WebSphere Application Server v8.0 Beta March 2011 Refresh" 서버를 선택해야 한다.
    3. Finish를 클릭한다.
가져오기를 완료하면 프로젝트 레이아웃이 그림 5와 같이 표시된다. 다음 세 가지 새 프로젝트가 있을 것이다.
  • 엔터프라이즈 애플리케이션 프로젝트
  • 해당 웹 모듈 프로젝트
  • EJB 모듈 프로젝트
Markers 보기에 오류가 표시되는 경우 이를 무시해도 된다.

그림 5. Acme의 엔터프라이즈 애플리케이션 프로젝트
Enterprise Explorer 탭 보기에 3개의 프로젝트가 표시됨

EJB 프로젝트에는 새 멤버와 멤버십을 작성하기 위한 JPA 엔티티를 호출할 때 사용할 Stateless 세션 EJB가 있다.
웹 프로젝트에는 비즈니스 로직 호출을 위해 WebSphere Test Environment에서 손쉽게 실행할 수 있는 간단한 단일 서블릿이 있다.
JPA 엔티티 생성
이 섹션에서는 Members 데이터베이스 테이블에서 JPA 엔티티를 생성한다. 이런 JPA 엔티티는 Acme의 멤버십 시스템에 대한 비즈니스 로직의 기초를 제공한다.
우선, JPA 엔티티 Bean을 호스트할 JPA 프로젝트를 작성한다.
  1. JPA Perspective로 전환한다. File > New > JPA Project를 선택하여 New JPA Project 마법사를 표시한다.
  2. 프로젝트 이름에는 AcmeMembershipApplicationDomain을 입력한다.
  3. Add project to an EAR가 선택되어 있는지 확인한 후 Next를 클릭한다.
  4. New JPA Project 마법사의 Java 페이지에서 Next를 다시 클릭한다.
  5. 마법사의 JPA Facet 페이지에 있는 Connection 드롭 다운 목록에서 MembersDB를 선택한다.
  6. Finish를 클릭한다. JPA Perspective로 전환할지 묻는 메시지가 표시되면 Yes를 클릭한다.
JPA 프로젝트를 작성했으므로 JPA 엔티티를 생성할 수 있다.
  1. 새로 작성한 JPA 프로젝트 AcmeMembershipApplicationDomain을 마우스 오른쪽 단추로 클릭하고 JPA Tools > Generate Entities from Tables를 선택한다.
  2. Generate Custom Entities의 Select Tables 페이지에서 다음을 수행한다.
    1. Connection 드롭 다운 목록에서 MembersDB를 선택한다.
    2. 스키마 드롭 다운 목록에서 APP를 선택한다.
    3. Tables 콤보 목록에 나열된 테이블을 전부 선택한다.
    4. Update class list in persistence.xml 선택란을 선택한다.
마법사의 Select Tables 페이지는 그림 6과 같은 모습이어야 한다.

그림 6. JPA 엔티티를 생성할 테이블 선택
Generate Custom Entities 마법사에서 Tables 선택

  1. Next를 클릭한다.
  2. Generate Custom Entities 마법사의 Table Associations 페이지에서는 생성할 엔티티 간의 관계를 생성하고 구체화할 수 있다. 각각의 테이블 연관을 선택하고, 그림 7, 8, 9, 10에 표시된 것과 같은 결과가 나오도록 필요한 편집 및 선택 작업을 한다.
  3. 그런 다음 Next를 클릭한다.
그림 7에 표시된 화면은 가족의 종속 멤버와 가족 멤버십(Family 멤버십) 간에 다대일 관계를 제공하는 속성의 이름을 설정하는 모습이다.

그림 7. Dependent – Membership의 관계 편집
멤버십, 종속 멤버에 대해 모두 계단식으로 선택

그림 8은 기본 멤버와 그 멤버의 Acme Inc. 멤버십 간에 집합 관계를 제공하는 속성의 이름을 설정하는 화면이다.

그림 8. PrimaryMember – Membership에 대한 관계 편집
primaryMember에 대해 모두 계단식 + 선택란

그림 9는 기본 멤버와 그 멤버의 거주지 주소 간에 집합 관계를 제공하는 속성의 이름을 설정하는 화면이다.

그림 9. PrimaryMember – Address에 대한 관계 편집
주소에 대해 모두 계단식 + 선택란

그림 10은 기본 멤버와 그 멤버의 연락처 정보 간에 집합 관계를 제공하는 속성의 이름을 설정하는 화면이다.

그림 10. PrimaryMember - ContactInfo에 대한 관계 편집
contactInfo에 대해 모두 계단식 + 선택란

  1. Generate Custom Entities 마법사의 Customize Default Entity Generation 페이지에서 다음을 수행한다.
    1. Key generator 드롭 다운 목록에서 identity를 선택한다.
      참고: 여기서는 JPA 도메인 클래스의 기본 키 속성에 대한 고유 값을 생성하기 위한 접근 방식으로서 Identity Generation 스키마를 사용하겠다는 의도를 나타내는 것이다.
    2. Entity Access 단일 선택 단추에는 Property를 선택한다.
    3. Collections Property Type 단일 선택 단추에는 java.util.Set을 선택한다.
    4. Package 필드에는 org.acme.membership.domain을 입력한다.
    5. Next를 클릭한다.
  2. Generate Custom Entities 마법사의 Customize Individual Entities 페이지에서는 클래스와 기본 속성 모두에 대해 수많은 특성을 사용자 정의할 수 있다.
    1. Tables and columns 목록 상자에서 Dependent를 펼친다.
    2. Dependent에서 BIRTHDATE 열을 선택한다.
    3. 해당 Mapping type 드롭 다운 목록에서 java.util.Calendar를 선택한다.
  3. PRIMARYMEMBER 테이블에서는 BIRTHDATE 열에 대해, MEMBERSHIP 테이블에서는 LASTRENEWALDATE 및 MEMBERSINCE 열에 대해 5단계를 반복한다.
  4. Finish를 클릭한다.
AcmeMembershipApplicationDomain 프로젝트에서 생성된 JPA 엔티티를 자유롭게 찾아보기 바란다.
JPA 엔티티 조정
추가적인 비즈니스 로직으로 JPA 엔티티를 완성하려면 우선 JPA 엔티티에 대해 몇 가지 조정 및 개선 작업을 해야 한다. 엔티티에 비즈니스 및 애플리케이션 도메인이 더 정확히 반영되도록 하려면 조정 작업이 필요하다.
엔티티 중 일부의 관계가 다대일이 아니라 일대일이 되도록 데이터베이스 해석을 대체한다. 이렇게 해도 멤버십 데이터베이스에 있는 테이블 간의 참조 무결성 또는 기본-외부 키 관계에는 영향을 미치지 않는다. 이렇게 하는 이유는 엔티티 간에 존재하는 비즈니스 규칙과 제한조건을 애플리케이션 로직에 더 엄밀하게 반영하기 위한 것이다.
Acme의 JPA 엔티티를 일대일의 단방향 관계로 조정
Acme의 멤버십 관리를 위한 비즈니스 규칙의 제한조건을 반영하기 위해 JPA 엔티티에 대해 다음과 같은 몇 가지 조정 작업을 수행한다고 가정하자.
  • 몇 가지 관계에 대해 (다대일에서 일대일로) 카디널리티를 좁힌다.
  • 몇 가지 관계에 대해 탐색 유연성을 (양방향에서 단방향으로) 줄인다.
이 두 가지 변경 사항은 모두 애플리케이션을 더 안전하게 하고 Acme의 멤버십 애플리케이션에 대한 비즈니스 규칙을 위반할 가능성을 줄여준다.
관계의 카디널리티 변경
  1. JPA Primarymember 엔티티를 연다.
  2. Java 편집기에서 address 속성을 선택한다.
  3. 그림 11과 같이, JPA Details 보기에서 many to one 하이퍼링크를 선택한다.

그림 11. 관계의 카디널리티 변경
JPA Details 탭 보기

  1. Mapping Type Selection 대화 상자 창에서 One to One을 선택하고 OK를 클릭한다.
  2. JPA Details 보기에서 Optional 선택란을 선택 취소하고 Cascade 옵션에서 All 선택란을 선택한다.
  3. 다음 속성에 대해 1단계에서 5단계까지 반복한다.
    1. PrimaryMember JPA 엔티티의 contactInfo 속성
    2. Membership JPA 엔티티의 primarymember 속성
중요:
5단계에서 JPA 엔티티의 관계가 지닌 특징을 변경하는 것은 아니다. 하지만, 5단계는 (예컨대, 콜렉션과 다른 복잡한 오브젝트의 집합으로 구성된 오브젝트와 같이) 복잡한 오브젝트를 지속적으로 유지하는 데 필수적인 단계이다.
Acme 멤버십 애플리케이션 실행
이제 Rational Application Developer WebSphere Test Environment에 Acme 멤버십 애플리케이션을 배치한다. 새 Family 멤버십을 작성하기 위한 Acme 멤버십 기능을 실행하는 서블릿을 사용한다.
  1. 아직 JPA Perspective에 있는지 확인한 다음, Project Explorer 보기에서 AcmeMembershipApplicationDomain 프로젝트를 선택한다.
  2. 마우스 오른쪽 단추를 클릭하고 JPA Tools > Configure Project for JDBC Deployment를 선택한다.
  3. 그림 12는 "Set up connections for deployment" 대화 상자 창의 기본값을 나타낸 것이다. 기본값이 그림 12에 표시된 것과 사실상 같은지 확인하고, 다른 점이 있다면 그림 6과 일치하도록 필요한 사항을 변경한다.
  4. OK를 클릭한다.

그림 12. "Set up connections for deployment" 대화 상자 보기
Connection 필드에 MembersDB를 선택한 모습

  1. JPA Perspective에서 Java EE Perspective로 다시 전환한다.
  2. Servers 보기에서 WebSphere Application Server v8.0 Beta at localhost를 선택하고, 마우스 오른쪽 단추를 클릭하고, 상황 의존적인 메뉴에서 Add and Remove를 선택한다.
  3. Add and Remove 대화 상자 마법사에서 AcmeMembershipApplication 프로젝트를 선택하고 Add 단추를 클릭한다.
  4. Finish를 클릭한다.
  5. Enterprise Explorer 보기에서 AcmeMembershipApplicationWeb > AcmeMembershipApplicationWeb > Servlets를 펼친다.
  6. CreateMembershipServlet을 마우스 오른쪽 단추로 클릭하고 Run As > Run on Server를 선택한다.
  7. Run On Server 대화 상자 마법사가 나타나면 다음을 수행한다.
    1. WebSphere Application Server v8.0 Beta at localhost를 선택한다.
    2. Always use this server when running this project 선택란을 선택한다(그림 13).
    3. Finish를 클릭한다.

그림 13. Run on Server 대화 상자 창
Always use this server 상자를 선택한 모습

WebSphere Test Environment 서버가 시작된 후, 서블릿이 호출되고 새 멤버십이 작성되었음을 나타내는 웹 페이지가 열린다. Derby 데이터베이스 테이블을 검사하여 새 멤버십 레코드가 추가된 것을 확인할 수 있다.
요약
이 기사에서는 다음과 같은 특성을 가진 Derby 데이터베이스에서 JPA 엔티티를 빠르게 생성하고 사용자 정의하기 위해 Rational Application Developer 도구를 사용했다.
  • Identity Value Generation 기능을 사용하여 고유 기본 키 값을 작성하는 테이블
  • 테이블 간 관계의 특수한 세트
Rational Application Developer 환경에서는 JPA 엔티티를 맞춤형으로 구성할 수 있는 뷰와 편집기를 사용하여 필수 어노테이션을 수동으로 코딩하지 않아도 되므로 생산성을 높일 수 있었다.
마지막으로, Rational Application Developer WebSphere Test Environment 내에 편리하게 임베드한 WebSphere Application Server를 사용하여 애플리케이션을 실행했다.
감사의 인사
저자는 이 기사에 꼼꼼하고 사려 깊은 검토를 한 Mike Reid에 감사의 마음을 표한다.

댓글 없음:

댓글 쓰기