정책 구성 사용

현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동
정보

이 주제에서는 정책 구성을 사용하여 매시업을 만드는 방법을 알아봅니다. 정책 구성은 정책을 사용하여 여러 백엔드 대상의 결과를 단일 응답으로 결합할 수 있는 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가 호출되는 방법을 지정하는 <BasePath>를 포함해 앱이 이 API 프록시에 연결되는 방법에 대한 세부정보를 지정합니다.
  • <RouteRule> - 이 요소는 인바운드 요청 메시지가 처리된 직후에 일어나는 일을 지정합니다. 이 경우 TargetEndpoint가 호출됩니다. 이 중요한 단계에 대해서는 이 주제의 뒷부분에서 자세히 설명합니다.

정책 만들기

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

첫 번째AssignMessage 정책 만들기

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

먼저 정책 코드에 대해 자세히 알아보고 코드 요소를 자세히 설명하겠습니다. 샘플 다운로드의 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라는 이름이 지정된 변수를 만듭니다. 이 변수는 Service콜 정책을 통해 백엔드로 전송될 요청 객체를 캡슐화합니다.
  • <QueryParams> - 백엔드 API 호출에 필요한 쿼리 매개변수를 설정합니다. 이 경우 Geocoding API는 우편번호와 국가 ID로 표현되는 위치를 알아야 합니다. 앱 사용자가 이 정보를 제공하면 Google은 여기에서 정보를 추출합니다. sensor 매개변수는 API에 필요하며 true 또는 false입니다. 여기서는 이를 false로 하드코딩합니다.
  • <Verb> - 이 경우 API에 간단한 GET 요청을 합니다.
  • <AssignVariable> - 이 변수는 API에 전달되는 값을 저장합니다. 이 예시에서 변수에는 나중에 클라이언트에 반환되는 응답에서 액세스됩니다.

ServiceCall을 사용하여 요청 보내기

정책 구성 순서의 다음 단계는 ServiceCallout 정책을 만드는 것입니다. 아래에 나열된 ServiceCall 정책은 이전AssignMessage 정책에서 만든 요청 객체를 Google 지오코딩 서비스에 전송하고 결과를 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 변수> -AssignMessage 정책에서 생성된 변수입니다. 백엔드 API로 가는 요청을 캡슐화합니다.
  • <Response> - 이 요소는 응답이 저장되는 변수의 이름을 지정합니다. 보시다시피 나중에 ExtractVariables 정책을 통해 이 변수에 액세스합니다.
  • <HTTPTargetConnection> - 백엔드 API의 대상 URL을 지정합니다. 여기서는 API가 JSON 응답을 반환하도록 지정합니다.

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

ExtractVariables를 사용하여 응답 파싱

ExtractVariables 정책은 Service콜 정책에서 얻은 응답 메시지에서 콘텐츠를 파싱하는 간단한 메커니즘을 제공합니다. 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> - ServiceCall 정책에서 만든 응답 변수를 지정합니다. 이 정책이 데이터를 추출하는 변수입니다.
  • <VariablePrefix> - 변수 접두사는 이 정책에 생성된 다른 변수의 네임스페이스를 지정합니다. 프리픽스는 Edge의 사전 정의된 변수에 의해 정의된 예약된 이름을 제외하고 어떤 이름이든 될 수 있습니다.
  • <JSONPayload> - 이 요소는 관심 있는 응답 데이터를 검색하여 이름이 지정된 변수에 넣습니다. 실제로 Geocoding API는 위도와 경도보다 훨씬 더 많은 정보를 반환합니다. 하지만 이 샘플에 필요한 유일한 값입니다. API 문서에서 Geocoding API에서 반환된 JSON의 전체 렌더링을 확인할 수 있습니다. delta.location.lat 및 geometry.location.lng 값은 반환된 JSON 객체에 있는 다수의 필드 중 2개에 불과합니다.

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

  • geocoderesponse.latitude
  • geocoderesponse.longitude

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

할당 메시지를 사용하여 두 번째 요청 생성

다음AssignMessage 정책은 저장한 첫 번째 백엔드 (Google 지오코딩)에서 반환된 변수를 사용하여 두 번째 API (Google Elevation)로 전송되는 요청에 연결합니다. 앞에서 설명한 것처럼 이러한 변수는 Geocodingresponse.해도, Geocodingresponse.경도입니다.

샘플 다운로드의 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여야 합니다. 이 시점에서 가장 중요한 점은 여기서 만드는 요청 메시지에 Service콜이 필요 없다는 것입니다. 프록시의 TargetEndpoint에서 백엔드 API를 호출할 수 있기 때문에 지금은 Service콜에서 두 번째 API를 호출할 필요가 없습니다. Google Elevations API를 호출하는 데 필요한 모든 데이터가 갖춰져 있습니다. 이 단계에서 생성된 요청 메시지에는 기본 요청 파이프라인에 대해 생성되는 요청으로 Service콜이 필요하지 않습니다. 따라서 간단하게 ProxyEndpoint에서 이 API 프록시에 대해 구성된 RouteRule에 따라 TargetEndpoint로 전달됩니다. TargetEndpoint는 원격 API를 사용하여 연결을 관리합니다. 고도 API의 URL은 TargetEndpoint의 HTTPConnection에서 정의된다는 점을 떠올려 보세요. Elevation API 문서를 참고하세요. 이전에 저장한 QueryParams(countrypostalcode)가 더 이상 필요하지 않으므로 여기에서 삭제합니다.

짧은 일시중지: 흐름으로 돌아가기

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

샘플 API 프록시를 다운로드한 경우 doc-samples/policy-mashup-cookbook/apiproxy/targets/default.xml 파일에서 TargetProxy 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으로 변환하기 위해 구성 요소에 정책을 하나 더 추가해 보겠습니다.

이 예시에서는 자바스크립트 코드가 포함된 리소스 파일과 함께 GenerateResponse라는 자바스크립트 정책을 사용하여 변환을 수행합니다. 아래에는 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 폴더에서 찾을 수 있는 policy-mashup-cookbook 샘플을 다운로드, 배포, 실행해 보세요. policy-mashup-cookbook 폴더에 있는 README 파일의 안내를 따르기만 하면 됩니다. 또는 샘플 API 프록시 사용의 간단한 안내를 따르세요.

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

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

응답에는 앱 최종 사용자가 제공하는 우편번호 중심의 지오코딩된 위치와 지오코딩된 위치의 고도가 포함됩니다. 2개의 백엔드 API에서 데이터를 가져와 API 프록시에 연결된 정책과 매시업한 후 단일 응답으로 클라이언트에 반환했습니다.

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

요약

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