IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  XML | 자바  >

팁: JBoss 4에서 JBoss 5로 마이그레이션하기

XML 구성 변경을 이용한 간편한 방법

developerWorks
문서 옵션
PDF format - Fits A4 and Letter

PDF - Fits A4 and Letter
29KB (8 pages)

Get Adobe® Reader®

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

영어원문

영어원문


제안 및 의견
피드백

난이도 : 중급

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의 저자이며 네트워크 관리와 기타 주제에 대한 여러 기사를 집필했다.




기사에 대한 평가


보다 나은 서비스를 제공하기 위함이오니 잠시 짬을 내어 이 양식을 제출하여 주십시오.



 


 


 


이 문서 북마킹 하기

mar.gar.in mar.gar.in naver naver eolin eolin del.icio.us del.icio.us





위로


IBM, IBM 로고, ibm.com, DB2, developerWorks, Lotus, Rational, Tivoli 및 WebSphere는 미국 또는 기타 국가에서 사용되는 International Business Machines Corporation의 상표 또는 등록 상표이다. 이와 함께 기타 IBM 상표가 기재된 용어가 상표 기호(® 또는 ™)와 함께 이 정보에 처음 표시된 경우, 이와 같은 기호는 이 정보를 발행할 때 미국에서 IBM이 소유한 등록 상표 또는 일반 법적 상표이다. 또한 이러한 상표는 기타 국가에서 등록 상표 또는 일반 법적 상표이다. 현재 IBM 상표 목록은 웹 "저작권 및 상표 정보"에 있다. Adobe, Adobe 로고, PostScript 및 PostScript 로고는 미국 또는 기타 국가에서 사용되는 Adobe Systems Incorporated의 상표 또는 등록 상표이다. Java 및 모든 Java 기반 상표와 로고는 미국 또는 기타 국가에서 사용되는 Sun Microsystems, Inc.의 상표이다. 기타 회사, 제품 및 서비스 이름은 해당 회사의 상표 또는 서비스표이다. 기타 회사, 제품, 및 서비스명은 다른 상표나 서비스 마크일 수 있습니다.

developerWorks 콘텐트를 다른 사이트에 전재하기:
developerWorks 콘텐트에 대한 저작권은 IBM에 있습니다. IBM의 서면 허가나 원본 저자의 허락이 없이는 전재를 금합니다. 저희 콘텐트를 전재하시려면 IBM developerWorks 담당자 에게 문의하십시오.
    IBM 소개 개인정보 보호정책 문의