43장. 핸들러 작성

초록

JAX-WS는 메시지 처리 모듈을 애플리케이션에 추가하기 위한 유연한 플러그인 프레임워크를 제공합니다. 핸들러라고 하는 이러한 모듈은 애플리케이션 수준 코드와 독립적이며 낮은 수준의 메시지 처리 기능을 제공할 수 있습니다.

43.1. 핸들러: 소개

43.1.1. 개요

서비스 프록시가 서비스에서 작업을 호출하면 작업의 매개 변수가 Apache CXF로 전달됩니다. 서비스에서 메시지를 수신한 경우 Apache CXF는 전선에서 메시지를 읽고 메시지를 재구성한 다음 작업 매개 변수를 작업을 수행하는 애플리케이션 코드로 전달합니다. 애플리케이션 코드가 요청 처리를 완료하면 응답 메시지에서 요청을 시작한 서비스 프록시로의 여행 시 유사한 이벤트 체인을 수행합니다. 이는 그림 43.1. “메시지 교환 경로” 에 표시됩니다.

그림 43.1. 메시지 교환 경로

클라이언트와 서버 간 메시지 교환 경로

JAX-WS는 애플리케이션 수준 코드와 네트워크 간에 메시지 데이터를 조작하는 메커니즘을 정의합니다. 예를 들어 열린 네트워크를 통해 메시지 데이터를 전달하려는 경우 독점 암호화 메커니즘을 사용하여 암호화할 수 있습니다. 데이터를 암호화하고 해독하는 JAX-WS 핸들러를 작성할 수 있습니다. 그런 다음 모든 클라이언트 및 서버의 메시지 처리 체인에 처리기를 삽입할 수 있습니다.

그림 43.2. “핸들러를 사용한 메시지 교환 경로” 에 표시된 대로 핸들러는 애플리케이션 수준 코드와 메시지를 네트워크에 배치하는 전송 코드 간에 이동하는 체인에 배치됩니다.

그림 43.2. 핸들러를 사용한 메시지 교환 경로

핸들러는 전송 계층과 애플리케이션 계층 간의 메시지 교환 경로에 배치됩니다.

43.1.2. 처리기 유형

JAX-WS 사양은 다음 두 가지 기본 핸들러 유형을 정의합니다.

  • 논리 핸들러 논리 핸들러는 메시지 페이로드 및 메시지 컨텍스트에 저장된 속성을 처리할 수 있습니다. 예를 들어 애플리케이션에서 순수 XML 메시지를 사용하는 경우 논리 핸들러는 전체 메시지에 액세스할 수 있습니다. 애플리케이션에서 SOAP 메시지를 사용하는 경우 논리 핸들러는 SOAP 본문의 콘텐츠에 액세스할 수 있습니다. 메시지 컨텍스트에 배치되지 않는 한 SOAP 헤더 또는 첨부 파일에 액세스할 수 없습니다.

    논리 핸들러는 처리기 체인의 애플리케이션 코드에 가장 가까운 위치에 배치됩니다. 즉, 메시지가 애플리케이션 코드에서 전송으로 전달될 때 먼저 실행됩니다. 메시지가 네트워크에서 수신되고 애플리케이션 코드로 다시 전달되면 논리 핸들러가 마지막에 실행됩니다.

  • 프로토콜 핸들러 프로토콜 핸들러는 네트워크에서 수신한 전체 메시지와 메시지 컨텍스트에 저장된 속성을 처리할 수 있습니다. 예를 들어 애플리케이션에서 SOAP 메시지를 사용하는 경우 프로토콜 처리기는 SOAP 본문, SOAP 헤더 및 모든 연결의 콘텐츠에 액세스할 수 있습니다.For example, if the application uses SOAP messages, the protocol handlers would have access to the contents of the SOAP body, the SOAP headers, and any attachments.

    프로토콜 핸들러는 처리기 체인의 전송에 가장 가까운 위치에 배치됩니다. 즉, 메시지가 네트워크에서 수신될 때 먼저 실행됩니다. 메시지가 애플리케이션 코드에서 네트워크로 전송되면 프로토콜 처리기가 마지막으로 실행됩니다.

    참고

    Apache CXF에서 지원하는 유일한 프로토콜 핸들러는 SOAP에 따라 다릅니다.

43.1.3. 핸들러 구현

두 핸들러 유형의 차이점은 매우 미묘하며 공통 기본 인터페이스를 공유합니다. 논리 핸들러와 프로토콜 핸들러는 공통의 부모로 인해 구현되어야 하는 여러 메서드를 공유합니다.

  • handleMessage() handleMessage() 메서드는 모든 처리기의 중앙 메서드입니다. 이 방법은 일반 메시지 처리를 담당합니다.
  • handleFault() handleFault() 는 오류 메시지를 처리하는 방법입니다.
  • close() close() 는 메시지가 체인의 끝에 도달할 때 핸들러 체인의 모든 실행된 핸들러에서 호출됩니다. 메시지 처리 중에 사용되는 리소스를 정리하는 데 사용됩니다.

논리 핸들러 구현과 프로토콜 핸들러 구현 간의 차이점은 다음과 같습니다.

  • 구현되는 특정 인터페이스

    모든 핸들러는 Handler 인터페이스에서 파생되는 인터페이스를 구현합니다. 논리 핸들러는 LogicalHandler 인터페이스를 구현합니다. 프로토콜 핸들러는 Handler 인터페이스의 프로토콜별 확장을 구현합니다. 예를 들어 SOAP 핸들러는 SOAPHandler 인터페이스를 구현합니다.

  • 처리기에서 사용할 수 있는 정보의 양입니다.

    프로토콜 핸들러는 메시지의 콘텐츠와 메시지 콘텐츠와 함께 패키지된 모든 프로토콜별 정보에 액세스할 수 있습니다. 논리 핸들러는 메시지의 콘텐츠에만 액세스할 수 있습니다. 논리 핸들러는 프로토콜 세부 정보에 대한 지식이 없습니다.

43.1.4. 애플리케이션에 핸들러 추가

애플리케이션에 처리기를 추가하려면 다음을 수행해야 합니다.

  1. 처리기를 서비스 공급자, 소비자 또는 둘 다에서 사용할지 여부를 결정합니다.
  2. 작업에 가장 적합한 핸들러 유형을 결정합니다.
  3. 올바른 인터페이스를 구현합니다.

    논리 핸들러를 구현하려면 43.2절. “논리 핸들러 구현” 에서 참조하십시오.

    프로토콜 핸들러를 구현하려면 43.4절. “프로토콜 핸들러 구현” 에서 참조하십시오.

  4. 핸들러를 사용하도록 끝점을 구성합니다. 43.10절. “핸들러를 사용하도록 끝점 구성” 을 참조하십시오.