JCA로 엔터프라이즈 시스템을 통합하는 방식
JCA의 Resource Adapter와 시스템 레벨 계약을 중심으로 EIS 통합, 연결·트랜잭션·보안 관리 방식을 정리한다.
2026-08-14 · 최초 발행 2026-01-12
EIS 연결을 Resource Adapter로 표준화한다
JCA(J2EE Connector Architecture)는 Java EE 애플리케이션 서버와 이기종 엔터프라이즈 정보 시스템(EIS)을 정해진 방식으로 연결하기 위한 Java EE 표준 아키텍처다. ERP, CRM, 메인프레임, 레거시 시스템, 메시징 시스템마다 별도 API와 통합 코드를 두는 대신, Resource Adapter를 경계로 삼는다.
JCA는 JSR 322 표준이며, 애플리케이션 서버가 제공하는 연결 관리, 트랜잭션 관리, 보안 관리, 라이프사이클 관리 기능을 EIS 연동에 활용하게 한다.
여기서 EIS는 Enterprise Information System을 뜻한다. Resource Adapter는 그 EIS와 실제 연결을 구현하는 커넥터이며, 애플리케이션 서버와 어댑터 사이에는 System Contract, 애플리케이션과 어댑터 사이에는 Application Contract가 놓인다. Resource Adapter는 .rar 파일로 배포되고, Connection Factory와 Managed Connection, EIS 특화 API인 CCI(Common Client Interface)를 중심으로 동작한다.
JDBC는 관계형 데이터베이스에 한정된 연결 방식이다. ERP나 메인프레임처럼 비관계형 시스템까지 포함하려면 더 범용적인 연결 아키텍처가 필요하다. JCA는 플러그 가능한 Resource Adapter, 애플리케이션 서버 독립성, 벤더 중립성을 목표로 하며, 하나의 어댑터를 여러 애플리케이션에서 재사용할 수 있다.
애플리케이션 서버와 어댑터가 나누는 계약
JCA의 핵심은 EIS별 구현을 Resource Adapter에 두되, 공통 운영 책임을 애플리케이션 서버와의 계약으로 분리하는 데 있다.
Connection Management Contract는 연결 생성·해제와 재사용, 연결 풀링, 자원 최적화를 다룬다. Transaction Management Contract는 분산 트랜잭션, XA 트랜잭션, 2-Phase Commit, 트랜잭션 컨텍스트 전파를 지원한다.
Security Management Contract에는 인증과 권한, 보안 컨텍스트 전파, 싱글 사인온(SSO), 자격증명 매핑이 포함된다. Lifecycle Management Contract는 Resource Adapter의 시작·중지, 설정, 이벤트 알림, 모니터링을 맡는다. Work Management Contract는 비동기 작업 실행, 스레드 풀 관리, 작업 스케줄링, 동시성 제어를 위한 범위다.
Resource Adapter는 Managed Connection Factory, Managed Connection, Connection Factory, 애플리케이션용 Connection 핸들로 구성된다. Java EE에서 EIS로 요청하고 응답을 받는 Outbound Adapter, EIS 이벤트나 메시지를 Java EE로 전달하는 Inbound Adapter, 양쪽을 모두 지원하는 Bidirectional Adapter가 있다.
애플리케이션 서버는 어댑터의 배포·등록·라이프사이클·설정을 관리하고, 연결 풀링, 트랜잭션 관리자, 보안 관리자, Work Manager를 제공한다. 애플리케이션은 JNDI 등록, 의존성 주입, 리소스 참조를 통해 이를 사용한다.
연결과 트랜잭션을 관리하는 인터페이스
ManagedConnectionFactory는 물리적 연결과 연결 팩토리를 만들고, 연결 매칭과 연결 풀링을 지원한다.
public interface ManagedConnectionFactory {
ManagedConnection createManagedConnection(
Subject subject,
ConnectionRequestInfo cxRequestInfo
) throws ResourceException;
Object createConnectionFactory(ConnectionManager cxManager)
throws ResourceException;
}
ManagedConnection은 EIS와의 물리적 연결을 나타낸다. 애플리케이션용 연결 핸들을 제공하고, 이벤트 알림과 자원 정리를 수행한다.
public interface ManagedConnection {
Object getConnection(Subject subject, ConnectionRequestInfo cxRequestInfo)
throws ResourceException;
void destroy() throws ResourceException;
void cleanup() throws ResourceException;
}
트랜잭션은 JTA(Java Transaction API)와 통합할 수 있으며, 분산 트랜잭션과 2-Phase Commit, 트랜잭션 복구를 지원한다. 지원 수준은 NoTransaction, LocalTransaction, XATransaction으로 구분된다.
public interface LocalTransaction {
void begin() throws ResourceException;
void commit() throws ResourceException;
void rollback() throws ResourceException;
}
보안에서는 Container-Managed Sign-On, Component-Managed Sign-On, Principal Mapping, Kerberos 등 표준 프로토콜을 활용할 수 있다. JAAS(Java Authentication and Authorization Service), Subject 기반 인증, 역할 기반 접근 제어, 보안 도메인과도 연결된다.
PasswordCredential credential = new PasswordCredential(username, password);
Subject subject = new Subject();
subject.getPrivateCredentials().add(credential);
Resource Adapter의 시작과 이벤트 수신
라이프사이클 단계에서 BootstrapContext는 WorkManager, XATerminator, Timer를 제공한다.
public interface BootstrapContext {
WorkManager getWorkManager();
XATerminator getXATerminator();
Timer createTimer() throws UnavailableException;
}
ResourceAdapter 인터페이스는 시작과 중지를 처리하며, Message Endpoint의 활성화와 비활성화도 담당한다.
public interface ResourceAdapter {
void start(BootstrapContext ctx) throws ResourceAdapterInternalException;
void stop();
void endpointActivation(MessageEndpointFactory endpointFactory,
ActivationSpec spec) throws ResourceException;
void endpointDeactivation(MessageEndpointFactory endpointFactory,
ActivationSpec spec);
}
이 과정에서는 시작·중지 이벤트, 연결 이벤트, 트랜잭션 이벤트, 오류 이벤트를 관리한다.
요청형과 이벤트형 통신 구현
Outbound Communication은 Java EE 애플리케이션이 EIS에 요청하는 동기 호출이다. 요청-응답 패턴에 연결 풀링을 결합하는 형태다.
// Connection Factory
@ConnectionDefinition(
connectionFactory = MyConnectionFactory.class,
connectionFactoryImpl = MyConnectionFactoryImpl.class,
connection = MyConnection.class,
connectionImpl = MyConnectionImpl.class
)
public class MyManagedConnectionFactory implements ManagedConnectionFactory {
// 구현
}
// 애플리케이션 사용
@Resource(lookup = "java:/eis/MyConnectionFactory")
private MyConnectionFactory connectionFactory;
public void doSomething() {
MyConnection connection = connectionFactory.getConnection();
try {
// EIS 작업 수행
connection.execute("some operation");
} finally {
connection.close();
}
}
Inbound Communication은 EIS가 Java EE 애플리케이션으로 이벤트나 메시지를 전달하는 비동기 방식이다. 메시지 기반으로 동작하며 Message-Driven Bean(MDB)을 활용한다.
@Activation(
messageListeners = MyMessageListener.class
)
public class MyActivationSpec implements ActivationSpec {
private String destinationName;
private String destinationType;
// getter/setter
}
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(
propertyName = "destinationName",
propertyValue = "myQueue"
)
}
)
public class MyMessageDrivenBean implements MyMessageListener {
public void onMessage(Message message) {
// 메시지 처리
}
}
Resource Adapter의 메타데이터는 ra.xml 배포 디스크립터에 기록한다.
<connector>
<vendor-name>MyCompany</vendor-name>
<eis-type>MyEIS</eis-type>
<resourceadapter-version>1.0</resourceadapter-version>
<resourceadapter>
<resourceadapter-class>com.example.MyResourceAdapter</resourceadapter-class>
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>
com.example.MyManagedConnectionFactory
</managedconnectionfactory-class>
<connectionfactory-interface>
com.example.MyConnectionFactory
</connectionfactory-interface>
<connection-interface>
com.example.MyConnection
</connection-interface>
</connection-definition>
<transaction-support>XATransaction</transaction-support>
</outbound-resourceadapter>
<inbound-resourceadapter>
<messageadapter>
<messagelistener>
<messagelistener-type>
com.example.MyMessageListener
</messagelistener-type>
<activationspec>
<activationspec-class>
com.example.MyActivationSpec
</activationspec-class>
</activationspec>
</messagelistener>
</messageadapter>
</inbound-resourceadapter>
</resourceadapter>
</connector>
JDBC, JMS, 웹 서비스와 구분되는 지점
JDBC는 관계형 데이터베이스에서 SQL 쿼리를 실행하고 트랜잭션 및 DataSource 기반 연결 풀링을 제공한다. 반면 JCA는 모든 종류의 EIS를 대상으로 EIS 특화 API와 XA 트랜잭션, 시스템 레벨 계약을 제공한다. JDBC가 RDBMS 중심이라면 JCA의 범위는 더 넓지만 구조는 더 복잡하다.
JMS는 Point-to-Point와 Publish-Subscribe 방식의 비동기 메시징을 다루며, ActiveMQ와 RabbitMQ 같은 메시지 브로커를 사용한다. JCA는 Resource Adapter를 통해 동기와 비동기를 함께 다루는 범용 EIS 연결 방식이다. JMS 제공자는 JCA Resource Adapter로 구현될 수 있고, JCA Inbound Adapter는 JMS MDB와 대응된다.
웹 서비스(JAX-WS, JAX-RS)는 HTTP, SOAP, REST를 기반으로 느슨한 결합과 플랫폼 독립성을 제공한다. JCA는 직접 프로토콜을 사용하며, 내부 EIS에서 성능과 트랜잭션 통합이 필요한 경우에 적합하다. 외부 시스템과 표준 프로토콜로 느슨하게 연결할 때는 웹 서비스가 선택 기준이 된다.
ERP와 레거시 환경에서의 활용
SAP R/3에서는 SAP JCo(Java Connector)를 JCA Resource Adapter로 래핑하여 BAPI(Business API)와 RFC(Remote Function Call) 프로토콜을 호출할 수 있다. Oracle E-Business Suite에서는 Oracle JCA Adapter로 PL/SQL을 호출하고, 비즈니스 이벤트 수신과 데이터 동기화를 처리한다. 주문 처리 자동화, 재고 조회, 고객 정보 동기화, 보고서 생성이 이 범위에 포함된다.
IBM CICS는 CICS Transaction Gateway(CTG)와 JCA Resource Adapter로 트랜잭션 호출 및 3270 에뮬레이션을 연결한다. IBM IMS는 IMS Connect와 JCA 기반 통합을 통해 트랜잭션 메시지와 데이터베이스 접근을 제공한다. 이 구조는 레거시 트랜잭션 재사용, 코볼 프로그램 호출, 데이터 마이그레이션, 하이브리드 아키텍처에 쓰인다.
AS/400(IBM i)은 JTOpen(Java Toolbox), JCA Adapter, 프로그램 호출, 데이터 큐와 연계할 수 있다. 독자 프로토콜을 사용하는 시스템이라면 커스텀 JCA Adapter를 개발해 소켓 기반 통신이나 바이너리 프로토콜을 통합할 수 있다.
메시징 환경에서는 IBM MQ Resource Adapter가 JMS, 트랜잭션 메시징, 신뢰성 있는 전달을 지원한다. Apache ActiveMQ Resource Adapter는 JMS 1.1/2.0, Embedded Broker, Spring 통합을 제공한다.
표준화의 이점과 운영상의 부담
JCA는 Java EE 표준에 기반한 일관된 통합 방법과 벤더 중립성, 재사용 가능한 어댑터를 제공한다. 연결 풀링은 자동 관리할 수 있고, 트랜잭션은 JTA, 보안은 JAAS, 스레드 관리는 Work Manager와 통합된다. Outbound와 Inbound를 모두 지원하며, 기존 어댑터를 재사용하거나 커스텀 어댑터를 개발할 수도 있다. 연결 재사용, 트랜잭션 최적화, 배치 처리, 비동기 메시징도 장점이다.
반대로 Resource Adapter 개발에는 높은 학습 곡선과 복잡한 아키텍처, 많은 인터페이스, 디버깅 부담이 따른다. 테스트와 검증, 배포와 관리, 전문 지식도 필요하다. REST·SOAP 기반 웹 서비스, JMS·AMQP 메시징, ESB(Enterprise Service Bus), 마이크로서비스 아키텍처가 대안으로 부상하면서, JCA는 엔터프라이즈 환경과 애플리케이션 서버에 의존하고 클라우드 네이티브 환경에는 부적합한 기술로 인식되어 제한적으로 사용된다.