저자 Sean Brydon 및 Yutaka Yoshida

2006년 11월 18일의 테크팁 모델 파사드 사용하기에서는 Java Persistence API를 사용하여 Java EE 5 애플리케이션의 도메인 모델에서 지속성을 유지할 때 복잡성을 야기할 수 있는 몇 가지 요소에 대해 논의했다. 해당 팁에서는 모델 파사드(또는 간단히 "파사드")가 어떻게 해당 복잡성을 줄일 수 있는지에 대해 설명했다. 또한 웹 계층 구성요소로 구현된 파사드와 상호 작용하는 서블릿을 예제로 제공했다. 이 팁에서는 파사드가 EJB(Enterprise JavaBeans) 기술의 세션 빈으로 어떻게 구현될 수 있는지 살펴보자.

세션 빈을 모델 파사드로 사용하는 이유는 무엇인가?

웹 전용 아키텍처를 원하고 EJB 컨테이너를 사용하지 않으려는 경우 파사드를 웹 구성요소로 구현하는 것은 좋은 접근 방법이다. 하지만 EJB 컨테이너를 사용하면 명확한 몇 가지 이점이 있다. 예를 들어, EJB 컨테이너는 컨테이너 관리 트랜잭션에 대한 지원과 같은 서비스를 제공한다. 파사드를 세션 빈으로 구현하면 이러한 지원을 활용할 수 있다. 이 경우 EJB 컨테이너가 트랜잭션을 관리하므로 트랜잭션을 관리하는 코드를 따로 삽입할 필요가 없다.

예제 파사드
이 예제에서는 세션 빈으로 구현된 파사드와 서블릿이 상호 작용한다. EJB 3.0 기술에 친숙하다면 Bean의 클라이언트 뷰를 제공하는 비즈니스 인터페이스를 세션 빈이 필요로 한다는 사실을 알고 있을 것이다. 서블릿은 이 비즈니스 인터페이스를 사용하여 파사드에 액세스한다.

다음은 예제의 파사드에 대한 비즈니스 인터페이스가 어떠한지 보여 준다.

   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 패키지별 클래스를 가져올 필요가 없다. 이러한 단순성이 파사드를 사용하는 주요 이점이다. 모델 계층 개체에 액세스해야 하는 모든 클라이언트 웹 구성요소는 파사드를 통과한다. 파사드는 지속성 개체 관리에 관련될 수 있는 Java Persistence API 또는 Java Transaction API에 대한 세부 정보를 캡슐화한다.

이제 파사드를 살펴보자.

   @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;
     }
   }

파사드에는 유의해야 할 요소가 몇 가지 있다.

  • 무상태이다. @Stateless 주석은 CatalogFacadeBean을 무상태 세션 빈으로 표시한다. 클라이언트 웹 요청 간에 세션 상태를 유지해야 할 경우, 파사드에 대한 상태유지(stateful) 세션 빈을 사용하거나 웹 계층의 HttpSession과 같은 어딘가에 상태를 저장할 수 있다. Java EE 5 애플리케이션에서 파사드를 구현할 때는 무상태 세션 빈이 보다 일반적으로 사용된다.

  • 로컬이다. 무상태 세션 빈은 로컬 또는 원격 개체일 수 있다. 이 예제에서는 원격 액세스 또는 RMI-IIOP 액세스가 필요하지 않으므로 세션 빈은 로컬이다. 무상태 세션 빈은 기본적으로 로컬이므로 로컬이라는 주석을 지정할 필요가 없다.

  • 이 빈은 컨테이너 관리 트랜잭션을 사용한다. CatalogFacadeBean에는 트랜잭션 구분을 위한 코드가 없다. 세션 빈은 EJB 컨테이너의 컨테이너 관리 트랜잭션 서비스를 사용한다. 컨테이너 관리 트랜잭션 서비스 대신 세션 빈이 애플리케이션 관리 트랜잭션을 사용한 경우, Java Transaction API에 대한 호출을 포함하여 각 트랜잭션의 경계를 표시해야 한다.

  • 기본 트랜잭션 동작에 의존한다. 기본적으로 파사드의 각 메소드는 컨테이너가 관리하는 트랜잭션에서 실행된다. 또한 @TransactionAttribute 주석을 "REQUIRED" 값으로 지정하여 이 동작을 얻을 수도 있고 배포 설명자에 동작을 지정할 수도 있다.

  • 컨테이너 관리 엔터티 관리자를 이용한다. 여기서 EJB 컨테이너는 엔터티 관리자의 라이프사이클을 관리한다. @PersistenceContext 주석은 EJB 컨테이너에게 EntityManager 개체를 세션 빈에 삽입하도록 지시한다. 이 Bean이 애플리케이션 관리 엔터티 관리자를 사용한 경우, 엔터티 관리자를 생성 및 삭제하는 코드를 포함해야 한다.

  • Java Persistence 개체를 반환한다. 파사드는 Java Persistence 개체의 사본인 값 개체 또는 데이터 전송 개체를 반환하지 않는다. Java Persistence API의 특징 중 하나는 Java Persistence 개체가 컨테이너에 의해 관리될 수 있으며 POJO(Plain Old Java Object)로 사용될 수 있으므로 사실상 이러한 개체는 파사드의 클라이언트에 의해 POJO로 사용된다는 점이다. 웹 구성요소 클라이언트가 도메인 모델로부터 보다 느슨하게 결합되어야 하는 경우도 있다. 이 경우에는 모델 계층을 나타내는 POJO와는 다른 개체를 사용하도록 선택할 수 있다. 하지만 이 예제에서 Item POJO는 웹 계층에서 사용되기에 충분하다. 따라서 프로그래밍 모델이 상대적으로 단순해진다.

  • 애플리케이션 예외를 throw한다. 사용자가 항목에 대한 이름을 지정하지 않은 경우 세션 빈은 적절한 수정 조치 메시지를 사용하여 InvalidItemException을 throw한다. InvalidItemException은 시스템 예외와는 다른 애플리케이션 예외의 예이다. EJB에서 애플리케이션 예외는 애플리케이션 개발자에 의해 정의되고 애플리케이션 비즈니스 논리의 일부로 간주된다.

  • generics를 사용한다. 메소드 선언 공용 List<Item> getAllItems는 generics를 사용하여 ListItem 유형의 컬렉션으로 지정한다. generics는 컬렉션의 유형을 전달하여 Java 컴파일러가 점검할 수 있도록 하는 방법을 제공한다. generics를 사용하면 메소드 선언의 읽기와 이해가 더욱 수월해진다.

파사드 사용하기

이제 파사드 예제를 사용하는 서블릿을 살펴보자.

   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);
         ...        
       }
       ...
   }

서블릿은 @EJB 주석을 통해 의존성 삽입을 사용하여 파사드를 조회하거나 얻는다. 파사드는 다른 클라이언트 요청에 의해 공유 및 사용될 수 있도록 필드 등으로 저장된다.

파사드를 사용하면 서블릿이 엔터티의 세부사항 및 엔터티 액세스에 필요한 지속성 작업으로부터 보호된다.

Java Server Faces 기술로 세션 빈 파사드 사용하기

이 팁과 함께 제공된 샘플 코드에서 서블릿은 파사드를 통해 모델 계층에서 Java Persistence 개체에 액세스한다. 하지만 JavaServer Faces(또는 JSF) 기술 구성요소를 웹 구성요소로 사용할 수도 있다. 이 접근 방법에서는 각 JSF 페이지가 일반적으로 JSF 관리 빈(또는 Backing Bean)에 액세스한다. 그리고 관리 빈은 세션 빈의 인터페이스를 사용하여 세션 빈 파사드에 액세스한다. 이것은 JSF 및 EJB 3.0을 사용하는 Java EE 5 애플리케이션에 대한 예상 프로그래밍 모델이다.

다음 다이어그램은 이 접근 방법을 보여 준다.

JSFwithFacade3

샘플 코드 실행하기

이 팁과 함께 제공된 샘플 패키지에는 세션 빈으로 구현된 모델 파사드가 포함된다. 샘플을 설치하고 실행하려면 다음 단계를 수행한다.

  1. Java EE 5 SDK가 없으면 Java EE Downloads 페이지에서 Java EE 5 SDK를 다운로드한다. Java Platform Standard Edition (Java SE) 5 SDK가 설치되어 있는지도 확인한다.

  2. 팁에 대한 샘플 패키지를 다운로드하고 해당 컨텐츠의 압축을 푼다. 이제 압축이 풀린 디렉토리가 <sample_install_dir>/ttfeb2007beanfacade과 같이 나타난다. 여기서 <sample_install_dir>는 샘플 패키지를 설치한 디렉토리이다. 예를 들어, Windows 시스템의 C:\ 경로에 해당 컨텐츠의 압축을 풀었다면 새로 생성된 디렉토리는 C:\ttfeb2007beanfacade이 되어야 한다. ttfeb2007beanfacade 아래의 TechTipEJBSessionfacade 디렉토리에는 샘플에 대한 소스 파일과 기타 지원 파일이 있다.

  3. TechTip-EJBsessionfacade 디렉토리의 bp-project 하위 디렉토리에서 build.properties 파일을 편집하고 사용자 환경에 맞게 등록 정보를 설정한다. 예를 들어, javaee.home이 Java EE 5 설치 디렉토리를 가리키도록 설정한다.

  4. 다음 명령을 입력하여 더비 데이터베이스를 시작한다.

       <appsrv_install>/bin/asadmin start-database

    여기서 <appsrv_install>은 Java EE 5 애프리케이션 서버가 설치된 경로이다.

  5. 다음 명령을 입력하여 애플리케이션 서버를 시작한다.

       <appsrv_install>/bin/asadmin start-domain domain1

  6. TechTip-EJBsessionfacade 디렉토리로 변경하고 다음 명령을 입력한다.

       ant setup

    그러면 데이터베이스 자원이 설정된다.

  7. 다음 명령을 입력한다.

       ant run

    그러면 샘플 애플리케이션이 빌드되고 http://localhost:8080/bp-sessionfacade에서 배포 및 실행된다.

    이 애플리케이션은 Java BluePrints Solutions Catalog에서 가져온 Java Persistence 샘플 애플리케이션이다.

EJBFacadePage

표시된 페이지에 있는 링크를 클릭하여 카탈로그에서 항목을 검색하거나 추가한다. 애플리케이션에 대한 소스를 살펴보면 EJB 세션 빈이 카탈로그에서 지속적 엔터티에 대한 작업의 모델 파사드로 사용된다는 것을 알 수 있다.

애플리케이션에 대한 작업이 끝나면 다음 명령을 입력하여 이를 제거할 수 있다.

   ant clean - 애플리케이션 작업 공간을 정리한다.
   ant undeploy -      application server에서 애플리케이션을 배포 해제한다.
   ant unsetup -      application server에서 데이터베이스 자원을 정리한다.


요약

Java Persistence API를 사용하는 Java EE 5 웹 애플리케이션을 빌드할 경우, 모델 파사드를 도입하여 코드의 리팩터링을 고려하십시오.

파사드 및 Java Persistence API에 대한 자세한 내용은 다음을 참조하십시오.




글쓴이 정보

Sean Brydon은 Sun Microsystems에서 Java BluePrints 프로그램에 대한 기술 팀장을 맡고 있는 엔지니어입니다. 그는 Java BluePrints의 시초부터 관련 업무를 맡아 왔습니다. 그는 Addison-Wesley Java 시리즈 도서인 "Designing Enterprise Applications with the Java 2 Platform, Enterprise Edition" 및 "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" 카테고리의 다른 글

2007/04/10 11:30 2007/04/10 11:30

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/362

댓글을 달아 주세요

  1. 고진구  수정/삭제  댓글쓰기

    자바는 알면 알수록 재미가 있어지네요. 좋은 자료 잘 활용하겠습니다.

    2007/09/13 22:41
  2. 김문경  수정/삭제  댓글쓰기

    좋은 글 감사합니다

    2007/09/17 21:57
  3. 박정숙  수정/삭제  댓글쓰기

    좋은 정보 감사해요~

    2007/09/19 03:47
  4. 진정미  수정/삭제  댓글쓰기

    좋은 정보 많이 배우고 가요 ^^

    2007/09/19 23:06
[로그인][오픈아이디란?]

◀ Prev 1  ... 278 279 280 281 282 283 284 285 286  ... 626  Next ▶