SeamFramework.orgCommunity Documentation

13장. Java EE 통합

13.1. Java EE 리소스를 Web Bean으로 삽입
13.2. Servlet에서 Web Bean 호출
13.3. Message-Driven Bean에서 Web Bean 호출
13.4. JMS 엔드포인트
13.5. 패키징 및 배포

Web Beans는 Java EE 환경으로 완전 통합됩니다. Web Beans는 Java EE 리소스 및 JPA 지속성 컨텍스트로 액세스합니다. 이는 JSF 및 JSP 페이지에서 Unified EL 표현식으로 사용될 수 있습니다. 이는 Web Beans가 아닌 Servlets 및 Message-Driven Beans와 같은 일부 객체로 삽입될 수 도 있습니다.

모든 엔터프라이즈 Web Beans는 @Resource, @EJB, @PersistenceContext를 사용하여 Java EE 의존성 삽입의 장점을 취할 수 있습니다. 이미 이에 대한 몇몇 예를 살펴보았습니다:

@Transactional @Interceptor

public class TransactionInterceptor {
    @Resource Transaction transaction;
    @AroundInvoke public Object manageTransaction(InvocationContext ctx) { ... }
    
}
@SessionScoped

public class Login {
    @Current Credentials credentials;
    @PersistenceContext EntityManager userDatabase;
    
    ...
}

Java EE @PostConstruct@PreDestroy 콜백은 모든 엔터프라이즈 Web Beans에 대해 지원됩니다. 모든 삽입이 실행된 후 @PostConstruct 방식이 호출됩니다.

여기서 유의해야 할 한 가지 제한 사항이 있습니다: @PersistenceContext(type=EXTENDED)는 단순한 Web Beans에 대해 지원되지 않습니다.

Java EE 6에 있는 Servlet에서 Web Bean을 사용하기가 쉽습니다. Web Beans 영역 또는 초기화 방식 삽입을 사용하여 Web Bean을 삽입합니다.

public class Login extends HttpServlet {


    @Current Credentials credentials;
    @Current Login login;
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        credentials.setUsername( request.getAttribute("username") ):
        credentials.setPassword( request.getAttribute("password") ):
        login.login();
        if ( login.isLoggedIn() ) {
            response.sendRedirect("/home.jsp");
        }
        else {
            response.sendRedirect("/loginError.jsp");
        }
    }
            
}

Web Beans 클라이언트 프록시는 Servlet에서 현재 요청 및 메소드 HTTP 세션의 올바른 CredentialsLogin 인스턴스로 호출을 라우팅을 처리합니다.

Web Beans 삽입은 모든 EJB에 적용되며, Web Bean 관리자 제어 하에 있지 않을 경우에도 (예들 들어, JNDI lookup에 의해 획득되었거나 @EJB를 사용하여 삽입되었을 경우) 적용됩니다. 특히, Message-Driven Beans에서 Web Beans 삽입을 사용할 수 있으며, 이를 삽입할 수 없기 때문에 이는 Web Beans를 고려하지 않습니다.

Message-Driven Beans에 대한 Web Beans 인터셉터 바인딩을 사용할 수 있습니다.

@Transactional @MessageDriven

public class ProcessOrder implements MessageListener {
    @Current Inventory inventory;
    @PersistenceContext EntityManager em;
    public void onMessage(Message message) {
        ...
    }
            
}

따라서, Web Beans 환경에서 메세지를 받는 것은 초간편합니다. 하지만 메세지가 Message-Driven Bean으로 전달될 때 사용할 수 있는 세션 또는 대화 컨텍스트가 없음에 유의하시기 바랍니다. @RequestScoped@ApplicationScoped Web Beans 만을 사용할 수 있습니다.

또한 Web Beans를 사용하여 메세지를 전송하기 쉽습니다.

JMS를 사용하여 메세지를 전송하는 것은 다소 복잡할 수 있습니다. 이는 다수의 다른 개체를 처리해야 하기 때문입니다. 큐의 경우 Queue, QueueConnectionFactory, QueueConnection, QueueSession QueueSender를 갖습니다. 토픽의 경우 Topic, TopicConnectionFactory, TopicConnection, TopicSession, TopicPublisher를 갖습니다. 이러한 각각의 객체는 자체적으로 수명 주기 및 스레딩 모델을 갖고 있습니다.

Web Beans는 이러한 모든 것을 처리합니다. 여기서 처리해야 할 사항은 web-beans.xml에 있는 큐 또는 토픽을 명명하고 관련된 바인딩 유형 및 연결 팩토리를 지정하는 것입니다.


<Queue>
    <destination
>java:comp/env/jms/OrderQueue</destination>
    <connectionFactory
>java:comp/env/jms/QueueConnectionFactory</connectionFactory>
    <myapp:OrderProcessor/>    
</Queue
>

<Topic>
    <destination
>java:comp/env/jms/StockPrices</destination>
    <connectionFactory
>java:comp/env/jms/TopicConnectionFactory</connectionFactory>
    <myapp:StockPrices/>    
</Topic
>

이제 큐의 경우 Queue, QueueConnection, QueueSession, QueueSender를 삽입할 수 있고, 토픽의 경우 Topic, TopicConnection, TopicSession TopicPublisher를 삽입할 수 있습니다.

@OrderProcessor QueueSender orderSender;

@OrderProcessor QueueSession orderSession;
public void sendMessage() {
    MapMessage msg = orderSession.createMapMessage();
    ...
    orderSender.send(msg);
}
@StockPrices TopicPublisher pricePublisher;

@StockPrices TopicSession priceSession;
public void sendMessage(String price) {
    pricePublisher.send( priceSession.createTextMessage(price) );
}

삽입된 JMS 객체의 수명주기는 Web Bean 관리자에 의해 전적으로 관리됩니다.

Web Beans는 특정 배포 아카이브를 지정하지 않습니다. JAR, EJB-JAR 또는 WAR에 있는 Web Beans — 애플리케이션 classpath에 있는 배포 위치를 패키지화할 수 있습니다. 하지만 Web Beans이 있는 각각의 아카이브에는 META-INF 또는 WEB-INF 디렉토리에 있는 web-beans.xml라는 파일이 들어 있어야 합니다. 파일은 비어 있을 수 도 있습니다. web-beans.xml 파일이 없는 아카이브에 배포된 Web Beans는 애플리케이션에서 사용할 수 없습니다.

Java SE 실행의 경우, 임베드 가능한 EJB Lite 컨테이너에 의해 실행용 EJB를 배포할 수 있는 위치에 Web Beans를 배포할 수 있습니다. 각 위치에서는 web-beans.xml 파일이 들어 있어야 합니다.