제12장 부가 기능

내용 목차

12.1. WorkArea 서비스
12.1.1. UserWorkArea 인터페이스
12.1.2. PropertyMode 타입
12.1.3. 예외
12.1.4. Nested UserWorkArea
12.1.5. UserWorkArea를 사용하는 응용 프로그램 개발

본 장에서는 JEUS에서 EJB를 개발할 때 사용할 수 있는 부가 기능들에 대해 설명한다.

WorkArea 서비스는 프로그램이 어떤 묵시적(implicit)인 컨텍스트를 계속 전달할 때 사용할 수 있는 기능이다. 마치 Security 컨텍스트나 트랜잭션 컨텍스트와 같이 별도의 인자로 전달하지 않아도 로컬 또는 원격 메소드를 호출할 때 계속 전달된다. 어떤 컨텍스트를 전달해야 하는 경우나 메소드의 인자수가 많아지는 경우에 WorkArea를 사용할 수 있다.

WorkArea는 일종의 사용자 저장 공간으로 name-value pair 형태의 맵(Map)으로 저장된다. WorkArea를 새로 시작하면 현재의 스레드와 함께 이동하기 때문에 호출된 메소드나 EJB와 같은 컴포넌트에서 계속 사용할 수가 있다. 또한, 원격 EJB를 호출하는 경우에도 전달(propagation)되는 특성이 있다.

WorkArea 서비스를 이용하기 위해 UserWorkArea 인터페이스인 jeus.workarea.UserWorkArea를 사용한다.

참고

자세한 API 정보는 JEUS API Javadoc 문서의 jeus.workarea 패키지를 참조한다.

현재 원격 WorkArea 전달(propagation) 기능은 EJB 3.0 비즈니스(business) 인터페이스를 사용하거나 use-dynamic-proxy-for-ejb2 설정이 true인 경우에만 전달된다. EJBObject 원격 컴포넌트 인터페이스를 사용하거나 JEUS 기본 RMI 호출이 아닌 IIOP 호출을 하는 경우에는 전달되지 않는다.

본 절에서는 실제로 UserWorkArea를 사용하는 EJB 예제를 작성하며 UserWorkArea 인터페이스를 사용하는 방법을 설명한다.

EJB 예제는 UserWorkAreaSampleSender와 UserWorkAreaSampleReceiver 2개의 EJB로 이루어져 있다. Sender에서 UserWorkArea를 생성하여 데이터를 전달하고, Receiver에서 UserWorkArea에 설정된 값을 이용하여 메시지를 생성하여 원래 Sender에서 리턴하는 예제로 과정은 다음과 같다.

  1. UserWorkArea 액세스

    UserWorkArea를 사용하기 위해서는 먼저 JNDI에서 UserWorkArea를 lookup해야 한다.

    다음은 JNDI에서 UserWorkArea를 lookup하는 방법에 대한 예이다.


  2. 새 UserWorkArea 시작

    JNDI에서 처음 lookup해온 UserWorkArea는 아무런 정보가 없기 때문에 새로운 UserWorkArea를 시작해야 한다. 만약, UserWorkArea의 이름이 null이면 NullPointException이 발생한다.


  3. WorkArea에 등록 정보 설정

    새로 시작한 UserWorkArea에 등록 정보를 설정한다. 등록 정보는 <key, value, mode>로 이루어진다. 'key'는 String이며 'value'는 직렬화(Serialization)가 가능한 객체이다.

    값을 설정할 때 현재 UserWorkArea가 없으면 NoWorkAreaException이 발생한다. 시작한 UserWorkArea가 아니면 NotOriginatorException이 발생하며, 이미 READ_ONLY로 설정된 값을 수정할 경우 PropertyReadOnlyException이 발생한다.


  4. WorkArea에 설정된 등록 정보 가져오기

    Receiver에서 전파된 UserWorkArea에서 설정된 등록 정보를 가져와 메시지를 생성한다. 저장된 정보를 가져올 때 UserWorkArea에 존재하지 않는 key를 사용하면 null이 리턴된다.


  5. UserWorkArea 완료하기

    시작한 UserWorkArea를 완료한다. 완료하는 것은 반드시 시작된 Originator에서만 가능하며 그 이외에서 완료하려면 NotOriginatorException이 발생한다.