|
이번 호의 내용
2007년 2월 24일 Enterprise Java Technologies Tech Tips입니다. 여기서는 Java Platform Enterprise Edition(Java EE) 등에 있는 Enterprise Java 기술 및 API 사용에 대한 팁을 얻을 수 있습니다. 이번 호에서는 다음 사항을 다룹니다. 이 팁은 Java EE 5 SDK를 사용하여 개발되었습니다. Java EE 다운로드 페이지에서 SDK를 다운로드할 수 있습니다. EJB 3.0과 EJB 2.x의 상호 운용성 팁에 관련된 예제 아카이브를 다운로드할 수 있습니다. EJB Session Bean을 Model Facade로 사용하기 팁에 대한 예제 아카이브를 다운로드할 수 있습니다. 이 코드 및/또는 아래의 정보에 대한 모든 사용은 사용권 조항의 적용을 받습니다.
EJB(Enterprise JavaBeans) 3.0 사양에서는 Session Bean 구현 및 액세스에 필요한 새롭고 간편해진 API를 소개합니다. 수많은 개발자들은 이 새로운 API에 작성된 응용 프로그램이 레거시 EJB 응용 프로그램과 상호 작용할 수 있도록 하는 방법이나 레거시 응용 프로그램이 새로운 API와 상호 작용할 수 있도록 하는 방법에 대해 알고 싶어합니다. 새 기능을 활용하기 위해 기존의 모든 EJB 응용 프로그램을 완전히 다시 작성하도록 개발자에게 요구하는 것은 비실용적일 것입니다. 일부 경우 개발자가 응용 프로그램 업그레이드 계획은 있지만 단계적 방법을 통해 업그레이드하기를 원할 수도 있습니다. 다른 경우 개발자가 새 EJB 3.0 응용 프로그램 작성을 선호하지만 기존 응용 프로그램 서비스를 계속해서 활용하기를 원할 수도 있습니다. EJB 3.0 사양을 통해 이러한 두 가지 전략이 모두 가능할 수 있습니다. 이 팁에서는 그 방법에 대해 설명합니다. 예제 응용 프로그램 패키지는 팁과 함께 제공됩니다. 팁에 있는 코드 예제는 패키지에 포함된 예제의 소스 코드에서 가져온 것입니다. 예제는 Java EE 5 SDK를 사용합니다. Java EE 다운로드 페이지에서 Java EE 5 SDK를 다운로드할 수 있습니다. EJB 3.0에서 EJB 2.x로의 호환성
먼저, 레거시 EJB 응용 프로그램을 호출하는 단순화된 EJB 3.0 API에 작성된 응용 프로그램의 예제를 살펴보도록 하겠습니다. 이 팁과 함께 제공되는 예제의 소스 코드에서 public interface EJB2xHome extends EJBHome { public EJB2xRemote create() throws CreateException, RemoteException; } public interface EJB2xRemote extends EJBObject { public void foo() throws RemoteException; } MigrationBean 클래스의 첫 번째 부분은 다음과 같습니다. @Stateless public class MigrationBean implements MigrationRemote { // Inject a reference to the Home interface // of the EJB 2.x bean. @EJB private EJB2xHome ejb2xHome; private EJB2xRemote ejb2x;
@PostConstruct private void initialization() { try { ejb2x = ejb2xHome.create(); } catch(Exception e) { throw new EJBException(e); } } 클래스의 마지막 부분에서 MigrationBean이 EJB2x 비즈니스 메소드를 자체 비즈니스 메소드 안에서 호출합니다. public void bar() { try { // Call operation on legacy EJB. ejb2x.foo(); } catch(Exception e) { throw new EJBException(e); } } 보안 및 트랜잭션 전달과 같은 모든 표준 EJB 서비스는 두 Bean 사이에서 예상대로 작동합니다.
EJB 2.x에서 EJB 3.0으로의 호환성 첫 번째 예제에서 새로운 EJB 3.0 API를 사용하여 작성된 EJB 구성 요소가 레거시 EJB 구성 요소의 클라이언트가 될 수 있는 방법을 살펴보았습니다. 이번에는 반대 경우를 살펴보도록 하겠습니다. 여기서는 EJB 2.x 클라이언트 API를 사용하여 코드화된 레거시 구성 요소가 단순화된 EJB 3.0 API를 사용하여 구현된 Session Bean에 액세스하는 방법을 확인할 수 있습니다. 이 아이디어는 기존 EJB 클라이언트 코드를 변경하지 않고 새로운 EJB를 사용하기 위한 것입니다.
두 번째 예제에서 단순화된 EJB 3.0 API를 사용하여 public interface AdaptedHome extends EJBHome { public AdaptedRemote create(String id) throws CreateException, RemoteException; } public interface AdaptedRemote extends EJBObject { public String getId() throws RemoteException; } AdaptedBean 클래스는 다음과 같습니다. @Stateful @RemoteHome(AdaptedHome.class) public class AdaptedBean { private String myId = "unknown"; @Init public void create(String id) { myId = id; } public String getId() { return myId; } }
Bean 클래스는 POJO와 유사한 EJB 3.0의 단순화를 통해 구현됩니다. 그러나 EJB 2.x 스타일의 원격 홈 인터페이스를 표시하는 데는
클래스에 있는 또 다른 중요 주석은
try { InitialContext ic = new InitialContext(); Object o = ic.lookup(AdaptedHome.class.getName()); AdaptedHome adaptedHome = (AdaptedHome) PortableRemoteObject.narrow(o, AdaptedHome.class); AdaptedRemote adapted = adaptedHome.create("duke"); System.out.println("Adapted id = " + adapted.getId()); } catch(Exception e) { ... } 클라이언트 코드는 표준 EJB 2.x 클라이언트 프로그래밍 모델을 사용합니다. 대상 Bean이 EJB 3.0으로 구현된다는 점을 알 필요는 없습니다. 예제 코드 실행 예제 패키지는 이 팁과 함께 제공됩니다. 예제를 설치하고 실행하려면 다음을 수행합니다.
요약 EJB 3.0 사양에서는 Session Bean API가 매우 단순화됩니다. 그러나 이러한 단순화는 이 사양의 이전 버전을 사용하여 작성된 EJB 응용 프로그램에 대한 많은 투자를 조건으로 이루어집니다. 이러한 이유로 EJB 3.0의 목표는 새 응용 프로그램과 기존 응용 프로그램 간의 원활한 상호 운용성을 보장하는 것입니다. EJB 3.0을 사용하는 개발자라면 레거시 응용 프로그램을 새로운 API로 마이그레이션할 것인지, 아니면 새로운 구성 요소로부터 해당 레거시 응용 프로그램을 이용할 것인지에 대해 유연하게 판단할 수 있습니다. 저자 정보 Ken Saks는 Java EE 5 SDK의 EJB 3.0 컨테이너를 설계한 수석 설계자입니다. 1999년부터 Sun Microsystems의 Enterprise Java 그룹의 멤버로 활동하고 있습니다.
2006년 11월 18일 테크 팁인 Model Facade 사용하기에서는 Java Persistence API를 사용하여 Java EE 5 응용 프로그램의 도메인 모델의 지속성을 관리할 때 복잡성을 유발할 수 있는 요소에 대해 논의했습니다. 또한 Model Facade(또는 줄여서 "Facade")를 통해 복잡성을 줄일 수 있는 방법에 대해서도 알아보았습니다. 이전 팁에서는 웹 계층 구성 요소로 구현되는 Facade와 상호 작용하는 서블릿이 예제로 사용되었습니다. 이번 팁에서는 Facade가 EJB(Enterprise JavaBeans) 기술 Session Bean으로 구현되는 방법을 살펴볼 수 있습니다. Session Bean을 Model Facade로 사용하는 이유 웹 전용 아키텍처가 필요하고 EJB 컨테이너를 사용하지 않으려는 경우, Facade를 웹 구성 요소로 구현하는 것은 좋은 접근방식이 됩니다. 그러나 EJB 컨테이너를 사용하면 그와 다른 별개의 이점을 얻을 수 있습니다. 예를 들어 EJB 컨테이너는 컨테이너 관리 트랙잭션 지원과 같은 서비스를 제공합니다. Facade를 Session Bean으로 구현할 경우 이러한 지원을 활용할 수 있습니다. 그럴 경우 EJB 컨테이너가 트랜잭션을 관리하므로 사용자가 트랜잭션 관리를 위해 코드를 포함할 필요가 없습니다. 예제 Facade 이 예제에서는 Session Bean으로 구현되는 Facade가 서블릿과 상호 작용합니다. EJB 3.0 기술에 익숙할 경우, Session Bean에 Bean의 클라이언트 보기를 제공하는 비즈니스 인터페이스가 필요하다는 점을 알고 있을 것입니다. 서블릿은 이 비즈니스 인터페이스를 사용하여 Facade에 액세스합니다. 예제의 Facade에 대한 비즈니스 인터페이스는 다음과 같습니다. import java.util.List; import com.sun.javaee.blueprints.sessionfacade.InvalidItemException; import com.sun.javaee.blueprints.sessionfacade.model.Item; public interface CatalogFacade { public void addItem(Item item)throws InvalidItemException; public Item getItem(int itemID); public List<Item> getAllItems(); }팁과 함께 제공되는 예제 응용 프로그램 패키지에 있는 이 팁에서, 다른 코드 예제와 함께 비즈니스 인터페이스용 소스 코드를 찾을 수 있습니다. 이 인터페이스는 매우 단순합니다. 그러나 이러한 단순성에도 불구하고 클라이언트 서블릿이 이 웹 응용 프로그램 모델 계층에 액세스하는 데 필요한 모든 정보가 이 인터페이스에 포함되어 있습니다. 또한 모든 EJB 3.0 비즈니스 인터페이스와 마찬가지로, EJB 패키지에 대한 클래스를 가져올 필요가 없습니다. 이러한 단순함이 Facade를 사용할 때 얻을 수 있는 가장 큰 이점입니다. 모델 계층 객체에 액세스해야 하는 모든 클라이언트 웹 구성 요소는 Facade를 통과해야 합니다. Facade는 Persistence 객체 관리에 연관될 수 있는 모든 Java Persistence API 및 Java Transaction API 관련 세부 정보를 캡슐화합니다. 이제 Facade를 살펴보도록 하겠습니다. @Stateless public class CatalogFacadeBean implements CatalogFacade { @PersistenceContext(unitName="CatalogPu") private EntityManager em; public void addItem(Item item) throws InvalidItemException { if(item.getName().length() == 0) throw new InvalidItemException("The item" + " name cannot be empty." + " Please specify a name for the item. "); em.persist(item); } public Item getItem(int itemID) { Item item = em.find(Item.class,itemID); return item; } public List<Item> getAllItems() { List<Item> items = em.createQuery( "SELECT OBJECT(i) FROM Item i").getResultList(); return items; } }
Facade에는 주의해야 할 사항이 몇 가지 있습니다.
Facade 사용하기 이제 예제 Facade를 사용하는 서블릿을 살펴보도록 하겠습니다. public class CatalogServlet extends HttpServlet { @EJB private CatalogFacade cf; ... public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... if ("additem.do".equals(selectedURL)) { //get values from request and place // them into new Item String desc = request.getParameter("item_desc"); String name = request.getParameter("item_name"); ... Item item = new Item(); item.setName(name); item.setDescription(desc); ... //use facade to add new Item to database cf.addItem(item); ... } ... }
서블릿은 Facade를 사용하면 서블릿이 엔티티의 세부 사항 및 엔티티 액세스에 필요한 지속성 작업으로부터 보호됩니다. Java Server Faces 기술로 Session Bean Facade 사용하기 이 팁과 함께 제공된 예제 코드에서는 서블릿은 Facade를 통해 모델 계층에서 Java Persistence 객체에 액세스합니다. 그러나 JavaServer Faces 기술(또는 JSF) 구성 요소를 웹 구성 요소로 사용할 수도 있습니다. 이 접근방식에서는 각 JSF 페이지가 일반적으로 JSF 관리 Bean(또는 Backing Bean)에 액세스합니다. 그런 다음 관리 Bean은 Session Bean의 인터페이스를 사용하여 Session Bean Facade에 액세스합니다. 이는 JSF 및 EJB 3.0을 사용하는 Java EE 5 응용 프로그램에 대한 예상 프로그래밍 모델입니다. 다음 그림은 이 접근방식에 대해 보여 줍니다.
예제 코드 실행 이 팁과 함께 제공되는 예제 패키지에는 Session Bean으로 구현된 Model Facade가 포함됩니다. 예제를 설치하고 실행하려면 다음을 수행합니다.
표시된 페이지에 있는 링크를 클릭하여 카탈로그에서 항목을 찾거나 추가합니다. 응용 프로그램 소스를 살펴보면 EJB Session Bean이 카탈로그에서 지속성 엔티티에 대한 작업의 Model Facade로 사용된다는 것을 확인할 수 있습니다. 응용 프로그램에 대한 작업을 완료했으면 다음 명령을 입력하여 이를 제거할 수 있습니다. ant clean - 응용 프로그램 작업 공간을 정리합니다. ant undeploy - 응용 프로그램 서버에서 응용 프로그램을 배포 해제합니다. ant unsetup - 응용 프로그램 서버에서 데이터베이스 자원을 정리합니다.요약 Java Persistence API를 사용하는 Java EE 5 웹 응용 프로그램을 작성하는 경우, Model Facade를 도입하여 코드의 리팩터링을 고려하십시오. Facade 및 Java Persistence API에 대한 추가 정보는 다음을 참조하십시오.
Sean Brydon은 Sun Microsystems에서 Java BluePrints 프로그램에 대한 기술 팀장을 맡고 있는 엔지니어입니다. Java BluePrints의 개발 초기부터 관련 업무를 맡아 왔습니다. 그는 Addison-Wesley Java 시리즈 도서인 "Java 2 Platform Enterprise Edition으로 엔터프라이즈 응용 프로그램 설계하기(Designing Enterprise Applications with the Java 2 Platform, Enterprise Edition)" 및 "J2EE 1.4 플랫폼으로 웹 서비스 설계하기(Designing Web Services with the J2EE 1.4 Platform)"의 저자이며 엔터프라이즈 응용 프로그램 설계에 대해 정기적으로 발표하고 있습니다. 또한 Sean은 Java Pet Store 2.0 참조 응용 프로그램 및 Java BluePrints Solutions Catalog의 설계 및 개발에 관여해 왔습니다. Yutaka Yoshida는 Servlet 2.4 사양을 전담했으며 현재 Java BluePrints 프로젝트에 참여하고 있습니다. 그는 Java Adventure Builder 참조 응용 프로그램, Java BluePrints Solutions Catalog 및 Java Pet Store 2.0 참조 응용 프로그램의 설계 및 개발에 관여해 왔습니다. 개발자 지원
Java EE 프로그래밍 관련 조언이 필요하십니까? 개발자 전문가 지원을 참조하십시오. Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License. |
BigAdmin SubscriptionsBigAdmin Areas
BigAdmin Sun Center
BigAdmin Topics | |||||||||