EJB와 Jakarta EE: 서버측 컴포넌트의 트랜잭션·보안 관리
EJB의 서버측 컴포넌트 모델과 Session Bean, MDB, 컨테이너 트랜잭션·보안 관리, Jakarta EE에서의 변화를 정리한다.
2026-08-14 · 최초 발행 2026-01-12
비즈니스 로직과 인프라 서비스를 분리하는 방식
EJB(Enterprise Java Bean)는 Java EE, 현재의 Jakarta EE 플랫폼에서 사용하는 서버측 컴포넌트 아키텍처다. 비즈니스 로직을 프레젠테이션 계층에서 분리해 컴포넌트로 캡슐화하고, 재사용과 유지보수를 고려한 구조를 만든다.
EJB 컨테이너는 빈의 생명주기를 관리한다. 애플리케이션은 트랜잭션 관리, 보안 처리, 동시성 제어, 리소스 풀링 같은 엔터프라이즈 서비스를 컨테이너에 위임할 수 있다. 원격 메서드 호출(RMI)을 통한 분산 컴퓨팅에서는 네트워크와 위치를 의식하지 않고 컴포넌트에 접근하는 구조도 제공한다.
컨테이너가 맡는 서비스
선언적 트랜잭션에서는 트랜잭션 경계를 설정하고, 커밋과 롤백을 컨테이너가 처리한다. 이 방식이 CMT(Container-Managed Transaction)다. 반대로 BMT(Bean-Managed Transaction)는 빈이 직접 트랜잭션을 다루며, 세밀한 제어가 필요할 때 UserTransaction API를 사용한다.
보안은 선언적으로 설정할 수 있으며, 역할 기반 접근 제어와 인증·인가 처리가 대상이다. 커넥션 풀링, 스레드 관리, 인스턴스 풀링도 컨테이너가 제공하는 리소스 관리 범위에 속한다.
클러스터 환경에서는 로드 밸런싱과 페일오버를 지원하고 수평 확장이 가능하다. 상태를 어떻게 다루는가에 따라 확장성의 특성도 달라진다. Stateless는 상태를 보관하지 않아 확장성이 높고, Stateful는 세션 상태를 유지한다. Singleton은 전역 공유 상태를 위한 방식이므로 동시성 제어가 필요하다.
요청 성격에 따라 나뉘는 빈
Session Bean으로 처리하는 동기 작업
Stateless Session Bean은 클라이언트 상태를 유지하지 않는다. 각 요청이 독립적으로 처리되며, 인스턴스 풀링을 통해 재사용할 수 있다.
Stateful Session Bean은 클라이언트별 상태를 보존한다. 대화형 세션 관리나 쇼핑 카트 같은 용도에 활용되며, 인스턴스가 클라이언트에 바인딩된다.
Singleton Session Bean은 애플리케이션당 하나의 인스턴스를 둔다. 전역 데이터를 공유하거나 초기화 시 구성 정보를 로드할 때 사용할 수 있다.
MDB로 연결하는 비동기 메시지
Message-Driven Bean(MDB)은 JMS(Java Message Service)와 연동해 큐 또는 토픽의 메시지를 받는다. 클라이언트가 MDB를 직접 호출하는 방식은 아니며, 컨테이너가 메시지 전달을 맡는다. Stateless로 동작하고 동시 메시지 처리가 가능하므로, 비동기 처리와 시스템 간 느슨한 결합이 필요한 경우에 적합하다.
컨테이너 접근과 트랜잭션 경계
EJB 컨테이너는 EJB 인스턴스 생명주기, 요청 라우팅, 트랜잭션·보안·동시성 서비스, 리소스 관리를 담당한다. EJB 2.x에서는 EJB Home이 빈의 생성과 검색을 맡고, EJB Object가 비즈니스 메서드를 노출했다. 인터셉터는 횡단 관심사를 처리하는 구성 요소다.
JNDI(Java Naming and Directory Interface)는 이름으로 컴포넌트를 조회하는 네이밍 서비스다. EJB의 검색과 접근, 위치 투명성을 제공하며 원격 EJB, 데이터소스, JMS 리소스 조회에 사용된다.
CMT에서는 컨테이너가 트랜잭션을 관리하고 어노테이션으로 설정한다. REQUIRED, REQUIRES_NEW, SUPPORTS 등이 여기에 포함된다. BMT는 빈이 UserTransaction API로 직접 트랜잭션을 관리하는 방식이다.
XML 중심 모델에서 Jakarta EE까지
EJB 2.x는 Home/Remote 인터페이스와 XML 기반 배포 서술자를 요구했다. Entity Bean도 지원했지만 단종됐고, 복잡한 코드 구조와 과도한 보일러플레이트, 테스트의 어려움, 개발 생산성 저하가 문제로 지적됐다.
EJB 3.x는 POJO 기반 개발과 어노테이션, 의존성 주입(DI), 인터셉터를 도입해 이를 단순화했다. @Stateless, @Stateful, @Singleton, @EJB, @TransactionAttribute, @RolesAllowed 같은 어노테이션을 사용한다.
EJB 3.2와 Jakarta EE에서는 @Asynchronous를 이용한 비동기 호출, 개선된 타이머 서비스, Lite 프로파일, CDI 통합을 제공한다.
Spring·CDI·마이크로서비스와의 관계
EJB는 Java EE 표준과 컨테이너 통합 서비스, 분산 트랜잭션 지원을 강점으로 둔다. Spring Framework는 경량 컨테이너, 유연성, 테스트 용이성, 풍부한 생태계가 특징이다.
CDI(Contexts and Dependency Injection)는 의존성 주입 표준이다. EJB 3.x에서는 CDI가 통합됐고, CDI 빈으로 비즈니스 로직을 구현할 수 있다. EJB는 트랜잭션과 보안 같은 추가 기능을 제공한다.
마이크로서비스 전환과 경량 프레임워크 선호, Kubernetes 같은 컨테이너 오케스트레이션의 확산으로 EJB의 사용은 감소했다. 그럼에도 레거시 시스템 유지보수와 대규모 분산 트랜잭션이 필요한 환경에서는 Jakarta EE와 함께 계속 사용된다.
금융과 대규모 엔터프라이즈에서의 활용
금융 시스템은 강력한 트랜잭션 보장, 분산 처리, 높은 보안을 요구한다. 이 경우 CMT로 트랜잭션을 관리하고, 역할 기반 보안과 클러스터링을 적용할 수 있다.
복잡한 비즈니스 로직과 다양한 시스템 연동, 확장성 요구가 있는 대규모 엔터프라이즈 환경에서는 Session Bean에 비즈니스 로직을 두고 MDB로 비동기 연동을 구성한다. 타이머 서비스는 배치 처리에 활용할 수 있다.