EJB(Enterprise Java Beans) 정리
n
q J2EE 플랫폼에서 실행되는 전형적인 비즈니스 애플리케이션에서, 비즈니스 로직에 해당되는 부분을 캡슐화
q J2SE에 있는 두 가지 메커니즘 –RMI와 JNDI-을 사용하여EJB와 클라이언트가 상호작용하는 것을 지원
q EJB가 클라이언트에게 제공하는 기능들은 RMI 리모트 인터페이스로 정의된다.
q EJB를 디플로이할 때, 이에 대한 위치 정보가 네이밍 서비스에 등록 된다.
q 클라이언트는 JNDI를 통해 EJB의 위치를 검색한 후, EJB 홈이라 부르는 팩토리 오브젝트와의 상호 작용을 통해 EJB 인스턴스를 얻어낸다.
n session bean :
q 공통적으로 사용되는 비즈니스 함수들을 캡슐화할 때 사용
q 가장 간단하고 일반적인 타입의 EJB
q 클라이언트가 비즈니스 로직을 사용할 수 있도록 동기식 인터페이스를 제공
q 아무런 데이터를 가지지 않거나, 사용자 세션에 관련된 데이터만 가지고 일시적인 용도로 사용
q stateful session bean
q stateless session bean
q 클라이언트를 위해서 실행된다.
q 트랜잭션으로 처리될 수 있다.
q 상대적으로 수명이 짧다.(지속성 없음)
q EJB 컨테이너가 중단되는 경우에 삭제된다.
n Entity bean
q 비즈니스에 관련된 데이터를 표현하기 위해서 사용
q 비즈니스 오브젝트(Entity)가 동적인 데이터를 가지거나, 이와 관련된 기능을 제공
q 데이터베이스에서 데이터에 대한 객체
q 많은 사용자들에 의해 공유되어서 접근될 수 있다.
q 상대적으로 수명이 길다.(지속성이 있다.)
q 클라이언트가 빈에 있는 데이터나 기능들을 이요할 수 있는 동기식 인터페이스를 제공
n Message-driven bean
q session bean과 유사, 세션 빈을 사용하는 경우에 클라이언트는 엔터프라이즈 빈의 메소드를 호출하고, 메소드가 끝날 때까지 기다려야 하는데 비해 메시지 드리븐 빈을 사용하는 경우에는 메시지를 전송하고, 클라이언트는 즉시 다른 작업을 수행
q 비동기식 인터페이스 제공
q 메시지 큐와 연동하여, 큐에 들어온 메시지들을 메시지 드리븐 빈의 인스턴스로 전송
q 클라이언트 메시지를 받음으로서 실행된다.
q 트랜잭션으로 처리될 수 있다.
q 상대적으로 수명이 짧다.
q 상태가 없다.
q EJB 컨테이너가 중단되는 경우에 삭제된다.
n EJB의 구성 요소
q 사용자 인터페이스(client interface)
n 스텁을 위한 것으로서, 원격지의 객체를 사용하는 사용자의 대리인
n 원격 인터페이스 : 사용자가 EJB 컨테이너에 메시지를 전달하여 홈 인터페이스를 통해 생성하거나 찾은 EJB의 비즈니스 메소드를 호출하는데 사용
n 홈 인터페이스 : 사용자가 EJB 컨테이너에 메시지를 전달하여 EJB를 생성하거나 찾거나 없애는 데 사용, 원격 EJB 컨테이너 내의 EJB의 라이프 사이클에 관련된 일을 수행하기 위한 것
q 엔터프라이즈 빈 클래스(enterprise bean class)
q 배치 설명 파일(deployment descriptor file)
n EJB 컨테이너가 빈 클래스를 배치하는 과정에 필요한 정보를 XML 문서 형식으로 저장해 놓은 것
n 배치 과정에서 EJB 컨테이너에 의해 추가적으로 필요한 클래스를 생성하고 EJB 컨테이너가 제공하는 각종 서비스 적용에 필요한 정보를 담고 있다.
n META-INF 디렉토리 아래에 ejb-jar.xml로 위치
q 기본키 클래스(primary key class)
n 엔티티 빈에서 필요
n 개별 엔티티를 구별하는 기본키를 정의
n EJB 컨테이너의 가공 객체(Artifacts)
q 개발자가 만든 코드 외에 EJB 컨테이너가 생성한 코드로부터 만들어지는 객체들
q EJB Home Objects
n EJB 객체의 라이프 사이클에 관련된 역할을 담당
n 메모리 관리, 스레드 관리, 풀링과 같은 자원 관리등의 시스템 레벨의 기능
q EJB Object
q 컨테이너
q SessionContext
q Syncronized
n 원격 클라이언트
q 동일한 혹은 다른 EJB 컨테이너에서 수행되는 다른 엔터프라이즈 빈이거나, 응용 프로그램, 서블릿, 애플릿 등의 임의의 자바 프로그램이 될 수 있다.
q 원격 인터페이스와 원격 홈 인터페이스를 사용하는 경우에 클라이언트는 위치에 무관하게 존재할 수 있다.
q 자바가 아닌 다른 언어로 작성된 CORBA 프로그램도 가능하다.
q 자바 RMI API를 이용해서 작성하게 되고, 원격 인터페이스와 홈 인터페이스에서 사용되는 매개변수와 리턴 값은 모두 RMI-IIOP의 규칙에 따라 전달된다.
q EJBObject, EJBHome으로부터 상속받는다.
q 위치 독립성과 유연성을 가지고 있기 때문에 배포시에 여러 곳에 분산시킬수 있다.
q 기본적으로 RMI API를 사용하기 때문에 오버헤드가 많고, 모든 매개 변수들이 기본형이거나 직렬화가 가능해야 한다.
n 지역 클라이언트
q 동일한 JVM내에서 실행되는 클라이언트
q EJBLocalObject, EJBLocalHome으로부터 상속받는다
[SessionBean]
n Session Bean은 비즈니스 메소드를 포함하는 서버 컴포넌트
n 클라이언트를 위해 비즈니스 로직을 수행
n 프로세스 개념을 담당
n 다른 엔터프라이즈 빈들과 상호 작용할 수 있으며, 엔티티 빈의 데이터를 접근하고, 변환하는 작업을 할 수도 있다.
n EJB 컨테이너는 효율적으로 세션 객체들을 관리하기 위해서 객체 풀(pool)과 활성화(activation)/비활성화(passivation)라는 방법을 이용한다
n 세션 빈의 구성
n 세션 빈 작성 과정
1. 원격 인터페이스, 홈 인터페이스, 빈 클래스 작성
2. 원격 인터페이스, 홈 인터페이스, 빈 클래스 컴파일
3. 배치 디스크립터 작성
4. 컴파일된 원격 인터페이스, 홈 인터페이스, 빈 클래스, 배치 디스크립터 파일을 jar파일로 압축
5. 배치
n 원격 인터페이스 : javax.ejb.EJBObject나 java.ejb.EJBLocalObject를 상속받는다.
q 클라이언트가 호출 할 비즈니스 메소드를 정의하고 있다
n 홈 인터페이스:java.ejb.EJBHome이나 javax.ejb.EJBLocalHome을 상속받는다.
q 빈 클래스를 생성, 검색, 삭제할 수 있는 메소드를 선언
n 빈 클래스 : 프로그래머 입장으로 봤을 때 가장 중요한 클래스
q 세션 빈의 경우에는 javax.ejb.SessionBean 인터페이스를 구현
q 원격 인터페이스에서 선언한 비즈니스 메소드를 실질적으로 구현하게 된다.
n * EJB 클래스는 원격 인터페이스를 구현하지 않는다.
n 비즈니스 메소드에서 사용하는 인자나 리턴 형식이 RMI/IIOP 에 맞게 작성해야 한다.
n Home Interface
q 클라이언트가 세션 빈에 대해서 새로운 세션 객체를 생서하거나, 세션 객체를 제거하는 작업을 할수 있게 해준다.
q 세션 빈 객체는 홈 인터페이스를 통해서 생성된 후, 홈 인터페이스를 통해서 객체를 찾은 후 사용한다.
q 홈 인터페이스를 이용해서 세션 빈을 생성, 검색, 삭제 할 수 있다.
q javax.ejb.EJBMetaData 인터페이스를 얻을 수 있는 메소드 제공
n EJB 컨테이너는 create()메소드를 호출할때 새로운 세션 객체를 생성하지 않고 홈 인터페이스에 대한 정보만을 반환하게 된다. (객체를 생성하는 작업에서 많은 과부하가 발생하기 때문에 최대한 객체 생성의 시점을 늦추기 위해서)
n Spec
q create() 메소드의 인자 수와 형식은 빈 클래스에 포함된 ejbCreate()메소드와 일치해야 한다.
q create() 메소드의 인자와 리턴 형식은 RMI/IIOP 형식에 맞아야 한다.
q create() 메소드의 리턴 형식은 원격 인터페이스 형식이어야 한다.
q create() 메소드는 throws javax.ejb.CreateException, javax.rmi.RemoteException을 포함해야 한다.
n Remote Interface
q 비즈니스 메소드 정의
q 클라이언트는 원격 인터페이스를 이용해서 비즈니스 메소드를 호출
n Spec
q Javax.ejb.EJBObject나 javax.ejb.EJBLocalObject 중에 한 가지를 상속받아야 한다.(javax.ejb.EJBObject, javax.ejb.EJBLocalObject를 상속받는 다른 인터페이스를 상속받아도 된다.)
q 비즈니스 메소드에서 사용하는 인자나 리턴 형식은 반드시 RMI/IIOP 형식에 맞아야 한다.
q 메소드엔 반드시 throws java.rmi.RMIException 부분을 포함해야 한다.
n 원격 인터페이스를 구현하고 있는 클래스는 jar 파일로 묶은 후, 배치할 때 EJB 컨테이너에서 구현할 수 있도록 소스가 자동으로 만들어지고 컴파일된 후 생성되기 위하여 EJB 명세에 맞게 작성해야 한다.
원격 인터페이스에서 정의한 비즈니스 메소드{
트랜잭션, 보안, 스레드, 자원관리에 대한 처리를 자동으로 해주는 코드
EJB 클래스가 구현한 비즈니스 메소드 호출
}
n Bean Class
q 빈 클래스는 사용자가 직접 사용하는 객체는 아니다.
q 빈 객체는 자동으로 생성되는 EJB 객체의 소스에 서 호출되게 하기 위해서 작성한다.
q Javax.ejb.SessionContext 객체는 사용자가 만드는 객체가 아니라 EJB 컨테이너가 생성해서 인자로 넣어주는 객체
q 빈 클래스에서 비즈니스 메소드를 구현할 때 주의해야 할 점은 사용자가 정의한 예외(Exception)을 발생시켜서는 안된다.
q 세션 빈에서 네트워크 커넥션을 이용하거나, JDBC 커넥션을 이용할 경우, 또는 비활성화될 경우, 해당 필드 값을 null로 초기화하는 과정이 필요하며 활성화 될 경우에는 다시 커넥션을 할당해줄 필요가 있다.
q 세션 객체가 더 이상 필요없다고 판달될 경우 EJB 컨테이너는 세션 객체를 삭제하는데, 삭제하기 전에 ejbRemove()메소드 호출
n 빈 클래스를 작성할 때 지켜야 할 spec
q javax.ejb.SessionBean 인터페이스를 구현해야 한다.
q 반드시 public으로 선언되어야 한다.
q Abstract나 final class가 될 수 없다.
q 하나 이상의 ejbCreate(0 메소드를 포함해야 한다. 홈 인터페이스에서 정의한 create(0 메소드와 같은 수의 ejbCreate() 메소드를 포함해야 하며, 인자의 개수와 형식도 일치해야 한다.
q 반드시 기본 생성자(인자가 없는 생성자)를 포함해야 한다. 이는 인자가 있는 생성자만 존재해서는 안 된다는 것을 의미한다.
q Finalize() 메소드를 포함해서는 안된다.
q 원격 인터페이스에서 선언한 비즈니스 메소드를 반드시 구현해야 한다.
n 빈 클래스의 ejbCreate()메소드의 spec
q 항상 ejbCreate로 시작해야 한다.
q 반드시 public으로 선언되어야 한다.
q abstract나 final class가 될 수 없다.
q 린턴 형식은 항상 void여야 한다.
q 메소드에 전달하는 인자는 RMI/IIOP에 적합한 형식이어야 한다.
q throws javax.ejb.CreateException외에 필요한 예외를 메소드에 기술할 수 있다.
n 세션 빈의 비즈니스 메소드 spec
q ejb로 시작할 수 있다.
q final이나 abstract, static로 선언해서는 안된다.
q 비즈니스 메소드의 인자나 리턴하는 형식은 RMI/IIOP에 적합해야 한다.
q throws 절은 임의의 응용 프로그램 예외를 기술할 수 있다.
[Deploy]
n EJB 컨테이너에서 세션 빈을 사용할 수 있게 만드는 것을 의미
n 배치된 세션빈은 JNDI명을 이용해서 JNDI 룩업으로 참조한 후 사용할 수 있다.
n 자동으로 생성되는 EJB 객체의 소스는 사용자가 만든 원격 인터페이스와 홈 인터페이스를 구현하게 되는데, 이 때 구현되는 메소드의 내용은 트랜잭션, 보안, 패일 오버에 대한 처리를 하는 코드와 빈 클래스에 포함되는 비즈니스 메소드를 호출하는 코드
EJB 객체 메소드{
트랜잭션 시작;
보안 처리;
패일오버 처리;
빈 클래스에 포함된 비즈니스 메소드 호출;
트랜잭션 종료;
}
n 자동으로 만들어진 소스는 컴파일 되고 EJB 컨테이너에 사용될 수 있는 형태로 등록
n 배치 디스크립터
q 배치할 때 EJB 컨테이너에 추가적인 정보를 제공하기 위해서
q 구체적인 옵션을 지정하는 것이 배치 디스크립터 파일이다.
q 배치 디스크립터 파일은 배치될 때 세션 빈을 참조하기 위해서 JNDI명을 지정
q 배치 디스크립터 파일에는 세션 빈을 구성하는 매개변수와 메타 데이터를 포함한다.
[EJB Local Object]
n 세션 빈을 원격지에서 참조한다는 것은 동일한 웹로직 서버에서 이용하는 것이 아니라, 다른 웹로직 서버나 웹 서버 혹은 애플리케이션에서 JNDI 룩업해서 사용한다는 것이며 내부적으로 RMI 기술을 사용한다는 의미로서 EJBObject를 상속받을 경우에는 대부분의 메소드에 throws RemoteException을 기술해야 한다.
n 반대로 세션 빈을 로컬에서 사용한다는 것은 같은 웹로직 서버 내에서 이용한다는 것을 의미한다.
n 웹로직 서버 한대를 이용할 경우에는 EJBLocalObject를 상속받는 것이 좋다
n EJBLocalObject를 상속받는 경우에는 내부적으로 RMI를 이용한 방식이 아닌 직접 통신 방식으로 동작하기 때문
n RMI 방식을 이용하면 내부적으로 객체 직력화 등의 과정을 거치면서 많은 과부하가 발생하고 속도가 느려지는 원인이 된다.
n 객체 직렬화
q 메모리에 있는 객체를 네트워크를 통해서 전송하거나 파일 시스템에 쓸 수 있게 하는등 Stream을 통해서 객체를 전송할 수 있는 기술
q 객체가 포함하는 필드 정보를 스트림(Stream)형태로 만들어서 전송하는 것
q 필드 값을 바이트의 흐름인 스트림으로 변환해서 쉽게 전송할 수 있게 했으며, 전송받은 데이터는 원래의 객체 형태로 형식 변환함으로써 원래 상태로 쉽게 되돌아 갈 수 있게 하는 기술
[Stateless Session Bean]
n 어느 누구에게나 동등한 서비를 제공
q 계산, 통계 작업등에 사용
n 컨테이너 내의 풀에 객체 여러 개가 미리 생성되어 대기
n 무상태 세션 빈의 경우는 메소드가 호출될 때 세셥 니과 매핑 되어 사용된다
n 세션 빈의 필드 값을 바꾸는 메소드를 호출한 후 , 필들의 내용을 읽어오는 메소드를 호출 경우 변경된 필드의 값을 다시 읽어온다는 보장은 없다.
n 무상태 세션 변이 포함하는 필드는 모든 세션 빈이 공통적인 값을 포함 할 경우에 사용된다.(DataSource, Connection)
n 필드의 내용이 롤백되어도 복구할 필요가 없으므로 javax.ejb.SessionSynchronization 인터페이스를 구현하면 안 된다.
n 컨테이너가 인스턴스 생성 조건
q 사용자가 빈 요청시 풀에 인스턴스가 없을때
q 풀 내에 적정한 개수만큼 인수턴스를 유지하기 위해 임의의 순간에 인스턴스 생성
n 활성화나 비활성화가 필요하지 않으므로 ejbActivate()와 ejbPassivate()메소드는 절대 호출되지 않는다.
n 풀 준비 상태의 빈 인스턴스는 컨테이너가 임의의 순간에 제거
q 풀 내에 인스턴스가 너무 많아서 자원을 필요없이 많이 차지하는 경우
q ejbRemove()
n 사용자의 remove()메소드는 사용한 비상태유지 세션 빈의 스텁을 무효화 시킨다.
n 사용자가 비상태유지 세션 빈의 홈 인터페이스를 통해 홈 객체의 스텁 create() 메소드를 호출하는 경우 특정 인스턴스가 EJB 객체에 연결되지 않으며, 사용자가 비즈니스 메소드를 호출할 때마다 연결이 이루어지고, 비즈니스의 수행이 종료되는 순간 연결이 해제된다.
q 홈 객체가 EJB 스텁 객체 생성
n 컨테이너가 빈 인스턴스를 풀내메소드준비 상태로 만드는 과정
q SessinoContext 생성
q 빈 인스턴스 생성
q setSessionContext() 호출
q ejbCrate()호출
[Stateful Session Bean]
n 쇼핑 몰의 장바구니와 같이 상태가 유지될 필요가 있는 경우에 사용
n 클라이언트와 세션빈의 관계 1:1
n 클라이언트에서 세션 빈을 생성하게 되었을 때부터 매핑해서 사용된다.
n 세션 빈의 필드 값을 바꾸는 메소드를 호출한 후, 필드의 내용을 읽어오는 메소드를 호출하면 변경된 값을 제대로 읽어올 수 있다.
n 상태세션 빈이 포함하는 필드는 세션 빈마다 다른 정보를 유지하고 싶을 때 사용된다.
n 인스턴스 생성 순간부터 하나의 클라이언트에 할당되어 서비스되는 서버측 서비스 객체
n 홈 인터페이스는 세션 빈을 생성하거나 제거하는 역할을 한다.
n 상태유지 세션 빈의 경우는 remove 메소드를 호출하기 전까지는 필드에 있는 정보를 계속 유지
n 상태 유지 세션 빈을 사용하는 것보다 HttpSession에 정보를 유지하는 것이 성능면에서도 우월
n create() 메소드는 인자를 달리하여 중복 정의(overload) 가능
n create() 메소드의 인자는 상태유지 세션 빈을 생성할 때 빈의 초기화 작업을 하는데 사용
n 엔터프라이즈 빈 클래스
q 상태 유지 세션 빈의 필드
q 필드값은 사용자가 계속 빈을 사용하는 동안 유지
q 비즈니스 메소드
q 라이프 사이클 관련 메소드
n 사용자 관점의 라이프 사이클
q JNDI 문맥을 얻어서 빈의 홈 객체의 스텁을 얻는다.
q PortableRemoteObject.narrow()를 사용하여 홈 인터페이스 타입을 형변환
q 홈 객체의 create() 메소드를 호출
q 빈의 EJB 객체 스텁을 얻어 비즈니스 메소드 수행
[SessionBean에서의 Transaction이용]
n 빈 관리 트랜잭션(bean-managed transaction)
q 사용자가 SessionContext 객체에 포함된 getUserTransaction()메소드를 호출해서 UserTransaction 객체의 레퍼런스를 얻어 사용하는 방법
q Begin(), commit(), rollback() 메소드를 이용해서 트랜잭션을 처리
q 무상태 세션 빈은 비즈니스 메소드 안에서 begin() 메소드를 호출했다면, 반드시 pthem가 종료되기 전에, commit()이나 rollback()메소드를 호출해서 트랜잭션 처리를 끝내야 한다.
q 상태유지 세션빈의 경우에는 메소드가 호출될 때 그 전의 트랜잭션으로 연결해서 동작하기 때문에 트랜잭션 처리가 끝나지 않아도 된다.
n 컨테이너 관리 트랜잭션(container-managed transaction)
q 컨테이너가 트랜잭션 처리를 자동으로 처리
q Ejb-jar.xml ㅍ일의 <container-transaction>요소의 <trans-attribute>요소에 지정될 수 있는 Never, NotSupported, Supports, Mandatory, Required, RequriesNew 속성값으로 트랜잭션을 관리
q 상태유지 세션 빈의 경우는 javax.ejb.SessionSynchronization인터페이스를 구현할 수 있다.
n afterBegin() – 트랜잭션이 시작한 후에 실행, 상태유지 세션 빈에 포함된 값을 백업해놓은 역할로 많이 사용
n afterCompletion()-커밋하거나 롤백할 경우 호출되며, 메소드 인자 값의 boolean이 false일 경우에는 롤백되었다는 것을 나타내며, 메소드 안에서는 백업되었던 값으로 필드 값을 초기화한다.
n beforeCompletion()-커밋되기 전에 호출되는 메소드
[Entity Bean]
n 데이터베이스와 밀접한 관련을 맺고 있는 서버 컴포넌트
n 영속성(persistence)을 유지해야 할 데이터를 표현할 때 사용
n 데이터베이스나 파일에 저장된 데이터를 프로그램에서 객체 형태로 생성하고, 사용할 수 있는 방법을 제공
n 여러 클라이언트로부터 공유되며, 테이블 내의 정보를 객체지향적으로 표현하기에 알맞으며, 영속성과 트랜잭션 속성을 포함하는 컴포넌트
n Database에 있는 Table의 한 Row나 혹은 여러 Table에 걸쳐 있는 Data를 표현한다.
n Entity Bean의 정보를 변경하면 동시에 Table의 Row도 변경된다. 따라서 Entity Bean은 필수적으로 Transaction문제를 가진다.
n 다른 엔티티 빈과의 관계성을 모델링하고, 표현
n 프라이머리 키(primary key)를 가진다.
q Persistence : 응용 프로그램이나 J2EE 서버가 종료된 후에도 엔티티 빈의 데이터와 상태가 유지됨의 의미
n CMP(Container-managed Persistence)
q JDBC 코드를 작성하지 않고, 배치 디스크립터에서 테이블과의 관계 설정만으로 객체를 데이터베이스로부터 읽어 들이거나 저장하는 기능을 사용
n BMP(Bean-Managed persistence)
q 프로그래머가 직접 JDBC 프로그래밍을 작성해서 구현
n EJB 스펙 2.0에서는 EJB-QL지원
n EJB 스펙 2.0에서는 엔티티 빈이 다른 요소와 관계를 맺을 수 있게 됨으로써 편의성과 유연성이 증가
n 복잡한 SQL, 데이터 베이스에 종속적인 SQL문이 사용될 경우에는 BMP 방식의 엔티티 빈을 이용하며, 간단한 SQL이 사용될 경우에는 CMP 방식의 엔티티 빈을 이용
n 배치 시 자동적으로 만들어지는 엔티티 빈 객체의 소스는 트랜잭션, 오류 복구, 동시성 처리 등을 처리
n Home Interface
q 엔티티 빈의 메타데이터와 홈 핸들을 얻기 위한 메소드
q 컨테이너의 관점은 생성, 찾기, 제거 뿐만 아니라 자원 관리와 지속성 관리 측면까지 모두 포괄한다.
q createXXX()메소드 – 데이터베이스 테이블에 insert문을 수행
n 반환하는 형식은 반드시 원격 인터페이스 형식이어야 한다.
n 빈 클래스에서의 ejbCreateXXX() 메소드와 인자 형식, 개수가 같은 createXXX() 메소드를 작성해야 한다.
n 빈 클래스의 ejbCreateXXX() 메소드에서 발생하는 예외와 같은 Exception은 throws 절에 기술
n throws 절에 javax.rmi.RemoteException이나 javax.ejb.CreateException을 작성할 수 있다.
q remove()메소드 – 데이터베이스 테이블에 delete문을 수행
n 엔티티 빈에 포함된 주 키 값과 매핑되는 데이터가 데이터베이스 테이블에서 삭제된다.
q finder()메소드 – 데이터베이스 테이블에 select문을 수행
n 데이터베이스 테이블로부터 조회를 하고자 할 때 사용되는 메소드
n findByPrimaryKey()메소드는 반드시 존재해야 하며, 메소드 인자로 전달한 주 키 값에 해당하는 데이터를 찾은 후, 그 결과를 읽어들일 수 있는 원격 인터페이스 반환
n 홈 인터페이스의 finder 메소드는 빈 클래스의 ejbFindXXX() 메소드와 짝을 이루고 있으며, 전달되는 인자 수와 형식은 같아야 한다.
n 리턴 형식은 엔티티 빈의 원격 인터페이스 형식이거나,java.util.Collection 형식이어야 한다.
n Throws 절에 FinderException, RemoteException 및 여러 응용프로그램 예회를 기술 할 수 있다.
q home()메소드-엔티티 빈의 데이터와 연관되지 않는 작업을 처리할 경우에 사용
n EJB 스펙 2.0 이후에 등장
n 사용자 수를 구하는 등의 처리를 할 때 사용
n home 메소드는 create, remove, find로 시작하면 안된ㄴ다.
n 인자와 리턴 형식은 RMI/IIOP에 적합한 형식이어야 한다.(직렬화 가능)
n Throws 절에 java.rmi.RemoteException이나 여러 응용 프로그램 예외를 기술할 수 있다.
q java.util.Collection을 반환할 경우는 중복되는 원격 인터페이스 여러 개를 반환할 경우이며, java.util.Set을 반환할 경우에는 중복을 허용하지 않는 원격 인터페이스를 반환할 경우에 사용한다
n Remote Interface
q 엔티티 빈의 지속성 필드의 값을 변경할 때 사용
q 원격 인터페이스에 있는 메소드는 빈 클래스의 메소드와 매치되어야 한다.
q 원격 인터페이스에 포함된 메소드 인자의 형식/개수는 EJB 클래스에 포함된 메소드 인자의 형식/개수와 일치해야 한다.
q 인자와 리턴되는 형식은 RMI/IIOP에 적합해야 한다.
q Throws 절에는 항상 java.rmi.RemoteException 예외를 기술해야 한다.
n Bean Class
q javax.ejb.EntityBean 인터페이스를 구현해야 한다.
q public하며 abstract여야 한다.
q public 인자가 없는 기본 생성자를 포함해야 한다.
q finalize() 메소드를 정의해선 안 된다.
q 비즈니스 메소드, ejbCreateXXX 메소드, ejbPostCreateXXX메소드를 구현해야 한다.
q 홈 인터페이스에 정읜 home 메소드에 대응되는 ejbHomeXXX 메소드를 구현해야 한다. 해당 메소드들은 엔티티 빈의 상태에는 접근할 수 없으며, 엔티티 빈과도 무관하게 동작한다.
q 추상 지속성 스키마를 위한 get/set 메소드를 abstract 메소드로 정의해야 한다
q finder 메소드는 구현하지 않는다. Finder 메소드는 컨테이너가자동으로 생성되는 엔티티 객체에서 구현된다.
q ejbSelectXXX 메소드를 abstract 메소드로 구현한다.
q javax.ejb.EntityBean 인터페이스에서 정의한 메소드를 구현한다
n ejbCreateXXX 메소드 Spec
q ejbCreate 접두어로 시작하는 이름이어야 한다.
q public으로 선언해야 한다.
q final로 선언할 수 없다
q static으로 선언할 수 없다.
q 리턴 형식은 엔티티 빈의 주 키 형식이다.
q 반드시 홈 인터페이스에서 정의한 createXXX메소드 인자의 개수/형식이 일치되게 작성해야 한다.
q RMI/IIOP에 적합한 형식의 인자여야 한다.
q throws 절에는 javax.ejb.CreateException을 기술해야 한다..필요한 경우 다른 응용프로그램 예외를 기술할수 있다.
q CMP2.0의 경우 throws 절에 java.rmi.RemoteException을 기술할 수 없다.
q CMP2.0 명세에서는 ejbCreateXXX메소드의 인자로 전달된 값은 세터 메소드를 이용해서 알맞게 지정하고 , 반드시 null 값을 반환해야 한다.(빈 클래스를 상속받으며, 컨테이너에 의해서 자동으로 만들어지는 클래스가 실제 주 키 값에 대한 객체를 반환하기 때문)
n ejbPostCreateXXX 메소드 Spec
q ejbPostCreateXXX 접두어로 시작하는 이름이어야 한다.
q public으로 선언해야 한다.
q final로 선언할 수 없다
q static으로 선언할 수 없다.
q 리턴 형식은 void 형식이어야 한다.
q throws 절에는 javax.ejb.CreateException을 기술해야 한다. 필요한 경우 다른 응용프로그램 예외를 기술할 수 있다.
q CMP2.0의 경우 throws 절에 java.rmi.RemoteException을 기술할 수 없다.
n ejbHomeXXX 메소드 Spec
q 0개 이상 포함할 수 있으며
q ejbHome 접두어로 시작하는 이름이어야 한다.
q public으로 선언해야 한다.
q final로 선언할 수 없다
q static으로 선언할 수 없다.
q 원격 인터페이스에서 정의한 home 메소드에 있는 인자 수/형식과 일치해야 한다.
q throws 절에는 javax.ejb.RemoteException을 기술해야 한다.
q throws 절에는 응용 프로그램 예외를 기술할 수 있다.
n ejbSelectXXX 메소드 Spec
q 0개 이상 포함 할 수 있으며
q ejbSelect 접두어로 시작하는 이름이어야 한다.
q public으로 선언해야 한다.
q abstractl로 선언할 수 없다
q static으로 선언할 수 없다.
q throws 절에는 javax.ejb.FinderException을 기술해야 한다.
q throws 절에는 응용 프로그램 예외를 기술할 수 있다.
q 모든 select 메소드는 배치 디스크립터의 query 원소와 연관 관계를 맺어야 한다. 배치 디스크립터 파일에는 EJB QL 질의어로 선언해야 하며 select 메소드와 연관성을맺어야 한다.
n 비즈니스 메소드 Spec
q 0개 이상 포함할 수 있으며
q 임의의 이름을 작성해야 되지만 ejb로 시작해서는 안 된다.
q 비즈니스 메소드는 public으로 선언해야 한다.
q final로 선언할 수 없다
q static으로 선언할 수 없다.
q 원격 인터페이스에서 정의한 메소드와 일치할 경우, 인자 수/형식과 일치해야 한다.
q 메소드의 throws 절에는 응용 프로그램 예외를 기술할 수 있다.
q CMP 2.0의 경우 throws 절에 java.rmi.RemoteException을 기술할 수 없다.
n ejbSelectXXX 메소드 Spec
q 0개 이상 포함 할 수 있으며
q ejbSelect 접두어로 시작하는 이름이어야 한다.
q public으로 선언해야 한다.
q abstractl로 선언할 수 없다
q static으로 선언할 수 없다.
q throws 절에는 javax.ejb.FinderException을 기술해야 한다.
q throws 절에는 응용 프로그램 예외를 기술할 수 있다.
q 모든 select 메소드는 배치 디스크립터의 query 원소와 연관 관계를 맺어야 한다. 배치 디스크립터 파일에는 EJB QL 질의어로 선언해야 하며 select 메소드와 연관성을맺어야 한다.
n 데이터베이스에 저장되는 필드들을 지속성 필드(persistent field)라고 한다.
n 프라이머리 키 클래스
q 개별 엔티티를 구별하기 위해 사용
q 직렬화 가능한 객체로 작성
q 반드시 hashCode()와 equals() 구현
q 기본키 필드가 하나인데 그 필드의 타입이 Integer, Double, Long, Short, String 클래스 등인 경우에는 기본키 클래스를 따로 만들지 않고, 필드의 기본키 클래스로 활용할 수 있다
q 기본키 클래스의 필드는 모두 public으로 지정
q 컨테이너 관리 지속성의 경우에 인자 없는 생성자를 반드시 만들어야 한다.
q 기본키 클래스를 특별히 정의할지 않을 경우 EJB 구성 요소의 소스 내에서 기본키 클래스 타입 대신 java.lang.Object를 사용한다.
q RMI/IIOP에 적합한 형식이어야 한다.
q hashCode(), equals(Object obj)를 구현해야 한다.
n 자동으로 생성되는 배치 디스크립터 파일과 기능
q ejb-jar.xml : 엔티티 빈의 원격 인터페이스, 홈 인터페이스, 빈 클래스, 주 키 클래스에 대한 설정과 트랜잭션에 대한 설정 등을 한다.
q weblogic-ejb-jar.xml : 엔티티 빈에 대한 JNDI name에 대한 설정, Resource Reference에 대한 설정 등을 한다.
q weblogic-cmp-rdbms-jar.xml : CMP field와 데이터베이스 테이블 컬럼과의 매핑에 대한 설정을 한다.
n Bean-Managed Persistence : BMP
q 프로그래머가 엔티티 빈의 내용을 직접 관리
q 엔티티 빈의 내용을 데이터베이스나 파일에 저장하고, 변경하고, 읽기 위한 코드를 프로그래머가 직접 작성
q DBMS에 접근하기 위해서 JDBC 사용
n Container-Managed Persistence : CMP
q 컨테이너에 의해 데이터베이스에 접근하기 위한 코드 자동 생성
q 특정 DBMS나 DB에 구속되지 않는다.
q 로드 및 저장할 객체의 멤버 필드를 디플로이먼트 디스크립터파일의 cmp-field 원소를 이용해서 기술
n Finder 메소드의 경우 EJB 컨테이너가 생성하는 코드보다는 특정 데이터베이스에서 사용하는 SQL문의 사용 방법을 잘 알고 있는 개발자가 작성한 코드에서 훨씬 빨리 실행될 수 있다.
n CMP 엔티티 빈은 여러 테이블을 조인해서 목록을 출력한다거나, 여러 테이블을 동시에 갱신하는 경우, 조건에 맞는 레코드 합을 구하는 등의 처리를 하기에는 아직 어렵다.
n ejbLoad()
q Container가 DB의 Data와 동기화가 요구되는 시점에 자동으로 Container에 의해 실행
q Bean의 Persistence를 유지
q 테이블의 내용으로 엔티티 빈을 동기화 할 때 사용된다.
q 테이블에서 주 키 필드 값으로 select한 후, select된 결과로 주 키를 제외한 나머지 필드 값을 읽어온 값으로 수정한다.
n ejbStore()
q Container가 DB의 Data와 동기화가 요구되는 시점에 자동으로 Container에 의해 실행
q Bean의 Persistence를 유지
q 엔티티 빈의 내용이 변경되었을 경우, 엔티티 빈에 포함된 필드 값으로 테이블의 내용을 갱신한다.
q 주 키 값을 제외한 나머지 필드 값을 읽어온 값으로 수정한다.(update문 명령을 사용)
n setEntityContext(EntityContext) unsetEntityContext()
q Bean Instance가 최초에 생성될 때 setEntityContext()가 호출
q 삭제될 때 unsetEntityContext()가 호출
n ejbActivate()
q Bean이 Pool영역에 초기에 생성된 후 Client에 의해 Ready상태로 전환될 때 Container에 의해 자동으로 호출
q Bean의 초기화 역할
n ejbPassivate()
q Ready상태의 Bean이 다시 Pool로 이동할 때 Container에 의해 호출
q Bean이 동작된 이후 모든 자원을 반납하는 역할
[출처] EJB(Enterprise Java Beans) 정리|작성자 메멘토