55장. Apache CXF 런타임의 인터셉터
초록
Apache CXF 런타임의 대부분의 기능은 인터셉터에 의해 구현됩니다. Apache CXF 런타임에서 생성한 모든 끝점에는 메시지 처리를 위한 3개의 잠재적인 인터셉터 체인이 있습니다. 이러한 체인의 인터셉터는 전선에서 전송되는 원시 데이터와 끝점의 구현 코드에서 처리하는 Java 오브젝트 간에 메시지를 변환하는 역할을 합니다. 인터셉터는 적절한 순서로 처리가 이루어지도록 단계별로 구성됩니다.
55.1. 개요
Apache CXF가 처리하는 주요 부분에는 메시지 처리 작업이 포함됩니다. 소비자가 원격 서비스에서 호출하면 런타임에서 데이터를 사용 가능한 메시지로 마샬링해야 합니다. 서비스 공급자는 메시지를 손상되지 않고 비즈니스 논리를 실행하고 적절한 메시지 형식으로 응답을 마샬링해야 합니다. 그런 다음 소비자는 응답 메시지를 미수하고 적절한 요청과 상호 작용한 후 소비자의 애플리케이션 코드로 다시 전달해야 합니다. 기본적인 마샬링 및 unmarshaling 외에도 Apache CXF 런타임은 메시지 데이터를 사용하여 여러 다른 작업을 수행할 수 있습니다. 예를 들어 WS-RM이 활성화된 경우 런타임은 메시지를 마샬링하고 구분 해제하기 전에 메시지 청크 및 승인 메시지를 처리해야 합니다. 보안이 활성화되면 런타임은 메시지 처리 순서의 일부로 메시지의 자격 증명을 검증해야 합니다.
그림 55.1. “Apache CXF 인터셉터 체인” 서비스 공급자가 수신할 때 요청 메시지가 걸리는 기본 경로를 표시합니다.
그림 55.1. Apache CXF 인터셉터 체인
55.2. Apache CXF에서 메시지 처리
Apache CXF 개발 소비자가 원격 서비스를 호출하면 다음과 같은 메시지 처리 시퀀스가 시작됩니다.
- Apache CXF 런타임은 요청을 처리하는 아웃바운드 인터셉터 체인을 생성합니다.
- 호출이 양방향 메시지 교환을 시작하면 런타임은 인바운드 인터셉터 체인과 오류 처리 인터셉터 체인을 생성합니다.
요청 메시지는 아웃바운드 인터셉터 체인을 통해 순차적으로 전달됩니다.
체인의 각 인터셉터는 메시지에서 일부 처리를 수행합니다. 예를 들어 Apache CXF는 SOAP 인터셉터를 제공하고 SOAP 봉투로 메시지를 패키징했습니다.
아웃바운드 체인의 인터셉터 중 하나라도 오류 조건을 생성하면 체인이 unwound이고 제어가 애플리케이션 수준 코드로 반환됩니다.
인터셉터 체인은 이전에 호출한 모든 인터셉터에서 fault 처리 방법을 호출하여 작동하지 않습니다.
- 요청은 적절한 서비스 공급자로 디스패치됩니다.
응답이 수신되면 인바운드 인터셉터 체인을 통해 순차적으로 전달됩니다.
참고응답이 오류 메시지이면 오류 처리 인터셉터 체인으로 전달됩니다.
- 인바운드 체인의 인터셉터 중 하나라도 오류 조건을 생성하면 체인이 불필요합니다.
- 메시지가 인바운드 인터셉터 체인의 끝에 도달하면 애플리케이션 코드로 다시 전달됩니다.
Apache CXF 개발 서비스 공급자가 소비자로부터 요청을 수신하면 비슷한 프로세스가 수행됩니다.
- Apache CXF 런타임은 요청 메시지를 처리하는 인바운드 인터셉터 체인을 생성합니다.
- 요청이 양방향 메시지 교환의 일부인 경우 런타임은 아웃바운드 인터셉터 체인과 오류 처리 인터셉터 체인도 생성합니다.
- 요청은 인바운드 인터셉터 체인을 통해 순차적으로 전달됩니다.
인바운드 체인의 인터셉터 중 하나라도 오류 조건을 생성하면 체인이 unwound이고 오류가 소비자에게 디스패치됩니다.
인터셉터 체인은 이전에 호출한 모든 인터셉터에서 fault 처리 방법을 호출하여 작동하지 않습니다.
- 요청이 인바운드 인터셉터 체인의 끝에 도달하면 서비스 구현으로 전달됩니다.
응답이 준비되면 아웃바운드 인터셉터 체인을 통해 순차적으로 전달됩니다.
참고응답이 예외인 경우 오류 처리 인터셉터 체인을 통해 전달됩니다.
- 아웃바운드 체인의 인터셉터 중 하나라도 오류 조건을 생성하면 체인이 불필요하고 오류 메시지가 디스패치됩니다.
- 요청이 아웃바운드 체인의 끝에 도달하면 소비자에게 디스패치됩니다.
55.3. 인터셉터
Apache CXF 런타임의 모든 메시지 처리는 인터셉터에서 수행합니다. 인터셉터는 애플리케이션 계층에 전달되기 전에 메시지 데이터에 액세스할 수 있는 POJO입니다. 메시지를 변환하거나, 메시지에서 헤더를 제거하거나, 메시지 데이터를 검증하는 등 여러 가지 작업을 수행할 수 있습니다. 예를 들어 인터셉터는 메시지에서 보안 헤더를 읽고, 외부 보안 서비스에 대한 인증 정보를 확인하고, 메시지 처리를 계속할 수 있는지 결정할 수 있습니다.
인터셉터에서 사용할 수 있는 메시지 데이터는 여러 요인으로 결정됩니다.
- 인터셉터 체인
- 인터셉터의 단계
- 체인에서 이전에 발생한 다른 인터셉터
55.4. 단계
인터셉터는 단계로 구성됩니다. 단계는 공통 기능이 있는 인터셉터의 논리적 그룹입니다. 각 단계는 특정 유형의 메시지 처리를 담당합니다. 예를 들어 애플리케이션 계층에 전달되는 마샬링 Java 개체를 처리하는 인터셉터는 모두 동일한 단계에서 수행됩니다.
55.5. 인터셉터 체인
단계는 인터셉터 체인에 집계됩니다. 인터셉터 체인은 메시지가 인바운드 또는 아웃바운드인지를 기반으로 정렬되는 인터셉터 단계 목록입니다.
Apache CXF를 사용하여 생성된 각 엔드포인트에는 세 개의 인터셉터 체인이 있습니다.
- 인바운드 메시지의 체인
- 아웃바운드 메시지의 체인
- 오류 메시지의 체인
인터셉터 체인은 주로 끝점에서 사용하는 바인딩 및 전송의 선택에 따라 구성됩니다. 보안 또는 로깅과 같은 다른 런타임 기능을 추가하면 체인에 인터셉터도 추가됩니다. 개발자는 구성을 사용하여 체인에 사용자 정의 인터셉터를 추가할 수도 있습니다.
55.6. 인터셉터 개발
기능에 관계없이 인터셉터를 개발하는 작업은 항상 동일한 기본 절차를 따릅니다.
Apache CXF는 사용자 정의 인터셉터를 더 쉽게 개발할 수 있도록 다양한 추상 인터셉터를 제공합니다.
인터셉터를 사용하려면 메시지의 특정 부분을 사용할 수 있어야 하며 데이터가 특정 형식이어야 합니다. 메시지의 콘텐츠와 데이터 형식은 인터셉터 단계에 따라 부분적으로 결정됩니다.
일반적으로 단계 내의 인터셉터 순서는 중요하지 않습니다. 그러나 특정 상황에서는 인터셉터가 동일한 단계에서 다른 인터셉터 이전 또는 이후에 실행되는지 확인해야 할 수 있습니다.
- 58.2절. “메시지 처리”
인터셉터가 실행된 후 활성 인터셉터 체인에서 오류가 발생하면 해당 오류 처리 논리가 호출됩니다.
- 59장. Interceptors를 사용하도록 끝점 구성