EJB 란 무엇입니까? Enterprise JavaBeans의 진화

EJB (Enterprise JavaBeans)는 Java 플랫폼에서 대규모 분산 비즈니스 애플리케이션을 개발하기위한 사양입니다. EJB 1.0은 1998 년에 출시되었습니다. 최신 릴리스 인 EJB 3.2.3은 Jakarta EE에 포함되도록 채택되었으며, Jakarta Enterprise Beans로 이름이 변경됩니다.

EJB 아키텍처

EJB 아키텍처는 EJB (Enterprise Bean), EJB 컨테이너 및 Java 애플리케이션 서버의 세 가지 주요 구성 요소로 구성됩니다. EJB는 EJB 컨테이너 내부에서 실행되고 EJB 컨테이너는 Java 애플리케이션 서버 내부에서 실행됩니다.

EJB에는 세션 빈과 메시지 구동 빈의 두 가지 유형이 있습니다.

  • 세션 빈 은 클라이언트에 의해 호출되며 트랜잭션 및 리소스 관리와 같은 엔터프라이즈 기능을 클라이언트에서 프로그래밍 방식으로 사용할 수 있습니다.
  • 메시지 구동 Bean 은 또한 엔터프라이즈 기능을 캡슐화하고 제공하지만 비동기식이며 이벤트 구동입니다. 메시지 구동 Bean은 이벤트를 수신하고 응답하며 클라이언트가 호출 할 수 없습니다.

EJB 시스템에서 지속성을 제공하는 데 사용되면 엔티티 Bean은 Java Persistence API로 대체되었습니다. 세션 Bean 및 메시지 구동 Bean에 대해 자세히 알아 보려면 계속 읽으십시오.

EJB 대 JavaBeans

Enterprise JavaBeans는 Java EE를위한 최초의 구성 요소 기반 개발 모델이었습니다. EJB는 구성 요소 기반이라는 점에서 JavaBeans와 유사하지만 유사성이 끝납니다.

  • 자바 빈즈는 특정 규칙을 여러 개체와 부합 함을 선언을 캡슐화하는 자바 클래스입니다. JavaBeans는 주로 클라이언트 측 개발에 사용됩니다.
  • 엔터프라이즈 Bean (EJB)는 특정 서버 측 기능을 스며 자바 클래스입니다. 엔터프라이즈 빈은 대규모 비즈니스 애플리케이션 및 시스템에 사용됩니다.

세션 빈

세션 빈은 클라이언트에서 호출 할 수있는 비즈니스 기능의 덩어리를 나타내는 엔터프라이즈 빈의 가장 일반적인 유형입니다. 이 경우 클라이언트는 로컬 JVM의 다른 클래스 또는 원격 호출 일 수 있습니다.

EJB 컨테이너는 Bean의 상태에 의해 결정되는 세션 Bean 라이프 사이클을 관리합니다.

  • Stateless 세션 Bean 은 Java Servlet API의 요청 범위와 유사합니다. Stateless 세션 Bean은 호출 가능한 기능 청크를 포함하지만 그렇지 않으면 Stateless입니다.
  • Stateful 세션 Bean 은 하나의 클라이언트에만 연결되며 해당 클라이언트의 진행중인 세션에 연결됩니다. Stateful 세션 Bean은 Servlet API의 세션 범위와 유사하게 작동합니다.
  • Singleton Bean 은 Servlet API의 애플리케이션 범위와 유사합니다. 싱글 톤 세션 Bean은 각 클라이언트에 대해 한 번만 존재합니다.

세션 빈을 사용한 스레드 안전성

Stateful Session Bean은 한 번에 하나의 클라이언트에서만 액세스 할 수 있으므로 이러한 유형의 Bean으로 작업 할 때 스레드 안전성이 보장됩니다. Stateless 세션 빈과 싱글 톤 빈은 더 유연하여 개발자가 관리해야하는 동시 연결을 허용합니다. 이러한 유형의 Bean으로 작업 할 때 스레드 안전성에 대한 책임이 있습니다.

메시지 구동 Bean

MDB (Message-Driven Bean)는 JMS (Java Message Service) 메시지를 통해 호출됩니다. JMS는 메시지 구동 Bean이 명령에 대한 리스너 역할을하는 분산 명령 패턴처럼 작동합니다. 메시지가 토픽 또는 큐에 도착하면 해당 토픽을 청취하는 메시지 구동 Bean이 호출됩니다.

메시지 구동 Bean은 일반적으로 세션 Bean만큼 사용되지는 않지만 강력합니다. 비동기식 및 이벤트 기반이므로 리소스를 보존하는 것이 중요한 장기 실행 작업에 특히 유용합니다.

가장 단순한 아키텍처는 EJB 애플리케이션과 해당 컨테이너 및 서버로 구성되며 MDB를 처리하는 메시지 서비스와 조정됩니다. 프로덕션에서 아키텍처에는 빈 소비 전용 세 번째 구성 요소가 포함될 수 있습니다. 개발 과정에서 이러한 모든 구성 요소는 동일한 로컬 시스템에서 실행될 수 있습니다.

그림 1은 메시지 구동 Bean이있는 일반적인 이벤트 구동 아키텍처를 보여줍니다.

매튜 타이슨

메시지 구동 Bean에 대한 작업은 세션 Bean을 사용하는 것보다 더 복잡합니다. 이벤트 중심 환경에서는 일반적으로 ActiveMQ와 같은 메시지 브로커가 필요합니다.

세션 빈이 더 간단하여 EJB에서 더 일반적으로 사용되는 반면, 이벤트 기반 아키텍처는 특히 마이크로 서비스의 폭증과 함께 인기를 얻고 있습니다. 

EJB 주석

EJB 사양에 어노테이션을 도입 한 EJB 3.0까지는 엔터프라이즈 Bean을 정의하고 소비하는 것이 많은 개발자에게 고착 점이었습니다. 어노테이션을 사용하면 Java EE에있는 광범위한 기능에 대해 엔터프라이즈 Bean을 매우 쉽게 구성 할 수 있습니다. EJB 주석을 시작하려면 계속 읽으십시오.

@Stateless : Stateless 세션 빈 정의

클래스를 상태 비 저장 세션 빈으로 지정하기 위해 javax.ejb.StatelessListing 1과 같이 주석 을 사용합니다 .

Listing 1. @Stateless 주석 예제

 import javax.ejb.Stateless; @Stateless public class MyStatelessBean { public String getGreeting() { return "Hello JavaWorld."; } } 

이 상태 비 저장 빈에는 인수를 취하지 않고 문자열을 반환하는 간단한 서명이 포함되어 있습니다. 단순함이 당신을 속이지 않도록하세요 :이 Bean은 다른 Bean, 서비스 또는 애플리케이션의 데이터 계층과의 상호 작용을 포함하여 필요한 모든 것을 수행 할 수 있습니다.

@EJB : 상태 비 저장 세션 빈 사용

세션 빈을 정의하고 나면 사용이 매우 간단합니다.

목록 2. @EJB 주석 예제

 public class MyServlet extends HttpServlet { @EJB MyStatelessBean myEjb; public void doGet(HttpServletRequest request, HttpServletResponse response) { response.getWriter().write("EJB Says " + testStatelessEjb.getGreeting()); } } 

Here, we inject the stateless bean into a servlet, and then it's available for use. Notice how the bean is identified under the @EJB annotation. The "stateless" designation tells us this bean will not track the client. Because it's stateless, we also know this bean is subject to threading if it does any work outside the invoked method.

@Remote: Define a remote EJB interface

In the above examples, I assumed the EJB and EJB client were running in the same JVM. If the enterprise bean and its client are running in separate JVMs, then the EJB must define a @Remote interface. In this case, it's up to you to define and implement the interface, as shown in Listing 3.

Listing 3. @Remote annotation example

 @Remote public interface MyStatelessEjbRemote { String sayHello(String name); } 

The remote interface is sent to the client to invoke. Calls to it will then be fulfilled by the EJB's server-side implementation. The MyStatelessBean example in Listing 4 implements the remote interface.

Listing 4. Implementing a remote interface

 public class MyStatelessBean implements MyStatelessEjbRemote{ ... } 

A remote interface is implemented just like a normal class implementing an interface. As the consumer of a remote EJB, the client application must be able to access the class definition for the remote interface. You can package the class definition for the remote interface as a dependency JAR.

Local vs remote interface

While it's important to know how to implement a remote interface, in practice it's more common to use a local interface. The local interface is used by default and works whenever the EJB is invoked within the same JVM context. Using the remote interface comes into play when the application is distributed across multiple JVMs.

Stateful sessions beans and singleton beans

The process for defining and consuming stateful @Session beans and @Singleton beans is the same as what you've seen for @Stateless beans. Remember the semantics:

  • Multiple session beans can be instantiated and used for the same client.
  • A singleton bean will exist only once for the entire application.

Thread safety and scheduling with singletons

Thread safety is built in when you're working with session beans, but both stateless and singleton beans can be accessed concurrently by multiple clients. Developers are responsible for thread safety when implementing these types of beans.

Singleton beans offer some support for thread safety via the @Lock annotation. You can use the @Lock annotation on singleton bean methods to set read/write privileges for each method. The two options are @Lock(LockType.READ) or @Lock(LockType.WRITE), which is the default.

Another useful feature of singleton beans is the ability to schedule tasks in a simple way, using the @Schedule annotation. Listing 5 shows how to schedule a task daily at noon.

Listing 5. @Schedule annotation example

 @Singleton public class MySchedulerBean { @Schedule(hour = "12") void doIt() { System.out.println("Hello at Noon!"); } } 

CDI vs EJB

CDI, or Context and Dependency Injection is a newer enterprise specification that some developers have proposed could replace EJB.

At a high level, CDI offers a general-purpose component framework, while EJB stands out for its richly featured, individual components. Whereas CDI uses dependency injection to define and reference any software component, EJB components are more formally defined, with each offering a specific set of capabilities out of the box. Both specs are planned for future development as part of Jakarta EE, where the question of whether CDI should replace EJB will eventually be resolved.

Conclusion

Enterprise JavaBeans는 엔터프라이즈 Java 애플리케이션에서 비즈니스 로직을 쉽게 캡슐화하고 재사용 할 수있는 방법을 제공하는 최초의 사양이었습니다. 과거의 거대한 거물과는 거리가 먼 오늘날 EJB는 광범위한 엔터프라이즈 기능에 즉시 액세스 할 수있는 간결한 주석 기반 프레임 워크입니다. 다음에 분산되고 확장 가능한 비즈니스 애플리케이션을 빠르게 확장하라는 요청을 받으면 EJB를 고려하십시오. 당신은 유쾌하게 놀라게 될 것입니다.

"EJB 란 무엇입니까? Enterprise JavaBeans의 진화"라는이 스토리는 원래 JavaWorld에서 게시했습니다.