정책 구성 사용

Apigee Edge 문서입니다.
Go to the Apigee X 문서로 이동합니다.
info

이 주제에서는 정책 구성 을 사용하여 매시업을 만드는 방법을 알아봅니다. 정책 구성은 정책을 사용하여 여러 백엔드 대상의 결과를 단일 응답으로 결합할 수 있는 Apigee 프록시 패턴입니다.

정책 구성에 대한 일반적인 개요는 API 프록시 설명서 패턴의 "정책 구성 패턴" 을 참조하세요.

샘플 코드 다운로드 및 사용해 보기

이 설명서 예시 정보

이 설명서 예시는 정책 구성 이라는 API 프록시 패턴을 보여줍니다. 이 패턴은 여러 백엔드 소스의 데이터를 매시업하는 한 가지 방법을 제공합니다 (다른 방법도 있음). 일반적으로 이 주제에서는 정책을 결합하고 연결하여 원하는 결과를 생성하는 방법을 보여줍니다. 이 패턴 및 기타 관련 패턴에 대한 일반적인 개요는 API 프록시 설명서 패턴을 참조하세요.

여기에서 설명하는 예시에서는 정책 구성을 사용하여 다음과 같은 두 개의 별도 공개 API의 데이터를 매시업합니다.

  • Google Geocoding API: 이 API는 주소 (예: "1600 Amphitheatre Parkway, Mountain View, CA") 를 지리 좌표 (예: 위도 37.423021 및 경도 -122.083739)로 변환합니다.
  • Google Elevation API 이 API는 전 세계 위치의 고도 데이터를 쿼리할 수 있는 간단한 인터페이스를 제공합니다. 이 예시에서는 Geocoding API에서 반환된 좌표가 이 API의 입력 으로 사용됩니다.

앱 개발자는 우편번호와 국가 ID라는 두 개의 쿼리 매개변수를 사용하여 이 API 프록시를 호출합니다.

$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"

응답은 제공된 우편번호 영역의 중심에 대한 지오코딩된 위치 (위도/경도)와 해당 지오코딩된 위치의 고도를 결합한 JSON 객체입니다.

{  
   "ElevationResponse":{  
      "status":"OK",
      "result":{  
         "location":{  
            "lat":"39.7500713",
            "lng":"-74.1357407"
         },
         "elevation":"0.5045232",
         "resolution":"76.3516159"
      }
   }
}

시작하기 전에

정책 구성 패턴에 대한 간략한 개요를 읽으려면 API 프록시 설명서 패턴의 '정책 구성 패턴'을 참조하세요.

이 설명서 예시를 살펴보기 전에 다음과 같은 기본 개념도 숙지해야 합니다.

  • 정책이란 무엇이며 프록시에 정책을 연결하는 방법. 정책에 대한 좋은 소개는 정책이란 무엇인가요?를 참조하세요.
  • 흐름 구성에 설명된 대로 API 프록시 흐름의 구조. 흐름을 사용하면 API 프록시에서 정책이 실행되는 순서를 지정할 수 있습니다. 이 예시에서는 여러 정책이 생성되어 API 프록시의 흐름에 추가됩니다.
  • API 프록시 구성 참조에 설명된 대로 파일 시스템에서 API 프록시 프로젝트가 구성되는 방법 . 이 설명서 주제에서는 관리 UI를 사용하여 API 프록시를 개발할 수 있는 클라우드 기반 개발이 아닌 로컬 개발 (파일 시스템 기반)을 보여줍니다.
  • API 키 유효성 검사 사용. 이는 API에 구성할 수 있는 가장 간단한 앱 기반 보안 양식입니다. 자세한 내용은 API 키를 참조하세요. API 키를 요구하여 API 보호하기 가이드를 살펴볼 수도 있습니다.
  • XML에 대한 실무 지식. 이 예시에서는 파일 시스템에 있는 XML 파일을 사용하여 API 프록시와 정책을 빌드합니다.

샘플 코드를 다운로드한 경우 이 주제에서 설명하는 모든 파일을 mashup-policy-cookbook 샘플 폴더에서 찾을 수 있습니다. 다음 섹션에서는 샘플 코드에 대해 자세히 설명합니다.

흐름을 따르는 순응자

정책으로 이동하기 전에 예시 API 프록시의 기본 흐름을 살펴보겠습니다. 아래에 표시된 흐름 XML은 이 프록시, 프록시에서 사용하는 정책 , 이러한 정책이 호출되는 위치에 대해 많은 정보를 제공합니다.

샘플 다운로드에서 파일 doc-samples/policy-mashup-cookbook/apiproxy/proxies/default.xml에서 이 XML을 찾을 수 있습니다.

<ProxyEndpoint name="default">
  <Flows>
    <Flow name="default">
      <Request>
            <!-- Generate request message for the Google Geocoding API -->
            <Step><Name>GenerateGeocodingRequest</Name></Step>
            <!-- Call the Google Geocoding API -->
            <Step><Name>ExecuteGeocodingRequest</Name></Step>
            <!-- Parse the response and set variables -->
            <Step><Name>ParseGeocodingResponse</Name></Step>
            <!-- Generate request message for the Google Elevation API -->
            <Step><Name>AssignElevationParameters</Name></Step>
      </Request>
      <Response>
            <!-- Parse the response message from the Elevation API -->
            <Step><Name>ParseElevationResponse</Name></Step>
            <!-- Generate the final JSON-formatted response with JavaScript -->
            <Step><Name>GenerateResponse</Name></Step>
      </Response>
    </Flow>
  </Flows>

  <HTTPProxyConnection>
    <!-- Add a base path to the ProxyEndpoint for URI pattern matching-->
    <BasePath>/policy-mashup-cookbook</BasePath>
    <!-- Listen on both HTTP and HTTPS endpoints -->
    <VirtualHost>default</VirtualHost>
    <VirtualHost>secure</VirtualHost>
  </HTTPProxyConnection>
  <RouteRule name="default">
    <!-- Connect ProxyEndpoint to named TargetEndpoint under /targets -->
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

다음은 흐름 요소의 요약입니다.

  • <Request> - <Request> 요소는 여러 <Step> 요소로 구성됩니다. 각 단계에서는 이 주제의 나머지 부분에서 만들 정책 중 하나를 호출합니다. 이러한 정책은 요청 메시지 생성, 전송, 응답 파싱과 관련이 있습니다. 이 주제가 끝나면 이러한 각 정책의 역할을 이해하게 됩니다.
  • <Response> - <Response> 요소에는 <Steps>도 포함됩니다. 이러한 단계에서는 대상 엔드포인트 (Google Elevation API)의 최종 응답을 처리하는 정책도 호출합니다.
  • <HttpProxyConnection> - 이 요소는 이 API 프록시에 앱이 연결되는 방법에 대한 세부정보를 지정합니다. 여기에는 이 API가 호출되는 방법을 지정하는 <BasePath>가 포함됩니다.
  • <RouteRule> - 이 요소는 인바운드 요청 메시지가 처리된 직후에 발생하는 작업을 지정합니다. 이 경우 TargetEndpoint가 호출됩니다. 이 중요한 단계에 대해서는 이 주제의 뒷부분에서 자세히 설명합니다.

정책 만들기

다음 섹션에서는 이 정책 구성 예시를 구성하는 각 정책에 대해 설명합니다.

첫 번째 AssignMessage 정책 만들기

아래에 나열된 첫 번째 AssignMessage 정책은 Google Geocoding 서비스로 전송될 요청 메시지를 만듭니다.

정책 코드로 시작한 다음 요소에 대해 자세히 설명하겠습니다. 샘플 다운로드에서 doc-samples/policy-mashup-cookbook/apiproxy/policies/GenerateGeocodingRequest.xml 파일에서 이 XML을 찾을 수 있습니다.

<AssignMessage name="GenerateGeocodingRequest">
  <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
  <Set>
    <QueryParams>
      <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
      <QueryParam name="region">{request.queryparam.country}</QueryParam>
      <QueryParam name="sensor">false</QueryParam>
    </QueryParams>
    <Verb>GET</Verb>
  </Set>
  <!-- Set variables for use in the final response -->
  <AssignVariable>
    <Name>PostalCode</Name>
    <Ref>request.queryparam.postalcode</Ref>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
  </AssignVariable>
</AssignMessage>

다음은 이 정책의 요소에 대한 간략한 설명입니다. 이 정책에 대한 자세한 내용은 메시지 할당 정책을 참조하세요.

  • <AssignMessage name> - 이 정책에 이름을 지정합니다. 이름은 흐름에서 정책을 참조할 때 사용됩니다.
  • <AssignTo> - GeocodingRequest라는 이름의 변수를 만듭니다. 이 변수는 ServiceCallout 정책에 의해 백엔드로 전송될 요청 객체를 캡슐화합니다.
  • <QueryParams> - 백엔드 API 호출에 필요한 쿼리 매개변수를 설정합니다. 이 경우 Geocoding API는 우편번호와 국가 ID로 표현되는 위치를 알아야 합니다. 앱 사용자가 이 정보를 제공하며 여기에서 이 정보를 추출하기만 하면 됩니다. sensor 매개변수는 API에 필요하며 true 또는 false입니다. 여기서는 false로 하드코딩합니다.
  • <Verb> - 이 경우 API에 간단한 GET 요청을 수행합니다.
  • <AssignVariable> - 이러한 변수는 API에 전달하는 값을 저장합니다. 이 예시에서는 변수가 나중에 클라이언트에 반환된 응답 에서 액세스됩니다.

ServiceCallout으로 요청 전송

정책 구성 시퀀스의 다음 단계는 ServiceCallout 정책을 만드는 것입니다. 아래에 나열된 ServiceCallout 정책은 이전 AssignMessage 정책에서 만든 요청 객체를 Google Geocoding 서비스로 전송하고 결과를 GeocodingResponse라는 변수에 저장합니다.

이전과 마찬가지로 먼저 코드를 살펴보겠습니다. 자세한 설명은 다음과 같습니다. 이 정책에 대한 자세한 내용은 서비스 콜아웃 정책을 참조하세요. 샘플 다운로드에서 파일 doc-samples/policy-mashup-cookbook/apiproxy/policies/ExecuteGeocodingRequest.xml에서 이 XML을 찾을 수 있습니다.

<ServiceCallout name="ExecuteGeocodingRequest">
  <Request variable="GeocodingRequest"/>
  <Response>GeocodingResponse</Response>
  <HTTPTargetConnection>
    <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
  </HTTPTargetConnection>
</ServiceCallout>

다음은 이 정책의 요소에 대한 간략한 설명입니다.

  • <ServiceCallout> - 이전 정책과 마찬가지로 이 정책에도 이름이 있습니다.
  • <Request variable> - AssignMessage 정책에서 만든 변수입니다. 백엔드 API로 이동하는 요청을 캡슐화합니다.
  • <Response> - 이 요소는 응답이 저장되는 변수의 이름을 지정합니다. 이 변수는 나중에 ExtractVariables 정책에서 액세스됩니다.
  • <HTTPTargetConnection> - 백엔드 API의 대상 URL을 지정합니다. 이 경우 API가 JSON 응답을 반환하도록 지정합니다.

이제 백엔드 API (Google Geocoding API)를 사용하는 데 필요한 요청 정보를 지정하는 정책과 백엔드 API로 요청을 실제로 전송하는 정책이라는 두 가지 정책이 있습니다. 다음으로 응답을 처리합니다.

ExtractVariables로 응답 파싱

ExtractVariables 정책은 ServiceCallout 정책에서 가져온 응답 메시지의 콘텐츠를 파싱하는 간단한 메커니즘을 제공합니다. ExtractVariables는 JSON 또는 XML을 파싱하는 데 사용하거나 URI 경로, HTTP 헤더, 쿼리 매개변수, 양식 매개변수에서 콘텐츠를 추출하는 데 사용할 수 있습니다.

다음은 ExtractVariables 정책의 목록입니다. 이 정책에 대한 자세한 내용은 변수 추출 정책을 참조하세요. 샘플 다운로드에서 파일 doc-samples/policy-mashup-cookbook/apiproxy/policies/ParseGeocodingResponse.xml에서 이 XML을 찾을 수 있습니다.

<ExtractVariables name="ParseGeocodingResponse">
  <Source>GeocodingResponse</Source>
  <VariablePrefix>geocoderesponse</VariablePrefix>
  <JSONPayload>
    <Variable name="latitude">
       <JSONPath>$.results[0].geometry.location.lat</JSONPath>
    </Variable>
    <Variable name="longitude">
       <JSONPath>$.results[0].geometry.location.lng</JSONPath>
    </Variable>
  </JSONPayload>
</ExtractVariables>

ExtractVariable 정책의 주요 요소는 다음과 같습니다.

  • <ExtractVariables name> - 다시 말하지만 정책 이름은 흐름에서 사용될 때 정책을 참조하는 데 사용됩니다.
  • <Source> - ServiceCallout 정책에서 만든 응답 변수를 지정합니다. 이 정책이 데이터를 추출하는 변수입니다.
  • <VariablePrefix> - 변수 프리픽스는 이 정책에서 만든 다른 변수의 네임스페이스를 지정합니다. 프리픽스는 Edge's 사전 정의된 변수에서 정의한 예약된 이름을 제외한 모든 이름이 될 수 있습니다.
  • <JSONPayload> - 이 요소는 관심 있는 응답 데이터를 가져와서 이름이 지정된 변수에 넣습니다. 실제로 Geocoding API는 위도와 경도보다 훨씬 많은 정보를 반환합니다. 하지만 이 샘플에는 이러한 값만 필요합니다. Geocoding API에서 반환된 JSON의 전체 렌더링은 API의 문서에서 확인할 수 있습니다. geometry.location.lat 및 geometry.location.lng의 값은 반환된 JSON 객체의 여러 필드 중 두 개일 뿐입니다.

명확하지 않을 수 있지만 ExtractVariables는 이름이 변수 프리픽스 (geocoderesponse)와 정책에 지정된 실제 변수 이름으로 구성된 두 변수를 생성한다는 점을 확인하는 것이 중요합니다. 이러한 변수는 API 프록시에 저장되며 프록시 흐름 내의 다른 정책에서 사용할 수 있습니다. 변수는 다음과 같습니다.

  • geocoderesponse.latitude
  • geocoderesponse.longitude

이제 대부분의 작업이 완료되었습니다. 요청을 구성하고 백엔드 API를 호출하며 반환된 JSON 데이터를 파싱하는 세 가지 정책의 복합을 만들었습니다. 마지막 단계에서는 흐름의 이 부분에서 가져온 데이터를 다른 AssignMessage 정책에 제공하고 두 번째 백드 API (Google Elevation API)를 호출하며 매시업된 데이터를 앱 개발자에게 반환합니다.

AssignMessage로 두 번째 요청 생성

다음 AssignMessage 정책은 저장한 첫 번째 백엔드 (Google Geocoding)에서 반환된 변수를 사용하고 이를 두 번째 API (Google Elevation)로 전송되는 요청에 연결합니다. 앞서 언급한 것처럼 이러한 변수는 geocoderesponse.latitude 및 geocoderesponse.longitude입니다.

샘플 다운로드에서 파일 doc-samples/policy-mashup-cookbook/apiproxy/policies/AssignElevationParameters.xml에서 이 XML을 찾을 수 있습니다.

<AssignMessage name="AssignElevationParameters">
<Remove>
    <QueryParams>
      <QueryParam name="country"/>
      <QueryParam name="postalcode"/>
    </QueryParams>
  </Remove>
  <Set>
    <QueryParams>
      <QueryParam name="locations">{geocoderesponse.latitude},{geocoderesponse.longitude}</QueryParam>
      <QueryParam name="sensor">false</QueryParam>
    </QueryParams>
  </Set>
</AssignMessage>

Google Elevation API를 검사하면 두 개의 쿼리 매개변수를 사용한다는 것을 알 수 있습니다. 첫 번째는 locations라고 하며 값은 위도와 경도 (쉼표로 구분된 값)입니다. 다른 매개변수는 sensor이며 필수이고 true 또는 false여야 합니다. 이 시점에서 가장 중요한 점은 여기에서 만드는 요청 메시지에 ServiceCallout이 필요하지 않다는 것입니다. 이 시점에서는 ServiceCallout에서 두 번째 API를 호출할 필요가 없습니다. 프록시의 TargetEndpoint에서 백엔드 API를 호출할 수 있기 때문입니다. 생각해 보면 Google Elevations API를 호출하는 데 필요한 모든 데이터가 있습니다. 이 단계에서 생성된 요청 메시지에는 ServiceCallout이 필요하지 않습니다. 기본 요청 파이프라인에 대해 생성된 요청이므로 이 API 프록시에 구성된 RouteRule에 따라 ProxyEndpoint에서 TargetEndpoint로 전달되기만 하면 됩니다. TargetEndpoint는 Remote API와의 연결을 관리합니다. Elevation API의 URL은 TargetEndpoint의 HTTPConnection에 정의되어 있습니다. 자세한 내용은 Elevation API 문서를 참조하세요. 이전에 저장한 QueryParams인 countrypostalcode는 더 이상 필요하지 않으므로 여기에서 삭제합니다.

잠시 멈춤: 흐름으로 돌아가기

이 시점에서 다른 ServiceCallout 정책을 만들지 않는 이유가 궁금할 수 있습니다. 결국 다른 메시지를 만들었습니다. 이 메시지는 대상인 Google Elevation API로 어떻게 전송되나요? 답은 흐름의 <RouteRule> 요소에 있습니다. <RouteRule> 흐름의 <Request> 부분이 실행된 후 남은 요청 메시지를 처리하는 방법을 지정합니다. 이 <RouteRule>에서 지정한 TargetEndpoint는 API 프록시가 메시지를 http://maps.googleapis.com/maps/api/elevation/xml로 전달하도록 지시합니다.

샘플 API 프록시를 다운로드한 경우 파일에서 TargetProxy XML을 찾을 수 있습니다. doc-samples/policy-mashup-cookbook/apiproxy/targets/default.xml.

<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <!-- This is where we define the target. For this sample we just use a simple URL. -->
    <URL>http://maps.googleapis.com/maps/api/elevation/xml</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

이제 Google Elevation API의 응답을 처리하기만 하면 됩니다.

응답을 XML에서 JSON으로 변환

이 예시에서는 Google Elevation API의 응답이 XML로 반환됩니다. '추가 점수'를 위해 복합에 정책을 하나 더 추가하여 응답을 XML에서 JSON으로 변환해 보겠습니다.

이 예시에서는 JavaScript 코드가 포함된 리소스 파일 이 있는 GenerateResponse라는 JavaScript 정책을 사용하여 변환을 수행합니다. 다음은 GenerateResponse 정책 정의입니다.

<Javascript name="GenerateResponse" timeout="10000">
  <ResourceURL>jsc://GenerateResponse.js</ResourceURL>
</Javascript>

GenerateResponse.js 리소스 파일에는 변환을 수행하는 데 사용되는 변환이 포함되어 있습니다. 이 코드는 파일 doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js에서 확인할 수 있습니다.

Apigee는 XML을 JSON으로 변환하는 기본 제공 정책인 XMLToJSON도 제공합니다. 아래에 표시된 xmltojson 정책을 대신 사용하도록 ProxyEndpoint를 수정할 수 있습니다.

<XMLToJSON name="xmltojson">
  <Options>
  </Options>
  <OutputVariable>response</OutputVariable>
  <Source>response</Source>
</XMLToJSON>

예시 테스트

아직 다운로드, 배포, 실행하지 않은 경우 Apigee Edge 샘플 저장소 GitHub의 doc-samples folder에서 찾을 수 있는 policy-mashup-cookbook 샘플을 다운로드, 배포, 실행해 보세요. policy-mashup-cookbook 폴더의 README 파일에 있는 안내를 따르세요. 또는 샘플 API 프록시 사용 의 간단한 안내를 따르세요.

요약하자면 복합 API를 다음과 같이 호출할 수 있습니다. {myorg}를 조직 이름으로 바꿉니다.

$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"

응답에는 앱 최종 사용자가 제공한 우편번호의 중심에 대한 지오코딩된 위치와 해당 지오코딩된 위치의 고도가 결합되어 있습니다. 데이터는 두 개의 백엔드 API에서 가져오고 API 프록시에 연결된 정책으로 매시업되었으며 단일 응답으로 클라이언트에 반환되었습니다.

{  
   "country":"us",
   "postalcode":"08008",
   "elevation":{  
      "meters":0.5045232,
      "feet":1.6552599030345978
   },
   "location":{  
      "latitude":39.75007129999999,
      "longitude":-74.1357407
   }
}

요약

이 설명서 주제에서는 정책 구성 패턴을 사용하여 여러 백엔드 소스의 데이터를 매시업 하는 방법을 설명했습니다. 정책 구성은 API 프록시 개발에서 API에 창의적인 기능을 추가하기 위해 사용되는 일반적인 패턴입니다.