본문으로 건너뛰기

10.5 EJB 종류

EJB 3는 세션 빈(Session Bean)과 메시지 드리븐 빈(Message-Driven Bean)를 지원한다. 이제 엔티티 빈은 없다. 세션 빈은 비즈니스 로직을 구현하기 위한 빈이며 클라이언트는 RPC(Remote Procedure Call)와 같이 다른 서버에서 컴포넌트를 네트워크를 통해 호출할 수 있다. 메시지 드리븐 빈은 JMS 메시지를 수신했을 때 시작되는 빈으로 비동기 처리에 사용된다. 세션 빈은 Stateless, Stateful, Singleton의 세가지 종류가 있다. 프로그래밍할 때 javax.ejb 패키지의 어노테이션을 추가하는 것으로 EJB 종류를 구분한다. 예를 들어, Stateless 세션 빈이면, @javax.ejb.Stateless라는 어노테이션을 추가한다.

EJB 종류어노테이션설명
세션 빈Stateless 세션 빈@StatelessStateless 세션 빈은 가장 간단하고 많이 사용되는 세션 빈이다. 클라이언트에 비즈니스 메서드를 제공하지만, 메서드 호출간 상태를 유지하지 않는다. 상태가 없어서 애플리케이션 서버는 각 메서드 호출이 같은 인스턴스에서 실행되는지 확인해야 한다
Stateful 세션 빈@StatefulStateful 세션 빈은 서버 측에서 상태를 보관하고 유지하는 세션 빈이다. 접속한 클라이언트 전용 EJB 인스턴스를 할당할 수 있기 때문에, 메서드 호출할 때 빈 인스턴스 내에서 상태 정보를 유지하는 것이 가능하다.
Singleton 세션 빈@Singleton싱글톤 세션 빈은 서버 측에서 상태를 보관하고 유지하는 빈이다. 싱글톤 세션 빈은 서버 측에서 1개의 인스턴스만 실행되어 여러 대의 클라이언트의 정보를 공유할 때 유용하다. 2+
메시지 드리븐 빈@MessageDriven메시지 드리븐 빈(MDB)은 애플리케이션 개발에 이벤트 모델을 사용한다. MDB는 클라이언트 코드에서 JMS(Java Messaging Service) 서버에 메시지를 전송하면, 메시지를 수신하여 실행된다.

다음은 간단한 EJB 3 예제 코드이다. 간단히 Java 소스에 @Stateless 어노테이션을 붙이면 Stateless 세션 빈이 된다.

@Stateless
public class CustomerService {

@PersistenceContext
private EntityManager entityManager;

public void addCustomer(Customer customer) {
entityManager.persist(customer);
}
}

위의 코드에서는 addCustomer라는 메서드에서 Customer라는 객체를 JPA O/R 맵핑을 사용하여 저장한다. CustomerService라는 EJB는 위의 소스 파일 하나만 작성하면 된다. 기존 버전처럼 XML 디스크립터 파일들을 작성할 필요가 없다. 또, EJB가 영속성 컨텍스트를 관리하고 있고, addCustomer() 메서드는 트랜잭션을 지원하고 스레드 세이프하다.