SOAP RPC vs WS 라이브러리 with MTOM 옵션

Kevin·2024년 10월 2일
1

Network

목록 보기
12/15
post-thumbnail

서론

가장 최근 개발 중 가장 크게 어려움을 겪었던 개발이 있었다.

바로 SOAP 통신이다.

SOAP 통신의 개념에 대해서 다룬 이전 글이 있는데, 해당 글을 작성 할 때만 하더라도 이렇게 큰 어려움을 겪을 줄 몰랐다.

이번에 어려움을 겪었던 내용을 요약하자면 아래와 같다.

java에서 SOAP 통신을 하기 위해 사용한 라이브러리인 javax.xml.ws와 javax.xml.rpc간 파일 전송 방식의 차이

먼저 javax.xml.rpcjavax.xml.ws 라이브러리에 대해서 간략하게 알고 가면 좋을 것 같다.

이 두 라이브러리는 SOAP 기반의 웹 서비스를 개발하기 위한 JAVA API이다.

먼저 javax.xml.rpc(이하 rpc라 서술) 라이브러리는 RPC 방식의 SOAP 메시징을 지원하며, 원격 서버의 메서드를 호출하는 방식으로 웹 서비스를 구현한다.

이 때 WSDL(Web Services Description Language)을 기반으로 클라이언트와 서버간 메서드 호출을 지원한다.

javax.xml.ws 라이브러리(이하 ws라 서술)는 rpc 라이브러리의 후속 SOAP 웹 서비스 API이다.

이를 통해 rpc에서 제공하던 기존 스타일 뿐만 아니라 RESTful 한 웹 서비스 또한 지원한다.

ws 라이브러리는 기존 SOAP 1.2에 대한 부실한 지원을 하던 rpc와 대조되게 기본적으로 지원한다. 또한 비동적으로 웹 서비스 호출을 지원하는 등의 확장되고 보완된 기능을 가지고 있다.

이러한 차이점으로부터 내 문제가 생기게 되었다.

기능 개발간 기존 참고할만한 소스 코드와 주어진 메뉴얼에서는 rpc 라이브러리를 사용하였고, 나는 특정 이유로 인해서 ws 라이브러리를 사용했어야만 했다.

이 때 SOAP 메세지에 첨부 파일을 첨부하기 위해 기존 rpc 라이브러리에서 사용하던 HandlerRegistry 객체 대신 HandlerResolver 객체를 사용하여 SOAP 메세지를 Intercept 하였다.

그 후 첨부파일을 AttachementPart로 첨부를 하였다.

이 때 정상적으로 SOAP 메세지 및 Attachment가 생성 되는 것을 확인 하였으나, 서버로부터 첨부 파일을 송신 받지 못했다는 메세지를 받게 되었다.

이 때 별 삽집이라는 삽질은 다 하였다.

예를 들어 SOAP Body에 해당 파일을 Base64로 인코딩 하여 직접 넣어주거나, SOAP Element 이름 하나 하나 올바른 형식이 확인하는 등 길게는 2주 정도의 시간을 투자 한 것 같다.

해결 방법은 굉장히 간단 했는데 바로 MTOM 옵션을 켜서 해결 하였다.

기존 소스 코드에서는 이 MTOM 옵션을 켜는 코드가 없어, ws 라이브러리를 통해 작성할 때도 나는 별도로 옵션을 작성하지 않았었다.

이제 이 MTOM 옵션이 어떠한 역할을 하는지와 왜 rpc 라이브러리에서는 작성하지 않았어도 되는 옵션이 ws에서는 작성 해야 하는지에 대해서도 다루고자 한다.


MTOM(Message Transmission Optimization Mechanism)

Map<String, Object> context = ((BindingProvider) port).getRequestContext();
context.put("mtom-enabled", true);

위 코드는 SOAP 통신간 MTOM(Message Transmission Optimization Mechanism) 기능을 활성화 하는 역할을 한다.

MTOM은 SOAP 메세지를 최적화된 방식으로 전송하기 위한 표준 방식이며, 이를 통해서 큰 바이너리 데이터를 Base64로 인코딩 하지 않고 첨부 파일로 전송 할 수 있다.

기존 소스 코드에서 사용된 rpc 라이브러리의 경우에는 기본적으로 MIME Multipart 메시지를 사용해 SOAP 메세지와 첨부 파일을 전송할 수 있는 기능을 지원해 별도로 Base64로 파일을 인코딩하지 않고도 첨부 파일을 직접 전송할 수 있다.

그렇기에 MTOM이 굳이 필요 없었던 것이다.

그러나 ws 라이브러리의 경우에는 SOAP 메세지를 기본적으로 모든 데이터를 XML 형식으로 다루며, 파일과 같은 바이너리 데이터를 전송할 때는 Base64로 인코딩 하여 XML 안에 포함 시키게 된다.

기존에는 해당 MTOM 기능이 활성화 되어있지 않아, 파일 내에서 Base64로 인코딩 되어 서버에서 파일 정보가 읽을 수 없게 되었던 것이다.

MTOM 기능을 활성화 하였기에 XML 메시지 자체에 데이터를 인코딩 하지 않고, 첨부 파일처럼 바이너리 데이터를 처리하여 파일이 정상적으로 송신 된 것이다.


느낀점

이번 삽질은 다른 삽질들에 비해 유독 길고 고독한 느낌이 많이 들었다.

다른 삽질은 그래도 레퍼런스도 많고, 자문을 구할 곳도 많았는데 SOAP 통신 그리고 ws 라이브러리에 대해서는 레퍼런스도 많이 않았다.

그 과정에서 낙심하고, 포기 하고 싶었던 적도 많았던 것 같다.

그러나 일의 힘듦 에 나온 아래 문구가 큰 힘이 되었다.

현재 내가 겪고 있는 스트레스는 IT 회사라면 어디를 가든 비슷하게 겪을거라고 봐요.

이 정도의 난이도가 IT 업계에서 낮은 레벨이라면 저희가 못 이겨낼 이유가 없고,이 정도가 정말 IT 업계 전체를 봐도 높은 난이도라면 이걸 이겨내면 그 이후에 어떤 일이든 쉽게 느껴질 것이구요.

어떤 상황이든 저희한테는 좋은 결과를 주는 것 같다는거죠.

결국 해냈고, 이제 다른 산들은 더 쉽게 느껴질 수 밖에 없다.

더 겸손히 정진하자. 고생했다.

profile
Hello, World! \n

0개의 댓글