12.1 메시징 개념
대부분 요청을 보내면 응답이 오기까지 기다리는 동기 처리에 익숙하여서, 요청을 보낸 후 응답을 기다리지 않고 곧바로 다른 일을 처리하는 비동기 처리에 대해 막연히 불안하게 생각될 수 있다.
비동기 처리에 대해 자주 예로 드는 것이 메일이다. 일상생활에서 종이로 보내는 메일이나 전자메일 모두 보내는 즉시 답변 메일이 오는 것이 아녀서 기다리지 않는다. 반면 전화는 실생활에서 경험할 수 있는 대표적인 동기 처리의 예이다. 통화 상대가 다른 일을 하고 있었더라도 연결되면 전화 통화를 시작하게 된다.
엔터프라이즈 시스템에서는 일반적으로 MQ(Message Queue) 혹은 MOM(Message Oriented Middleware)라고 부르는 비동기 메시징 시스템을 사용하여 여러 시스템 간에 메시지를 전송하여 처리하는 메시지 교환 시스템을 구현해 왔다. JMS는 Java 애플리케이션에서 이런 메시징 시스템을 구현하기 위한 표준이며, Java EE에도 초기부터 포함된 비교적 오랜 시간동안 발전해 온 표준이다. JMS를 사용하면 Java EE환경에서 간단하게 비동기 메시지 처리를 구현할 수 있다. 비동기 메시징을 사용하면 시스템 성능 향상, 자원 효율화, 처리 순서지정 등 여러 가지 장점이 있다.
시스템 간 메시지 전송을 비동기로 설계하면 하드웨어 리소스 사용률이 줄어들고 IO 작업을 최소화하며 네트워크 대역폭을 더 적게 사용할 수 있다.
동기 전송을 사용하는 RPC 방법은 요청에 대한 응답을 기다려야 하기 때문에 네트워크 지연 시간이 발생한다.
메시징 시스템은 메시지를 보내는 메시지 제공자와 메시지를 받는 메시지 소비자와 분리하여 처리한다. 메시지 제공자와 소비자는 완전히 독립적이며 유연하고 느슨한 결합 시스템을 만들 수 있다.
JMS는 메시지 지향 미들웨어(Message Oriented Middleware : MOM)라는 메시징 시스템에 접근하기 위한 표준 인터페이스이다. 즉 메시징 시스템 자체의 구현이 아닌 MOM 서비스를 이용하기 위한 Java 기반의 표준 인터페이스이다. JMS는 Java EE에 포함되어 있으며 JMS 표준은 벤더 중립적이다.
JMS 제공자는 트랜잭션 시스템을 사용하여 변경 사항을 원자적으로 커밋 또는 롤백한다. RPC를 기반으로 하는 시스템과 달리 메시징 시스템은 요청과 응답 사이에 비동기 메시지 전달 패턴을 주로 사용한다.
JMS를 이용하여 여러 애플리케이션이 서로 메시지를 전송하여 통신할 수 있다. 대부분의 메시징 형태는 피어 투 피어 형이고 JMS 애플리케이션은 대부분 ‘클라이언트’가 된다. JMS는 J2EE의 다른 서비스(JTA/JTS, JNDI, JDBC 등)와 연계하여 Servlet, JSP, EJB 애플리케이션에서 사용할 수 있다. 또 메시지 드리븐 빈을 통해 JMS메시지를 수신하여 동작하는 비동기 EJB를 만들 수 있다.
JMS의 특징을 정리하면 다음과 같다.
- Java 애플리케이션에서 기존 MOM시스템과 메시지를 주고받을 수 있다.
- 메시지를 작성하고 송수신하기 위한 표준 인터페이스가 제공되어 메시징 애플리케이션 개발이 쉬워진다.
- 표준화된 메시징 API 를 사용하여 메시징 애플리케이션의 이식성을 높일 수 있다.