wooyeon06 2023. 3. 30. 15:33

EJB는 "Enterprise JavaBeans"의 약어로, 서버 측 Java 애플리케이션 개발을 위한 스펙이며, 분산 시스템 환경에서 업무 로직을 처리하기 위한 컴포넌트 모델입니다.

EJB는 Java EE(Java Platform, Enterprise Edition) 스펙의 일부로, Java EE 컨테이너 내에서 실행되며, 일반적으로 데이터베이스 연동, 트랜잭션 관리, 보안 등의 기능을 제공합니다. EJB는 Java RMI(Remote Method Invocation) 기술을 사용하여 다른 Java 애플리케이션에서 EJB를 호출할 수 있습니다.

EJB는 세 가지 유형이 있습니다. 

첫째는 세션(Session) EJB로, 클라이언트와 상호작용하는 비즈니스 로직을 처리합니다. 

둘째는 엔티티(Entity) EJB로, 데이터베이스와 연동하여 영속성 데이터를 처리합니다. 

셋째는 메시지(Message) EJB로, 비동기 메시지를 처리하는 데 사용됩니다.

EJB는 XML 디스크립터 파일을 사용하여 구성되며, 컨테이너가 자동으로 EJB 인스턴스를 생성하고 관리합니다. 이를 통해 개발자는 EJB의 라이프사이클 관리나 스레드 관리 등의 복잡한 작업을 수행하지 않아도 됩니다. 또한, EJB의 분산 트랜잭션 처리와 같은 고급 기능을 컨테이너에서 제공받을 수 있습니다

 

아래 예제는 EJB 2.x에서 XML 기반의 통신을 사용하는 방법입니다.

 

XML 기반의 인터페이스 생성

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-system PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN" "http://java.sun.com/j2ee/dtds/application_1_2.dtd">
<ejb-system>
  <ejb>
    <ejb-name>ExampleBean</ejb-name>
    <home>com.example.ExampleHome</home>
    <remote>com.example.Example</remote>
    <ejb-class>com.example.ExampleBean</ejb-class>
    <session-type>Stateless</session-type>
    <transaction-type>Container</transaction-type>
  </ejb>
</ejb-system>

 

EJB 클래스 작성

package com.example;

import javax.ejb.*;
import java.rmi.RemoteException;

public interface Example extends EJBObject {
    public String getMessage() throws RemoteException;
}

public interface ExampleHome extends EJBHome {
    public Example create() throws RemoteException, CreateException;
}

public class ExampleBean implements SessionBean {
    public void ejbCreate() {}

    public void ejbRemove() {}

    public void ejbActivate() {}

    public void ejbPassivate() {}

    public String getMessage() {
        return "Hello, World!";
    }
}

 

클라이언트 작성

package com.example.client;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import com.example.Example;
import com.example.ExampleHome;
import java.util.Properties;

public class Client {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        properties.put(Context.PROVIDER_URL, "localhost:1099");

        Context context = new InitialContext(properties);

        ExampleHome home = (ExampleHome) PortableRemoteObject.narrow(
            context.lookup("ExampleHome"), ExampleHome.class);

        Example example = home.create();

        System.out.println(example.getMessage());
    }
}

 

 

EJB 디스크립터는 EJB(Enterprise JavaBeans) 컴포넌트의 배치 및 구성 정보를 정의하는 XML 파일입니다. EJB 디스크립터는 EJB 컨테이너에 EJB 컴포넌트를 배치하고 실행하는 방법을 지시합니다.

 

EJB 디스크립터는 EJB(Enterprise JavaBeans) 컴포넌트의 배치 및 구성 정보를 정의하는 XML 파일입니다. EJB 디스크립터는 EJB 컨테이너에 EJB 컴포넌트를 배치하고 실행하는 방법을 지시합니다.


EJB 디스크립터는 다음과 같은 정보를 포함할 수 있습니다.

 

  • EJB 이름 및 설명
  • EJB 인터페이스 및 구현 클래스
  • 트랜잭션 및 보안 구성
  • 메소드 수준의 트랜잭션 및 보안 규칙
  • EJB 환경 구성 변수
  • EJB 라이프사이클 콜백 메소드

EJB 디스크립터 파일은 각 EJB 모듈(ear, jar, war 파일)의 META-INF 디렉토리에 위치합니다. EJB 디스크립터는 EJB 컨테이너에 의해 자동으로 로드되며, EJB 컴포넌트를 배치하고 실행하는 데 사용됩니다.

 

아래는 EJB 2.x 버전에서 사용되는 ejb-jar.xml 파일의 예시입니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
  <enterprise-beans>
    <session>
      <ejb-name>MySessionBean</ejb-name>
      <home>com.example.MySessionHome</home>
      <remote>com.example.MySession</remote>
      <ejb-class>com.example.MySessionBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>
    <entity>
      <ejb-name>MyEntityBean</ejb-name>
      <home>com.example.MyEntityHome</home>
      <remote>com.example.MyEntity</remote>
      <ejb-class>com.example.MyEntityBean</ejb-class>
      <persistence-type>Container</persistence-type>
      <prim-key-class>java.lang.Integer</prim-key-class>
      <reentrant>false</reentrant>
      <cmp-version>2.x</cmp-version>
      <abstract-schema-name>MyEntitySchema</abstract-schema-name>
      <table-name>MY_ENTITY</table-name>
      <cmp-field>
        <field-name>id</field-name>
        <field-type>java.lang.Integer</field-type>
        <column-name>ID</column-name>
      </cmp-field>
      <cmp-field>
        <field-name>name</field-name>
        <field-type>java.lang.String</field-type>
        <column-name>NAME</column-name>
      </cmp-field>
    </entity>
  </enterprise-beans>
  <assembly-descriptor>
    <container-transaction>
      <method>
        <ejb-name>MySessionBean</ejb-name>
        <method-name>*</method-name>
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
  </assembly-descriptor>
</ejb-jar>