Java 콜아웃을 만드는 방법

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

자바 콜아웃이란 무엇인가요?

Apigee Edge는 보안, 데이터 변환, 트래픽 관리 등 일반적인 API 관리 요구사항을 해결하는 다양한 정책을 제공합니다.

하지만 표준 정책에 구현되지 않은 커스텀 동작이 API에 필요한 경우가 있습니다. 이러한 경우 Apigee는 맞춤설정된 API 동작을 스크립트화하거나 코딩할 수 있도록 하는 여러 옵션을 제공합니다. 한 가지 방법은 자바에서 원하는 동작을 구현하는 것입니다.

지원되는 자바 버전은 지원되는 소프트웨어 및 지원되는 버전을 참조하세요.

프록시에서 자바 코드를 사용하려면 어떻게 해야 하나요?

자바 콜아웃 정책을 사용하면 실행 중인 프록시 흐름 내에서 자바 코드를 호출할 수 있습니다. 자바 코드는 코드가 실행 중인 프록시와 상호작용할 수 있도록 특정한 Edge 관련 자바 인터페이스를 구현해야 합니다. 예를 들어 자바 메서드는 프록시의 현재 흐름 컨텍스트 내에서 헤더, 쿼리 매개변수, 흐름 변수, 기타 항목을 가져오고 설정하기 위해 존재합니다.

자바 콜아웃은 언제 사용해야 하나요?

자바 콜아웃이 유용한 상황과 다른 접근 방식을 고려해야 하는 상황을 살펴보겠습니다.

첫째, 다른 접근 방식 고려

자바 콜아웃을 사용하기 전에 대신 사용할 수 있는 다른 접근 방식이 있다는 사실을 참고하세요. 예를 들면 다음과 같습니다.

  • 원격 서비스에 대한 HTTP API 호출과 같은 가벼운 작업의 경우 ServiceCallout 정책을 사용하는 것이 좋습니다. 서비스 콜아웃 정책을 참조하세요.
  • HTTP 헤더, 매개변수, 메시지 콘텐츠 수정 또는 추출과 같이 메시지 콘텐츠와 비교적 간단한 상호작용을 원할 경우 자바스크립트 또는 Python 언어를 사용할 수 있습니다.

자바 코드로 수행할 수 있는 작업

자바 콜아웃은 다음과 같은 기본 작업을 지원합니다.

  • 요청 또는 응답 메시지 검사 또는 조작
  • 흐름 변수를 가져오고 설정합니다. Java 메서드를 사용하여 Edge 흐름 변수에 액세스할 수 있습니다. 키 값 맵(KVM) 정보에 액세스하려면 KVM 정책을 사용하고 KVM 값을 흐름 변수에 할당한 다음 자바 콜아웃 내에서 흐름 변수에 액세스할 수 있습니다.
  • 외부 서비스 호출
  • 오류 발생
  • 오류 메시지 및 상태 코드 조작

자바 코드로 수행할 수 없는 작업

대부분의 시스템 호출은 허용되지 않습니다. 다음 작업은 수행할 수 없습니다.

  • 내부 파일 시스템 읽기 또는 쓰기. 즉, 자바 패키지를 사용하여 내부 파일 시스템에 대한 읽기/쓰기 작업을 수행할 수 없습니다. 하지만 외부 원격 호출을 실행할 수는 있습니다.
  • 머신의 현재 프로세스, 프로세스 목록 또는 CPU/메모리 사용률에 대한 정보를 가져오기
  • `expressions-1.0.0.jar` 및 `message-flow-1.0.0.jar`의 소스 코드에 액세스하기

이러한 호출의 일부는 작동할 수 있지만 지원되지 않으며 언제든지 사용 중지될 수 있습니다. 코드에서 이러한 호출을 실행해서는 안 됩니다.

Apigee Edge에 포함된 자바 라이브러리를 사용하거나 의존하지 마세요. 이러한 라이브러리는 Edge 제품 기능 전용이며 각 버전마다 라이브러리가 제공된다는 보장은 없습니다. 이러한 라이브러리를 사용하는 경우 비프로덕션 데모에서만 사용하세요.

Hello 자바 콜아웃

기본적인 hello world 자바 콜아웃 예시를 살펴보겠습니다. 이 예시에서는 'hello world' 응답을 반환하는 자바 콜아웃이 포함된 간단한 프록시를 만듭니다. 프록시는 다음 두 가지 응답 중 하나를 반환할 수 있습니다.

  • 'name' 값을 'username' 헤더와 함께 전달하는 경우 프록시는 다음을 반환합니다.

    Hello, <name>!
    
  • 헤더를 생략하면 프록시가 다음을 반환합니다.

    "Hello, Guest!"
    

시작 프로젝트 다운로드

편의를 위해 GitHub의 Apigee api-platform-samples 저장소에 기본 프로젝트가 준비되어 있습니다.

  1. api-platform-samples를 시스템에 다운로드하거나 클론합니다.
  2. 원하는 터미널 또는 코드 편집기에서 api-platform-samples/doc-samples/java-hello 프로젝트로 이동합니다.

자바 코드 작성

  1. 자바 소스 파일 java-hello/callout/src/main/java/HelloJava.java를 엽니다. 이 파일은 구현할 기본 자바 클래스의 골조 버전입니다. Edge 자바 콜아웃 코드에 가져온 패키지가 필요합니다. 이 클래스는 프록시 실행 컨텍스트에 액세스할 수 있도록 하는 메서드를 제공합니다. 잠시 후 이 코드를 컴파일 및 배포하는 단계를 살펴보겠습니다.
    package com.apigeesample;
    
    import com.apigee.flow.execution.ExecutionContext;
    import com.apigee.flow.execution.ExecutionResult;
    import com.apigee.flow.execution.spi.Execution;
    import com.apigee.flow.message.MessageContext;
    
    
    public class HelloJava implements Execution {
    
            public ExecutionResult execute(MessageContext messageContext, ExecutionContext executionContext) {
                    
                    try {
    
                            // Your code here.
                
                return ExecutionResult.SUCCESS;
    
                    } catch (Exception e) {
                            return ExecutionResult.ABORT;
                    }
            }
    
    }
    
  2. 주석 처리된 // Your code here 줄을 다음 코드로 바꿉니다.

    String name = messageContext.getMessage().getHeader("username");
    
    if (name != null && name.length()>0) {
            messageContext.getMessage().setContent("Hello, " + name + "!");
            messageContext.getMessage().removeHeader("username");
    } else {
            messageContext.getMessage().setContent("Hello, Guest!");
    }
    
  3. 파일을 저장합니다.


Maven으로 코드 컴파일

Maven로 컴파일할 수 있도록 프로젝트가 설정되었습니다. javac를 사용하려면 Maven 예시 다음에 예시를 포함하세요.

  1. Maven이 설치되어 있는지 확인합니다.

    mvn -version
    
  2. java-hello/buildsetup.sh 스크립트를 실행합니다. 이 스크립트는 로컬 Maven 저장소에 필요한 JAR 종속 항목을 설치합니다.
  3. cd 명령어로 java-hello/callout 디렉터리로 이동합니다.
  4. Maven을 실행합니다.

    mvn clean package
    
  5. 원하는 경우 JAR 파일 edge-custom-policy-java-hello.jarjava-hello/apiproxy/resources/java에 복사되었는지 확인합니다. 프록시로 배포하려는 JAR 파일에 필요한 위치입니다.

javac로 컴파일(선택사항)

이전 섹션에서는 Maven 명령어로 필수 자바 JAR 파일을 자동으로 생성합니다. 또는 javac을 사용하여 코드를 컴파일하려면 java-hello 디렉터리에서 다음과 유사한 작업을 수행할 수 있습니다. 필수 JAR 파일은 java-hello/lib 디렉터리에 제공됩니다.

  1. cd 명령어로 api-platform-samples/doc-samples/java-hello로 이동합니다.
  2. 경로에 javac가 있는지 확인합니다.

    javac -version
    
  3. 다음 javac 명령어를 실행합니다.

    javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/HelloJava.java
    
    그러면 com/apigeesample/HelloJava.class가 생성됩니다.
  4. apiproxy/resources/java 디렉터리에 컴파일된 클래스가 포함된 JAR 파일을 만듭니다. 프록시로 배포하려는 JAR 파일에 필요한 위치입니다. 이렇게 하려면 java-hello 디렉터리에서 다음 명령어를 실행하면 됩니다. 끝의 마침표가 있음을 유의하세요.

    jar cvf apiproxy/resources/java/edge-custom-policy-java-hello.jar -C com .
    

프록시 배포 및 호출

배포 스크립트는 ./java-hello 디렉터리에서 제공됩니다. 하지만 실행하기 전에 빠른 설정을 수행해야 합니다.

  1. cd 명령어로 api-platform-samples/doc-samples/java-hello로 이동합니다.
  2. 아직 수정하지 않았다면 ../../setup/setenv.sh 파일을 열고 Apigee 계정 정보(사용자 이름(계정과 연결된 이메일 주소), 조직 이름, API 관리 호출에 사용하는 도메인)가 표시된 대로 수정합니다. 예를 들어 Edge 클라우드의 경우 도메인은 https://api.enterprise.apigee.com이지만 Edge Private Cloud를 사용하는 경우 도메인이 다를 수 있습니다.
  3. setenv.sh 파일을 저장합니다.
  4. 배포 스크립트를 실행합니다.

    ./deploy.sh
    
  5. 배포가 성공하면 호출 스크립트를 실행합니다.

    ./invoke.sh
    

    호출 스크립트는 다음과 같은 cURL 명령어를 호출합니다.

    curl  http://$org-$env.$api_domain/java-hello -H "username:Will"
    

    그러면 'Hello, Will!'이 반환됩니다.

    invoke.sh 스크립트를 수정하여 이름을 변경할 수 있습니다. 또는 cURL 호출을 변경하여 헤더를 삭제하는 경우 명령어가 'Hello,굴'을 반환합니다.

프록시 정보

이 프록시에서 사용되는 정책을 간략하게 살펴보겠습니다. 정책이 프록시 흐름에서 어디에 있고 그 이유는 무엇인지 유심히 살펴보세요.

메시지 할당 정책

메시지 할당 정책은 ProxyEndpoint 요청 흐름에 연결됩니다. 요청에서 사용자 이름 헤더를 복사하여 응답에 할당합니다. 이 작업을 사용하면 응답 흐름에 연결된 자바 콜아웃 정책을 사용해 사용자 이름 헤더에 액세스하고 이 헤더의 값을 사용해 커스텀 응답 본문을 빌드할 수 있습니다.

<AssignMessage async="false" continueOnError="false" enabled="true" name="CopyHeader">     
    <DisplayName>CopyHeader</DisplayName>     
    <Copy source="request">         
        <Headers>             
          <Header name="username"/>         
        </Headers>     
    </Copy>     
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>     
    <AssignTo createNew="false" transport="http" type="response"/> 
</AssignMessage>

자바 콜아웃 정책

자바 콜아웃 정책은 응답 흐름에 연결됩니다. 커스텀 자바 코드가 응답 헤더 및 메시지를 변경하기 때문입니다. 정책의 ClassName 요소는 정책에서 실행되는 기본 클래스를 지정합니다. ResourceURL 요소는 프록시의 resources/java 디렉터리에 빌드되어 추가된 JAR 파일의 이름입니다.

<JavaCallout name="hello-java">         
    <ClassName>com.apigeesample.HelloJava</ClassName>         
    <ResourceURL>java://edge-custom-policy-java-hello.jar</ResourceURL> 
</JavaCallout>

자바 콜아웃에 관해 알아야 할 사항

자바 콜아웃을 구현할 때 유의해야 할 중요한 사항은 다음과 같습니다.

  • com.apigee.flow.executioncom.apigee.flow.message 패키지에서 클래스를 가져오기합니다. 이러한 패키지는 패키징되어 배포된 JAR 파일에 포함되어야 합니다. 관리 UI 프록시 편집기를 통해 자바 JAR을 업로드하거나 로컬에서 개발하는 API 프록시의 /resources/java 디렉터리에 포함할 수 있습니다.
  • Execution 인터페이스를 구현합니다. API 프록시 내에서 실행되는 모든 자바 코드는 실행을 구현해야 합니다.
  • 자바 콜아웃 정책에는 실제 코드가 없습니다. 대신 자바 콜아웃 정책은 자바 '리소스'를 참조하므로 JAR로 패키징해야 합니다.
  • 피해야 할 패키지 이름: 자바 콜아웃에 io.apigee 또는 com.apigee를 패키지 이름으로 사용하면 안 됩니다. 이는 다른 Apigee 모듈에서 예약 및 사용됩니다.
  • 자바 콜아웃이 독립 JAR 파일로 패키징된 타사 라이브러리를 추가로 사용하는 경우 이 JAR 파일을 /resources/java 디렉터리에 배치하여 런타임에 올바르게 로드되게 하세요.
  • JAR이 여러 개인 경우 단순히 추가 리소스로 추가하면 됩니다. 추가 JAR 파일을 참조하도록 정책 구성을 수정할 필요는 없습니다. /resources/java 안에 넣기만 하면 됩니다.
  • 자바 JAR 업로드에 대한 상세 내용은 리소스 파일을 참조하세요.