 |
|
난이도 : 중급 Stephen B. Morris, Consultant, Omey Communications
원문 게재일 : 2009 년 7 월 21 일 번역 게재일 : 2009 년 9 월 08 일 EJB 코드를 JBoss 5로 마이그레이션하고 싶습니까? 전개 및 실행에 필요한
코드를 구할 수 없습니까? 그렇다면 이 팁을 활용하십시오. 혹은 JBoss 5를 처음 접해본
사용자로서 EJB 3 환경에 빠르게 적응하고 싶습니까? 이 팁에서는 JBoss 5에서 EJB 3
코드를 작성, 전개 및 실행하는 데 필요한 XML 전개 파일에 대해 자세히 설명합니다.
 |
자주 사용하는 약어
- EJB: Enterprise Java Bean
- JDK: Java Development Kit
- XML: Extensible Markup Language
|
|
필자의 경험으로는 Java™ 소스 코드를 작성할 때 문제가 발생할 수 있다는 가능성을
항상 염두에 두고 있어야 한다. 물론 이번에도 EJB 3 코드를 JBoss 5에서 실행하는 중에 몇 가지
문제가 발생했지만 모두 해결할 수 있었다. 이 기사에서는 당시에 발생한 문제와 그 해결 방법에
대해 설명한다. 이 기사를 따라서 수행하려면 JBoss 버전 4 및 버전 5(참고자료
참조)를 모두 설치하는 것이 좋다. 또한 JDK 버전 1.5가 설치되어 있어야 하고 JAVA_HOME 변수에
설치 폴더가 지정되어 있어야 한다(예: JAVA_HOME= C:\java\jdk1.5.0_06).
업그레이드 경로 문제
마이그레이션을 시작하기 전에 먼저 JBoss4에서 실행되고 있는 EJB 3 코드를 살펴보자. Listing
1에서는 GreetingCard라는 간단한 EJB 3 엔터티 클래스를 보여 준다.
Listing 1. EJB3 GreetingCard 클래스
@Entity
@Table(name="GREETING_CARD")
public class GreetingCard implements java.io.Serializable
{
private int id;
private String greeting;
private int colour;
@Id
@Column(name="ID")
public int getId()
{
return id;
}
public void setId(int pk)
{
id = pk;
}
@Column(name="NAME")
public String getGreeting()
{
return greeting;
}
public void setGreeting(String str)
{
greeting = str;
}
@Column(name="COLOUR")
public int getColour()
{
return colour;
}
public void setColour(int colour)
{
this.colour = colour;
}
} |
Listing 2에서는 상태 비저장 Bean 클래스를 보여 준다.
Listing 2. 상태 비저장 엔터티 Bean
@Stateless
public class CardShopBean implements CardShopRemote
{
@PersistenceContext(unitName="cardshop") private EntityManager manager;
public void createGreetingCard(GreetingCard greetingCard)
{
manager.persist(greetingCard);
}
public GreetingCard findGreetingCard(int pKey)
{
return manager.find(GreetingCard.class, pKey);
}
public void removeGreetingCard(GreetingCard greetingCard)
{
manager.remove(greetingCard);
}
public void flushGreetingCard()
{
manager.flush();
}
public void mergeGreetingCard(GreetingCard greetingCard)
{
manager.merge(greetingCard);
}
} |
이 코드는 Listing 3의 간단한 program 클래스에서 실행된다.
Listing 3. 코드 실행하기
public static void main(String [] args)
{
try
{
Context jndiContext = getInitialContext();
Object ref = jndiContext.lookup("CardShopBean/remote");
CardShopRemote dao = (CardShopRemote)ref;
GreetingCard oldGreetingCard = dao.findGreetingCard(1);
if (oldGreetingCard != null)
{
dao.mergeGreetingCard(oldGreetingCard);
dao.removeGreetingCard(oldGreetingCard);
dao.flushGreetingCard();
}
GreetingCard greetingCard_1 = new GreetingCard();
greetingCard_1.setId(1);
greetingCard_1.setGreeting("Seasons Greetings from Terry Dactyll");
greetingCard_1.setColour(1);
dao.createGreetingCard(greetingCard_1);
GreetingCard greetingCard_2 = dao.findGreetingCard(1);
System.out.println("Greeting card name: " + greetingCard_2.getGreeting());
System.out.println("Greeting card colour: " + greetingCard_2.getColour());
}
catch (javax.naming.NamingException ne)
{
ne.printStackTrace();
}
}
|
이 코드를 JBoss 버전 4에서 실행하면 Listing 4와 같은 클라이언트측 결과가 발생한다.
Listing 4. JBoss 4에서 EJB 3 실행하기
ant run.client
Buildfile: build.xml
run.client:
[java] Greeting card name: Seasons Greetings from Terry Dactyll
[java] Greeting card colour: 1
BUILD SUCCESSFUL
Total time: 10 seconds
|
지금까지는 평범한 내용이었다. 이제 같은 코드를 JBoss 5에서 실행해보자. 두 환경 간에 이동하는
작업은 상당히 쉬운 편이다. 먼저 JBOSS_HOME 환경 변수의 값을 수정한다. 필자의 시스템을 예로 들면,
JBOSS_HOME=C:\java\jboss4\JEMS-jboss-4.0.5.GA를 JBOSS_HOME=C:\java\jboss5\jboss-5.0.0.GA로 변경한다.
이제 ant -p를 실행하면 Listing 5와 같은 결과가
발생한다.
Listing 5. JBoss 5의 경로 문제
build.xml:35: C:\java\jboss5\jboss-5.0.0.GA\server\default\deploy\ejb3.deployer not found.
|
Listing 6에서 보여 주는 약간 변경된 build.xml은 Listing 5의 문제를 해결한다.
Listing 6. build.xml의 첫 번째 변경 사항
<fileset dir="${jboss.home}/server/default/deployers/ejb3.deployer">
|
ant -p를 다시 실행하면 비슷한 오류가 또 하나 발생한다(Listing 7 참조).
Listing 7. 또 다른 경로 문제
build.xml:35:
C:\java\jboss5\jboss-5.0.0.GA\server\default\deploy\jboss-aop-jdk50.deployer
not found.
|
앞의 변경과 마찬가지로 이 문제도 쉽게 해결된다(Listing 8 참조).
Listing 8. build.xml의 두 번째 변경 사항
<fileset dir="${jboss.home}/server/default/deployers/jboss-aop-jboss5.deployer">
|
이제 ant -p를 실행하면 아무 문제도 발생하지 않는다. 드디어 JBoss 5에서
EJB 3 코드를 작성할 시간이 되었다. 하지만 아쉽게도 ant compile을 실행하면
Listing 9와 같은 문제가 발생한다. (Listing 9는 실제 출력의 일부이다.)
Listing 9. 컴파일 문제
ant compile
compile:
[javac] Compiling 4 source files to C:\java\jbossmigration\mycode-jboss5\build\classes
[javac] C:\java\jbossmigration\mycode-jboss5\src\main\com\cardsrus\cardshop\
CardShopBean.java:3: package javax.ejb does not exist
[javac] import javax.ejb.Stateless;
[javac] ^
[javac] C:\java\jbossmigration\mycode-jboss5\src\main\com\cardsrus\cardshop\
CardShopBean.java:4: package javax.persistence does not exist
[javac] import javax.persistence.EntityManager;
[javac] ^
|
Listing 9의 문제는 라이브러리 가져오기가 누락되었기 때문에 발생한
것이다. 이 문제를 해결하려면 Listing 10과 같은 변경 사항을 build.xml에
추가해야 한다. Listing 10의 코드를 클래스 경로 생성 대상의 <fileset>
요소에 추가한다.
Listing 10. 라이브러리 가져오기 추가하기
<fileset dir="${jboss.home}/common/lib">
<include name="*.jar"/>
</fileset>
|
Listing 10의 변경 사항을 적용하면 Java 코드가 성공적으로 컴파일된다. 그렇다면
코드가 JBoss 5에 전개되었는가? 아쉽게도 Listing 11의 서버측 로그에서 볼 수 있듯이
코드가 전개되지 않았다.
Listing 11. 전개 문제
16:44:03,093 ERROR [AbstractKernelController]
Error installing to Parse:
name=vfszip:/C:/java/jboss5/jboss-5.0.0.GA/server/default/deploy/cardsrus.jar
state=Not Installed mode=Manual requiredState=Parse
org.jboss.deployers.spi.DeploymentException: Error creating managed object for
vfszip:/C:/java/jboss5/jboss-5.0.0.GA/server/default/deploy/cardsrus.jar at
org.jboss.deployers.spi.DeploymentException.rethrowAsDeploymentException
(DeploymentException.java:49) at
org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.
createMetaData (AbstractParsingDeployerWithOutput.java:337)
|
전개 문제를 해결하려면 Listing 12와 같이 persistence.xml 파일을 수정해야 한다. 원래
persistence.xml 파일에서 <persistence> 행을 Listing 12의 내용으로 바꿔야 한다.
Listing 12. persistence.xml 수정 사항
<persistence
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0" >
|
Listing 12의 변경 사항을 적용하고 나면 코드가 JBoss 5에 전개 및 실행된 후
Listing 4에서 보았던 것과 비슷한 클라이언트 출력이 표시된다.
드디어 EJB 3 코드를 JBoss 4에서 JBoss 5로 마이그레이션하는 작업이 모두 완료되었다.
결론
EJB 3 코드를 JBoss 4에서 JBoss 5로 마이그레이션하는 작업은 간단한 작업이 아니기 때문에 필요한
코드 변경 사항의 일부 또는 전체를 자동화할 수 있는 Eclipse 플러그인과 같은 마이그레이션 도구가
필요할 수 있다. 그때까지는 이 기사가 마이그레이션 작업에 쉽게 수행하는 데 많은 도움이 될 수 있기를
바란다.
참고자료 교육
제품 및 기술 얻기
토론
필자소개  | |  | Stephen Morris는 아일랜드에 거주하며 독립적으로 활동하는 작가겸 컨설턴트이다. 엔터프라이즈
개발 및 네트워크 애플리케이션과 관련된 폭넓은 경험을 가지고 있으며 세계에서 가장
큰 몇몇 네트워크 회사를 위해 Java EE 및 J2SE 기반 네트워크 관리 시스템, 청구
애플리케이션, 회계 시스템, SNMP 엔터티 이식/개발, 네트워크 장치 기술, 여러 모바일
컴퓨팅 애플리케이션 등과 관련된 프로젝트를 수행했다. 컴퓨터 과학 석사인 그는
네트워크 관리 분야에서 세 가지 특허를 소유하고 있다. Moving Your Career Up the
Value Chain: Building Specialized Development Skills in a Global Economy의 저자이며
네트워크 관리와 기타 주제에 대한 여러 기사를 집필했다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|